之前写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.
来源:https://www.cnblogs.com/Five100Miles/p/12484104.html