LLVM自定义后端怎么加入CMake构建

千涛吖_9488

千涛吖_9488

2026-09-29

354人浏览

原创

llvm自定义后端必须在cmake配置时通过- dllvm_targets_to_build="myarch;x86;arm"显式启用,且llvm/lib/target/myarch/cmakelists.txt中必须包含add_llvm_target(myarch myarchcodegen),同时需启用- dllvm_optimized_tablegen=on和- dllvm_enable_projects="clang"才能完整支持从c到汇编的端到端编译。

llvm自定义后端怎么加入cmake构建

LLVM自定义后端必须注册到LLVM_TARGETS_TO_BUILD才参与构建

不加这一步,CMake会直接跳过你的后端目录,连编译错误都不会报——它根本“看不见”你写的MyArchTargetMachine.cpp或MyArch.td。官方构建系统只扫描llvm/lib/Target/下被显式启用的子目录,其他一概忽略。

正确做法是在调用cmake时传入:
-DLLVM_TARGETS_TO_BUILD="MyArch;X86;ARM"(注意分号分隔,不能用空格或逗号)。

  • 如果只写MyArch,其他目标会被禁用,clang可能因缺少X86而无法生成可执行文件
  • 名字必须和你新建的目录名完全一致(大小写敏感),比如llvm/lib/Target/MyArch/ → MyArch
  • 若构建时报Unknown target 'MyArch',说明CMake没在llvm/lib/Target/里找到对应子目录,检查路径是否拼错、是否漏了CMakeLists.txt

llvm/lib/Target/MyArch/CMakeLists.txt必须调用add_llvm_target

这个文件不是可选的——哪怕只有一行,也得存在,并且必须包含add_llvm_target(MyArch MyArchCodeGen)。这是CMake识别“这是一个合法LLVM后端”的唯一入口点。

add_llvm_target的第二个参数是生成的库名,惯例为${TARGET_NAME}CodeGen,它会自动收集该目录下所有.cpp和.td文件并编译进libLLVMMyArchCodeGen.a。

  • 漏掉add_llvm_target:你的源文件不会被加入编译列表,链接时找不到MyArchTargetMachine符号
  • 拼错库名(如写成MyArchCodegen):后续clang链接时会报undefined reference to `llvm::MyArchTargetMachine::MyArchTargetMachine(...)`
  • 不要手动写add_library:LLVM的构建系统依赖add_llvm_target注入的依赖规则和TableGen处理逻辑

TableGen依赖必须显式开启LLVM_OPTIMIZED_TABLEGEN

你的MyArch.td文件要能被正确处理,CMake必须先构建出llvm-tblgen工具。默认情况下,CMake会尝试复用系统已安装的llvm-tblgen,但自定义后端几乎必然失败——因为系统版本不认识你的新指令定义。

CMake 4.3.2
CMake 4.3.2

CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。

下载

强制使用本次构建生成的llvm-tblgen:
-DLLVM_OPTIMIZED_TABLEGEN=On

  • 不加这个选项:CMake可能静默跳过.td处理,导致MyArchGenInstrInfo.inc等文件为空或缺失,编译时大量use of undeclared identifier
  • 加上后,构建过程会先编译llvm/utils/TableGen,再用它生成你的后端头文件,顺序严格不可逆
  • 搭配-DCMAKE_BUILD_TYPE=Debug时建议同时加-DLLVM_ENABLE_ASSERTIONS=On,否则TableGen阶段的断言错误会被吞掉

Clang前端要识别你的后端,得把clang加进LLVM_ENABLE_PROJECTS

如果你的目标是用clang -target myarch-unknown-elf跑通整个流程,光有后端不够——clang必须知道这个target存在,且能调用对应的TargetMachine。

启用clang并让它感知你的后端:
-DLLVM_ENABLE_PROJECTS="clang"(注意引号,Ninja生成器下无引号会解析失败)

  • 不启用clang:你只能用llc测试IR→汇编,没法从C源码开始端到端验证
  • clang子项目会读取llvm/lib/Target/MyArch/MyArchTargetMachine.h里的getTargetTriple()等接口,所以你的TargetMachine类必须导出完整符号
  • 若clang编译失败并提示no member named 'MyArch' in namespace 'llvm',大概率是MyArchTargetMachine.h没正确声明extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeMyArchTargetInfo();这类初始化函数

最常被忽略的一点:所有改动必须在cmake配置阶段完成。一旦cmake执行完毕生成了build.ninja或Makefile,再修改CMakeLists.txt或LLVM_TARGETS_TO_BUILD值都不会生效——必须删掉整个构建目录重来。这不是缓存问题,是CMake对targets的拓扑关系在configure阶段就固化了。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2183

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5810

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5106

10

C++ 跨平台开发
C++ 跨平台开发

本专题聚焦 C++ 在跨平台应用与工程构建中的实战应用,系统讲解 CMake 构建系统、跨平台编译配置、第三方库集成、调试技巧、静态与动态链接库管理等核心知识。通过实战案例(如跨平台工具开发、Linux与Windows编译兼容性项目),帮助学习者掌握 从环境配置到完整跨平台构建的开发能力。

2025.10.17

5666

15

c++  cmake用法
c++ cmake用法

本专题整合了c++ cmake用法相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.23

1451

14

C++ 编译构建系统与CMake实战
C++ 编译构建系统与CMake实战

本专题聚焦 C++ 项目的编译与构建体系,系统讲解 CMake 的核心语法、项目结构设计、库与依赖管理、跨平台构建、调试与发布配置。通过完整项目示例,帮助开发者掌握 从源码到可执行程序的工程化构建流程,提升 C++ 项目在实际开发中的可维护性与扩展性。

2025.12.13

334

18

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

0

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

0

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

200

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 入门教程
Conan 2 入门教程

共0课时 | 0人学习