SuperAPI AI 工具集

code-generation-and-backends

编程与开发

查看项目

更新于 10-16 06:49

技能介绍

用途:该技能聚焦 LLVM(及通用编译器)后端代码生成,涵盖 IR 合法化、SelectionDAG 指令选择、寄存器分配、汇编输出,以及新增目标架构所需工作,与 IR 相关技能互补。

适用场景:阅读特定目标的 llc 输出;理解 IR 类型合法化为何插入额外操作;评估将编译器移植到新架构(高层);在汇编层而非 IR 层调试错误代码。

主要流程:后端流水线依次为 IR 合法化、SelectionDAGBuilder、LegalizeTypes/LegalizeOps、指令选择(TableGen 模式匹配)、调度、寄存器分配、序言/尾声插入、AsmPrinter 输出 .s。常用命令:clang -c -emit-llvm -O2 -o foo.bc foo.c;llc -march=aarch64 -O2 foo.bc -o foo.s;llc -march=riscv64 -O2 foo.bc -o foo-rv.s。TableGen 模式将 DAG 节点映射到机器指令,.td 文件定义寄存器、调用约定与指令格式。调用约定降低对应 CC_AArch64 / CC_X86_64。目标三元组示例:clang --target=arm-none-eabi -c -O2 foo.c;llc -mtriple=thumbv7em-none-eabi foo.bc。三元组与 CPU 特性(+neon、+crc)不匹配会导致合法化失败或代码次优。

新增目标概要:在 TableGen 定义寄存器类与指令格式;实现 TargetLowering 降低钩子;AsmPrinter 与 MC 层处理重定位;内置调用约定与 ELF/COFF 目标写入。完整移植工作量大,建议复用最接近的现有后端。

常见问题:Cannot select 致命错误多为目标不支持该 IR 操作,需合法化或展开;软浮点错误源于 ABI 不匹配,设置 -mfloat-abi / triple;栈帧过大常因寄存器分配后溢出过多,可在 IR 层降低压力;llc 与 clang 结果不同多因目标参数不一致,应统一 -mtriple;TableGen 构建失败检查 .td 语法与 llvm-tblgen 报错行。

限制:资料未提供具体收费、平台支持范围或完整代码示例,相关细节暂未提供。