Adds representation for acc routine under new operation named
acc.routine. This operation is associated with a function symbol.
It also gets its own compiler generated synthetic symbol name so
that it can be referenced from the associated function. The clauses
associated with the acc routine directive are captured in the
acc.routine op.
The linking between the func.func and its acc.routine declaration
is done through the acc.routine_info attribute. In practice, a
single acc routine is associated with a function. But the spec does
not specifically restrict this - thus the 1:N relationship between
func.func and acc.routine allowed in the dialect. Additionally, it
makes sense that multiple acc routines could be used for a single
function depending on loop context - to allow flexible parallelization.
Most acc routine clauses are supported including gang, gang(dim:),
vector, worker, seq, nohost, and bind. The only one not
supported is device_type. This is because most other clauses also
miss this and the effort to add support for it needs to be coordinated
and consistent.
nit: it may be worth verifying somewhere that the symbols are actually defined by acc.routine operations.