WIP: LLVM笔记(8) - tablegen语法介绍

之前写tablegen的介绍写到一半放弃了, 最近培训需要再拉出来看看, 顺便做个笔记.

1. 语法介绍

官方文档见[这里](http://llvm.org/docs/TableGen/LangIntro.html?highlight=tablegen), 以下是文档的翻译.

类型系统

tablegen是强类型语言, 其类型系统同时包含low-level(i.e. bit int)与high-level(i.e. dag). 以下是tablegen支持的内建类型.
bit: 布尔值, 0或1.
int: 表示32bit整型.
string: 字符串.
code: 一个代码片段, 通常以多行字符串的形式表示.
bits<n>: 长度为n的bit串, 可以对其中部分进行赋值.
list<ty>: 表示类型为ty的队列容器, ty可以为任意tablegen支持的类型.
class type: class类型.
dag: 表示一个有向图.

值与表达式

tablengen支持以下表达式.
?: 未初始化值.
0b10: bit串, 注意该位串不会被扩展或截断, 因此对类型为bits<n>的赋值要保证长度一致.
1: 十进制常量.
0x11: 十六进制常量.
"abc": 字符串常量, 可以赋值给string类型或code类型.
value: 引用一个value.
value{n}: 访问value的第n位.
value.field: 访问value的field成员.
[x, y, z]: 队列容器赋值.
{a, b}: 位串赋值, 其总长度为位串a加位串b的长度和.
还有很多表达式就不一一列出了, 读者请自行参考文档. 另外tablegen支持的内建函数表达式(i.e. foreach strconcat listconcat)也请参见文档说明.

类(class)与定义(definition)

类与定义是tablegen语言中关键组成, 它们又被称作条目(records). 一个records包含一个唯一的name, 一组value及一组超类. 对records的解释由具体的后端处理, 但records的格式与结构由tablegen检查.
类是一种抽象的records, 类为用户提供抽象架构的能力或为records构造公共属性. 类似的, multiclass提供了一组抽象的records, 对multiclass的实例化会创建一组定义.
定义是一种具体的records, 它们通过def关键字被定义.
来看个例子方便理解.
class C { bit V = 1; }
def X : C;
def Y : C {
  string Greeting = "hello";
}
以上代码片段声明了类C, 定义X与定义Y. 由于定义X与定义Y均继承自类C, 所以它们都包含成员V, 而定义Y都包含一个额外的字符串成员Greeting.

猜你喜欢

转载自www.cnblogs.com/Five100Miles/p/12484104.html