EnumAttr is a pure TableGen implementation of enum attributes using AttrDef. This is meant as a drop-in replacement for StrEnumAttr, which is soon to be deprecated. StrEnumAttr is often used over IntEnumAttr because its more readable in MLIR assembly formats. However, storing and manipulating strings is not efficient. Defining StrEnumAttr can also be awkward and relies on a lot of special logic in EnumsGen, and has some hidden sharp edges.
Also, EnumAttr stores the enum directly, removing the need to convert to/from integers when calling attribute getters on ops.
Not using the surrounding < and > forces the opaque/generic syntax for the attribute, that's a bit unfortunate though.
Is there a way to get a better printing? (in particular in the declarative assembly used by operations)