如何在 td 文件中定义 llvm BitmaskEnum?

How can I define a llvm BitmaskEnum in td file?

提问人:user2645892 提问时间:11/14/2023 最后编辑:Zeitounatoruser2645892 更新时间:11/14/2023 访问量:35

问:

我想在 td 文件中将枚举类型类转换为。但是找不到 llvm 源代码中使用的任何示例。GTypeBitMaskEnum

我原来的枚举类在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;

LLVM的

评论


答:

0赞 user2645892 11/14/2023 #1

首先,我发现在 td MLIR 中使用 BitEnum 和在源文件中使用 BitMaskEnum 的方式不同。 我发现 和 在 中,所以我尝试更改以下原始代码:I32BitEnumAttrCaseI32BitEnumAttrmlir/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 的值。