# 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)