如何编写简易LLVM后端目标?需修改的最少文件及原因
新增LLVM目标的最小必要文件与修改
核心最小集(满足LLVM识别并编译目标的基础要求)
要让LLVM能识别并构建你的新目标,只需要以下几部分:
目标专属目录与核心文件
在lib/Target/下创建<TargetName>目录,里面至少包含:<TargetName>.td:TableGen元数据文件,定义目标的寄存器、指令集、寻址模式等核心信息——LLVM后端大量依赖TableGen自动生成代码,这是描述目标架构的基础。<TargetName>TargetMachine.cpp/.h:实现继承自TargetMachine的类,是LLVM与目标架构交互的入口,需定义目标的数据布局、指令集特性、目标优化级别等关键属性。<TargetName>AsmPrinter.cpp/.h:实现汇编打印机,负责将LLVM IR转换为目标架构的汇编代码(若不需要汇编输出可暂不实现,但这是生成可执行代码的必要环节)。CMakeLists.txt:目录内的构建配置,指定要编译的源文件,示例内容大致如下:add_llvm_target(<TargetName>CodeGen <TargetName>TargetMachine.cpp <TargetName>AsmPrinter.cpp ) add_subdirectory(InstPrinter) # 可选,若需要指令打印支持
构建系统的最小修改
二选一即可:- 编译LLVM时添加命令行选项:
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=<TargetName>,无需修改LLVM主目录的CMake配置,适合实验性目标。 - 编辑
llvm/CMakeLists.txt,在LLVM_ALL_TARGETS列表中加入<TargetName>,适合打算正式并入LLVM的目标。
- 编译LLVM时添加命令行选项:
为什么文档和示例的要求差异大?
- 官方文档聚焦的是能让LLVM识别这个目标的最小必要条件,只保证目标能被构建、被
llc等工具调用,不包含额外功能或集成。 - 你参考的示例是一个完整的教学后端,它不仅要实现基础目标支持,还要包含测试用例、目标特定优化Pass、调试支持、文档等,因此需要修改更多配置文件(比如测试目录的CMake、集成到LLVM测试套件等)。
快速验证步骤
- 按上述最小集创建文件和目录,编写最基础的实现(比如让TargetMachine返回默认数据布局,AsmPrinter输出空汇编框架)。
- 用
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=<TargetName>编译LLVM。 - 编译完成后运行
llc -march=<TargetName> --version,若能看到目标被列出,说明最小配置已生效。
内容的提问来源于stack exchange,提问作者Shore
相关产品推荐
相关产品推荐

