LLVM(三):Tablegen简介

来源:互联网 发布:8080端口的作用 编辑:程序博客网 时间:2024/05/22 15:45

上一篇介绍实现llvm后端需要做的一些工作,有很大一部分工作是描述目标体系结构的特征,包括指令集,寄存器等信息。Tablegen就是用于记录这些信息的描述性语言。目标体系结构目录下的*.td文件都是用tablegen语言来描述的。经过tablegen工具批量生成C++源文件,它的好处就是我们描述的是大量信息的共同点,然后由工具批量生成,减少我们描述的工作量,使用tablegen语言也十分简单灵活。

在utils/vim目录下有vi的配置文件,拷贝到vi的syntax文件夹下可以对tablegen语法高亮。

下面介绍tablegen,在官方文档中介绍得非常详细,这里只做思路上的简单介绍。具体语法请参照文档。

官方文档地址:http://llvm.org/docs/TableGenFundamentals.html


Tablegen主要由Class(类)和Definition(定义)组成。其中Class是用于描述构建其它记录的抽象记录,可以理解成模板。描述目标的共同特点以便批量生成记录。Definition是具体的描述实例,不包含任何未定义的变量。 

例如:所有算术指令就可以定义为一个arithmatic class,有指令编码等一些属性。加减法指令可以分别定义为def add、def sub,这个两个definition都可以继承于arithmatic实现。因为加减法的指令编码格式都是很相似的,在某些体系结构下可能只有opcode不同,所以可以继承于一个模板实现,这样编码相似行为相似的指令有很多,定义class来批量实现可以减少很多工作量。

 

我们先从指令描述部分看。在目标体系结构目录下XXXInstrFormat.td文件中,定义了指令的多种格式。在ARMInstrFormats.td文件中,继承Instruction类定义了指令模板。


Instruction类的实现在include/llvm/Target目录下的Target.td公共代码中,这个类详细描述了指令的属性,如果要做后端移植的话,这是需要了解的。内容比较多,在下一篇中讨论。



0 0
原创粉丝点击