提问人:user2645892 提问时间:11/14/2023 最后编辑:Zeitounatoruser2645892 更新时间:11/14/2023 访问量:35
如何在 td 文件中定义 llvm BitmaskEnum?
How can I define a llvm BitmaskEnum in td file?
问:
我想在 td 文件中将枚举类型类转换为。但是找不到 llvm 源代码中使用的任何示例。GType
BitMaskEnum
我原来的枚举类在td文件中定义如下:
def GA : I32EnumAttrCase<"A", 0>;
def GB : I32EnumAttrCase<"B", 1>;
def GC : I32EnumAttrCase<"C", 2>;
def GD : I32EnumAttrCase<"D", 3>;
def GE : I32EnumAttrCase<"E", 4>;
def GType : I32EnumAttr<"GType", "G type", [GA, GB, GC, GD, GE]> {
let genSpecializedAttr = 0;
let cppNamespace = "::foo::bar";
}
def GTypeAttr : Enum<X_Dialect, GType, "GType">;
然后生成如下类:
enum class GType : uint32_t {
A = 0,
B = 1,
C = 2,
D = 3,
E = 4,
};
我只在llvm src代码中的一些td文件中找到。但似乎不起作用。enableBitmaskEnumInNamespace = true;
答:
0赞
user2645892
11/14/2023
#1
首先,我发现在 td MLIR 中使用 BitEnum 和在源文件中使用 BitMaskEnum 的方式不同。
我发现 和 在 中,所以我尝试更改以下原始代码:I32BitEnumAttrCase
I32BitEnumAttr
mlir/IR/EnumAttr.td
def GA : I32BitEnumAttrCase<"A", 0>;
def GB : I32BitEnumAttrCase<"B", 1>;
def GC : I32BitEnumAttrCase<"C", 2>;
def GD : I32BitEnumAttrCase<"D", 3>;
def GE : I32BitEnumAttrCase<"E", 4>;
def GType : I32BitEnumAttr<"GType", "G type", [GA, GB, GC, GD, GE]> {
let genSpecializedAttr = 0;
let cppNamespace = "::foo::bar";
}
def GTypeAttr : Enum<X_Dialect, GType, "GType">;
生成的类没有变化,但生成了 3 个新函数:GraphGridType
GType operator|(GType lhs, GType rhs)
GType operator&(GType lhs, GType rhs)
bool bitEnumContains(GType bits, GType bit)
这 3 个函数足以测试 GType 的值。
评论