# Macro: GET_ATTRDEF_LIST/GET_TYPEDEF_LIST Dialectを定義するときに `initialize()` を定義して、その中で `addAttributes` や `addTypes` にTemplate parameterとして、Attributes/Typesを渡してあげる必要がある。 ``` void MyDialect::initialize() { /// Add the defined attributes to the dialect. addAttributes< #define GET_ATTRDEF_LIST #include "MyDialect/Attributes.cpp.inc" >(); /// Add the defined types to the dialect. addTypes< #define GET_TYPEDEF_LIST #include "MyDialect/Types.cpp.inc" >(); } ``` この時、Attributes/TypesをODSで定義している場合には、tblgenによって生成された `*.cpp.inc` をincludeする形で書くことができる。この書き方をする際には、`GET_ATTRDEF_LIST` や `GET_TYPEDEF_LIST` といったマクロを書いてあげる必要があり、このマクロを書かないとマクロ展開がされず、`addAttributes/addTypes` にAttributes/Typesのリストが与えられない。 `MyDialect/Types.cpp.inc` には実際にこのようなコードが生成されている: ``` #ifdef GET_TYPEDEF_LIST #undef GET_TYPEDEF_LIST ::mlir::BFloat16Type, ::mlir::ComplexType, ::mlir::Float8E4M3B11FNUZType, ::mlir::Float8E4M3FNType, ::mlir::Float8E4M3FNUZType, ::mlir::Float8E5M2Type, ::mlir::Float8E5M2FNUZType, ::mlir::Float16Type, ::mlir::Float32Type, ::mlir::Float64Type, ::mlir::Float80Type, ::mlir::Float128Type, ::mlir::FloatTF32Type, ::mlir::FunctionType, ::mlir::IndexType, ::mlir::IntegerType, ::mlir::MemRefType, ::mlir::NoneType, ::mlir::OpaqueType, ::mlir::RankedTensorType, #endif // GET_TYPEDEF_LIST ``` `initialize()` の中では `#include GET_TYPEDEF_LIST` のマクロが空で定義されており、`MyDialect/Types.cpp.inc` ではこのマクロが定義されているかどうかを `#ifndef` で確認している。定義されていることが確認されると、`Types.cpp.inc` に上記のTypeが列挙されたコードがマクロ展開され、 `initialize()` での `#include "MyDialect/Types.cpp.inc"` で列挙されたTypeが展開されて `addTypes<::mlir::BFloat16Type, ..>()` という形になってTypeが登録される。 `initialize()` の中で `#define GET_TYPEDEF_LIST` が定義されていない場合は、 `Types.cpp.inc` ではマクロ展開されないため、 `addTypes<>()` のテンプレートパラメータには何も渡されずにTypeの登録が行われないという動きになる。 --- ## Version - commit: [dfdfd306cfaf54fbc43e2d5eb36489dac3eb9976](https://github.com/llvm/llvm-project/tree/dfdfd306cfaf54fbc43e2d5eb36489dac3eb9976)