使用TableGen来生成匹配模式的代码和选择基于目标特定版本的TargetInstrInfo.td中的额外信息的指令,并且在XXXIselLowering.cpp编写代码来替换或者删除在SelectionDAG中不被本地支持的操作和数据类型。 5. 编写将LLVM IR转为一个GAS(GNU Assembler)格式的汇编打印器 在为目标平台版本的TargetInstr
size.td这个例子来自于LLVM TableGen编译器的自测用例集。为了保障TableGen静态库libLLVMTableGen.a以及后端工具的代码质量和功能可靠,LLVM为编写了200多个文件共计10000+行的测试用例,涵盖TableGen语言的数据类型、bang操作符、表达式、记录生成等诸多特性。这些测试用例位于目录: llvm/test/TableGen TableGen源码文件的后缀名...
td文件通过tablegen生成对应的xxx[b69][w70]Geninfo类[b71][w72],然后通过派生合入自己写的类。最后Subtarget通过指针访问之。 划重点: 1)Subtarget类是接口类。 2)td文件通过tablegen生成[b73][w74]类,然后通过派生合入写的类。 实际上是解决LLVM如何用起来这个问题的开始。觉得开源项目要想做的快,一定是要...
LLVM笔记(1) - TableGen 1. 什么是tablegen tablegen是llvm用于开发和维护编译器中公共特性的条目(e.g. 指令描述, 寄存器描述)的代码, 使之灵活的描述与构造的自动化工具. 其本质是一个parser, 将输入的td文件转化为特定的数据结构后再输出为易于阅读的cpp代码. 更多介绍可见http://llvm.org/docs/TableGen/inde...
TableGen 和 Codegen 在 LLVM 项目中扮演不同角色,协同工作。TableGen 描述目标架构属性,生成 C++ 代码,为 Codegen 提供架构描述。Codegen 则负责高级语言或中间表示转换为目标机器代码,包括指令选择、寄存器分配等。TableGen 生成代码是 Codegen 阶段的关键输入,二者在 LLVM 架构中协同工作,实现编译器...
全书分为3篇。第1篇介绍编译器基础知识,包括中间表示,重点介绍SSA、数据流分析、支配、循环等知识,此外还介绍了LLVM的后端描述语言TableGen。第二篇剖析分LLVM代码生成,其中对代码生成的每一步骤都有提及,着重介绍指令选择、指令调度、寄存器分配和编译优化。同时还以B
TableGen是LLVM后端中用于结构化描述目标机信息的DSL,类似于JSON或XML,但拥有类型系统和C++继承特性。它描述了指令编码、寄存器配置、调度和选择等后端细节,存储在.td文件中。LLVM提供了多种TableGen Backend,它们读取.td中的描述,自动生成C++代码,减轻了编译器后端开发的工作量。例如,通过在TableGen中...
LLVM(之前称为低级虚拟机)是一种非常强大的编译器基础架构框架,专门为使用您喜爱的编程语言编写的程序的编译时、链接时和运行时优化而设计。LLVM 可运行于若干个不同的平台之上,它以能够生成快速运行的代码而著称。 LLVM 框架是围绕着代码编写良好的中间表示 (IR) 而构建的。本文(由两部分组成的系列文章的第一部分...
Tablegen就是用于记录这些信息的描述性语言。经过tablegen工具批量生成C++源文件。它的好处就是减少我们描述的工作量。Tablegen主要由Class(类)和Definition(定义)组成。其中Class是用于描述构建其它记录的抽象记录,可以理解成模板。描述目标的共同特点以便批量生成记录。Definition是具体的描述实例,不包含任何未定义的变量。