MENU

TableGen简介及使用

January 23, 2021 • 实习

TableGen简介及使用

TableGen是什么

通俗来讲,TableGen是LLVM编译器的一个工具,一种脚本语言,它被用来批量的生成c++文件。我讲它通俗地理解为文件生成器,按照他的语法来描述文件,有TableGen直接生成相应的目标代码文件,类似LaTeX。

按照官方的定义如下:

TableGen的目的是帮助人们开发和维护特定领域信息的记录。由于这些记录可能很多,因此专门设计为允许编写灵活的说明,并且可以排除这些记录的共同特征。这减少了描述中的重复次数,减少了出错的机会,并使结构域特定的信息更容易构造。

TableGen的使用

TableGen的文件后缀名为.td, 它的语法格式类似于c++类模板的语法格式。TableGen中,关键词包括def,class两个主要关键字,也有let,foreach关键字来表示逻辑。

def,class在TableGen中也扩展出了defmmulticlass,可以形象的理解为单继承和多继承。def/defmclass/multiclass的实现。

def/defmclass/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_vxunsigned_binary_v_vv_vx组成,而unsigned_binary_v_vv_vx又包含了一个NAME字段。

之中的foreach就是一个函数,遍历AllUnsignedVectorType并将里面的值赋值给NAME。

TableGen的简单实用就到此结束,下一步应该就是正式添加指令了。

Reference List

有关于TableGen的简单介绍

为 rvv-llvm 添加一个 intrinsic

Last Modified: September 8, 2021