ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

仓颉 LLVM 编译器全景解析:一文看懂华为 Cangjie 如何构建国产语言编译后端

仓颉 LLVM 编译器全景解析:一文看懂华为 Cangjie 如何构建国产语言编译后端 仓颉 LLVM 编译器全景解析一文看懂华为 Cangjie 如何构建国产语言编译后端【免费下载链接】llvm-projectLLVM 项目是一个模块化、可复用的编译器及工具链技术的集合。此fork用于添加仓颉编译器的功能并支持仓颉编译器项目。项目地址: https://gitcode.com/Cangjie/llvm-project本文带你一文看懂 Cangjie/llvm-project——这是华为仓颉语言官方维护的 LLVM 编译器基础设施 Fork它在上游 LLVM 工具链的基础上深度适配了仓颉Cangjie语言为国产编程语言提供符号解析、程序调试、线程检测等完整的编译后端与工具链支撑。一、仓库全景一个 Fork 装下了整条编译工具链llvm-project并不是单一编译器而是模块化、可复用的编译器及工具链技术集合。本仓库在完整保留上游各子项目的同时注入了仓颉特有的适配层子项目目录在仓颉工具链中的角色LLVM 核心llvm/中间表示IR、优化器与目标代码后端仓颉符号解析在此落地Clang 前端clang/C/C 等类 C 语言前端承担与仓颉编译产物的互操作LLDB 调试器lldb/演进出仓颉命令行调试器 cjdb是本次 Fork 的重心之一compiler-rtcompiler-rt/运行时库包含仓颉版 ThreadSanitizer 线程检测LLD 链接器lld/ELF/COFF 等格式的快速链接器libc / libcxxabilibcxx/C 标准库与异常/ABI 支持BOLTbolt/基于真实运行画像的二进制重优化器MLIR / Flang / Pollymlir/多语言 IR 基础设施、Fortran 前端与循环优化构成更广义的多语言编译生态项目总览可见 README.md各子项目均有独立的CMakeLists.txt参与统一构建。二、编译后端核心从 IR 到机器指令的流水线对新手来说理解编译后端只需抓住一条主线高级语言 → LLVM IR → 通用机器指令gMIR→ 目标机器指令MIR→ 汇编/机器码。下图展示了 LLVM 全局指令选择GlobalISel流水线它正是仓颉编译产物走向目标硬件的核心通道这条流水线的价值在于前端无论 C、C 还是仓颉只负责生成与硬件无关的 IR优化与指令选择全部交给统一的 LLVM 核心。对仓颉而言这意味着它无需从零造轮子而是直接复用了 LLVM 二十余年打磨的优化器与多架构后端能力。三、仓颉是如何长进LLVM 的三大适配点这个 Fork 最值得关注的是三处为仓颉语言定制的修改1️⃣ 仓颉符号解析Demangle注入 LLVM 核心LLVM 在打印符号名时需要按语言的命名规则还原demangle可读名字。本仓库将libcangjie-demangle.a静态库直接链入LLVMCore与LLVMAnalysis让所有 LLVM 工具天然认识仓颉的符号编码。相关逻辑集中在 llvm/lib/IR/CMakeLists.txt 与 llvm/lib/Analysis/CMakeLists.txt通过CANGJIE_DEMANGLE_DIR变量注入 demangle 库。2️⃣ cjdb基于 LLDB 的仓颉程序调试器lldb/README_zh.md 给出了 cjdb 调试工具的完整说明它基于 llvm15.0.4 适配演进为仓颉开发者提供断点、单步、变量查看等调试能力。架构图中可以看到表达式解析层并列了 Clang, Cangjie 两套解析器。核心插件源码位于 lldb/source/Plugins/ExpressionParser/Cangjie/包括 CangjieExpressionParser.cpp、CangjieUserExpression.cpp 等文件针对仓颉线程模型仓库还新增了 CJThread.h、CJRegisterContext.h 等目标层组件实现与 ArkTS 的混合调试MixedDebugger。3️⃣ 仓颉版 ThreadSanitizer 线程检测数据竞争检测方面compiler-rt/lib/tsan/cangjie/ 下新增了 tsan_cangjie.cpp让 TSan 运行时能够识别仓颉的线程原语把上游的内存/线程安全检测能力延伸到仓颉程序上。四、周边工具链静态分析、链接与二进制优化仓颉工具链不止能编译上游的配套能力也一并可用静态分析Clang Static Analyzer 可对代码做路径敏感缺陷检测HTML 报告效果如下快速链接lld/ELF/ 提供 Linux 平台常用的 ELF 链接器显著缩短大工程的链接耗时二进制重优化bolt/ 可基于程序真实运行画像对已编译二进制做布局优化配合 bolt/docs/Heatmaps.md 的画像文档使用调试信息LLVM 对 DWARF 扩展的详尽文档如 llvm/docs/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack/也说明本仓库完整保留了上游调试信息生态。五、如何获取并构建这套工具链获取源码只需一条命令仓库地址见上文简介此处为构建需要给出git clone https://gitcode.com/Cangjie/llvm-project随后按 README.md 指引用 CMake 配置构建cmake -S llvm -B build -G Ninja cmake --build buildcjdb 调试器的完整构建步骤含build.py脚本用法与output目录结构说明请参阅 lldb/README_zh.md支持 Ubuntu 与 macOSx86_64 / aarch64。六、小结为什么值得读这份源码国产语言 国际基础设施仓颉通过最小侵入的方式demangle 库注入、LLDB 插件、TSan 扩展融入 LLVM是站在巨人肩膀上造语言的教科书式案例新人学习路径先读 lldb/README_zh.md 建立调试器全貌再看 llvm/ 的 IR 与 Pass 文档最后对照CANGJIE_DEMANGLE_DIR、ExpressionParser/Cangjie等关键字全局搜索即可快速定位全部仓颉适配点完整生态从前端clang、flang、后端LLVM core、BOLT到运行时compiler-rt、libcxx一条国产语言可用的全链路工具链在此仓俱全。【免费下载链接】llvm-projectLLVM 项目是一个模块化、可复用的编译器及工具链技术的集合。此fork用于添加仓颉编译器的功能并支持仓颉编译器项目。项目地址: https://gitcode.com/Cangjie/llvm-project创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表