关于 code-generation-and-backends
面向 Agent 的 LLVM 及编译器后端代码生成指南,涵盖从 IR 合法化、指令选择到寄存器分配和汇编输出。可用于分析目标相关输出、后端问题及新增目标移植的大致步骤。
主要功能
- 01LLVM 后端流程概览
- 02用 llc 生成目标代码
- 03TableGen 指令模式概念
- 04调用约定降低
- 05新增目标的高层步骤
适用场景
- 01追踪 IR 如何生成目标指令
- 02排查合法化或汇编层问题
- 03比较不同目标的 llc 输出
- 04规划向新架构移植编译器
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill code-generation-and-backends安装后在 Claude Code 中输入/code-generation-and-backends确认已加载。
详细介绍
代码生成与后端
用途
概述 LLVM(以及通用编译器)后端的代码生成:IR 合法化、SelectionDAG 指令选择、寄存器分配、汇编生成,以及添加新目标架构所涉及的工作——补充 IR 技能和 skills/compiler-internals/llvm-passes。
适用场景
- 阅读特定目标架构的
llc输出 - 理解 IR 类型合法化器为何插入额外操作
- 高层评估将编译器移植到新架构的工作
- 在汇编层(而非 IR)调试错误代码
工作流
1. 后端流水线(LLVM)
LLVM IR per function
├── IR legalizer (types/ops target supports)
├── SelectionDAGBuilder
├── LegalizeTypes / LegalizeOps
├── Instruction selection (pattern match TableGen)
├── Scheduling (pre-RA)
├── Register allocation
├── Prolog/epilog insertion
└── AsmPrinter → .s object
2. llc 用法
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
3. TableGen 模式(概念)
def ADD32rr : Pat<(add i32 GPR:$a, GPR:$b),
(ADD32rr GPR:$a, GPR:$b)>;
模式将 DAG 节点映射到机器指令。.td 文件定义寄存器、调用约定和指令格式。
4. 调用约定降级
ABI 规则会在 TableGen 中变为 CC_AArch64 / CC_X86_64,与 skills/computer-architecture/abi-and-calling-conventions 相关。
5. 目标三元组
clang --target=arm-none-eabi -c -O2 foo.c
llc -mtriple=thumbv7em-none-eabi foo.bc
三元组与 CPU 特性(+neon、+crc)不匹配,会导致合法化失败或生成次优代码。
6. 添加目标架构(概要)
- 在 TableGen 中定义寄存器类和指令格式
- 实现降级钩子(
TargetLowering) - 为重定位实现 AsmPrinter 和 MC 层
- 实现内置调用约定以及 ELF/COFF 目标文件写入器
完整移植工作量很大,应复用与目标架构最接近的现有后端。
7. Agent 用法
/code-generation-and-backends Trace how this IR add becomes AArch64 ADD instruction
常见问题
| 症状 | 原因 | 解决方法 |
|---|---|---|
Cannot select 致命错误 | 目标架构不支持该 IR 操作 | 合法化或展开该操作 |
| 软浮点代码错误 | ABI 不匹配 | 设置 -mfloat-abi / 三元组 |
| 栈帧过大 | 寄存器分配后发生大量溢出 | 在 IR 层降低寄存器压力 |
llc 与 clang 结果不同 | 传入的目标架构不同 | 使用相同的 -mtriple |
| TableGen 构建失败 | .td 中存在语法错误 | 查看 llvm-tblgen 报错行 |
相关技能
skills/compiler-internals/llvm-ir-and-passes— 代码生成前的 IRskills/compiler-internals/compiler-optimizations-deep— 寄存器分配直觉skills/compilers/cross-gcc— 嵌入式三元组skills/computer-architecture/abi-and-calling-conventions— 调用降级skills/low-level-programming/assembly-arm— 阅读生成的汇编
评论
支持 Markdown