TableGen简介及使用
TableGen是什么
通俗来讲,TableGen是LLVM编译器的一个工具,一种脚本语言,它被用来批量的生成c++文件。我讲它通俗地理解为文件生成器,按照他的语法来描述文件,有TableGen直接生成相应的目标代码文件,类似LaTeX。
按照官方的定义如下:
TableGen的目的是帮助人们开发和维护特定领域信息的记录。由于这些记录可能很多,因此专门设计为允许编写灵活的说明,并且可以排除这些记录的共同特征。这减少了描述中的重复次数,减少了出错的机会,并使结构域特定的信息更容易构造。
TableGen的使用
TableGen的文件后缀名为.td
, 它的语法格式类似于c++类模板的语法格式。TableGen中,关键词包括def
,class
两个主要关键字,也有let
,foreach
关键字来表示逻辑。
而def
,class
在TableGen中也扩展出了defm
和multiclass
,可以形象的理解为单继承和多继承。def/defm
是class/multiclass
的实现。
def/defm
和class/multiclass
的每个条目都被统称为记录。
以[riscv_vector.td]()为例,在文件中,有vadd的指令定义如下。
defm vadd : int_binary_v_vv_vx;
在这个例子中,vadd是这条记录的名称(对象名),该记录是int_binary_v_vv_vx类的实现。
class
是td文件中抽象的记录描述,用来实现多个记录通用的部分,也可以实现一些能够析出记录信息的辅助功能,如:
multiclass int_binary_v_vv_vx : signed_binary_v_vv_vx, unsigned_binary_v_vv_vx;
multiclass unsigned_binary_v_vv_vx {
foreach I = AllUnsignedVectorType in {
defm NAME : Binary<NAME, I.Value, I.Value, I.Value, "_vv", I.Name,
I.BoolValue, [-1], [-1, 0]>;
defm NAME : Binary<NAME, I.Value, I.Value, I.ElemType.Value, "_vx",
I.Name, I.BoolValue, [-1, 1], [-1, 0, 3]>;
}
}
在这条例子中,我们可以看到类int_binary_v_vv_vx
由两个父类signed_binary_v_vv_vx
和unsigned_binary_v_vv_vx
组成,而unsigned_binary_v_vv_vx
又包含了一个NAME
字段。
之中的foreach就是一个函数,遍历AllUnsignedVectorType并将里面的值赋值给NAME。
TableGen的简单实用就到此结束,下一步应该就是正式添加指令了。
Reference List