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

问题描述 投票:0回答:1

我想将 td 文件中的枚举类型类

GType
转换为
BitMaskEnum
。但找不到 llvm 源中使用的任何示例。

我原来的枚举类在 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
1个回答
0
投票

首先,我发现在 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">;

生成的类

GraphGridType
没有变化,但是生成了3个新函数:

  • GType operator|(GType lhs, GType rhs)
  • GType operator&(GType lhs, GType rhs)
  • bool bitEnumContains(GType bits, GType bit)

这3个函数足以测试GType的值。

© www.soinside.com 2019 - 2024. All rights reserved.