| 271 | }; |
| 272 | |
| 273 | class EnumAttrEmitter : public EmitterBase { |
| 274 | public: |
| 275 | EnumAttrEmitter( |
| 276 | llvm::StringRef parent, MgbEnumAttr* attr_, raw_ostream& os_, |
| 277 | Environment& env_) |
| 278 | : EmitterBase(os_, env_), attr(attr_) { |
| 279 | unsigned int enumID; |
| 280 | if (auto alias = llvm::dyn_cast<MgbAliasAttr>(attr)) { |
| 281 | auto&& aliasBase = alias->getAliasBase(); |
| 282 | enumID = llvm::cast<MgbEnumAttr>(aliasBase).getBaseRecord()->getID(); |
| 283 | } else { |
| 284 | enumID = attr->getBaseRecord()->getID(); |
| 285 | } |
| 286 | ctx.addSubst( |
| 287 | "enumTpl", |
| 288 | attr->getEnumCombinedFlag() ? "BitCombinedEnumWrapper" : "EnumWrapper"); |
| 289 | ctx.addSubst("opClass", parent); |
| 290 | ctx.addSubst("enumClass", attr->getEnumName()); |
| 291 | firstOccur = |
| 292 | env().enumAlias |
| 293 | .emplace(enumID, std::make_pair(parent, attr->getEnumName())) |
| 294 | .second; |
| 295 | } |
| 296 | |
| 297 | Initproc emit(); |
| 298 | |
| 299 | protected: |
| 300 | void emit_trait(); |
| 301 | void emit_tpl_spl(); |
| 302 | Initproc emit_initproc(); |
| 303 | |
| 304 | MgbEnumAttr* attr; |
| 305 | bool firstOccur; |
| 306 | mlir::tblgen::FmtContext ctx; |
| 307 | }; |
| 308 | |
| 309 | Initproc EnumAttrEmitter::emit() { |
| 310 | emit_trait(); |