mcpField
C
code-generation-and-backends

code-generation-and-backends

github.com/mohitmishra786开发269307 次安装18 周前更新
代码仓库

关于 code-generation-and-backends

面向 Agent 的 LLVM 及编译器后端代码生成指南,涵盖从 IR 合法化、指令选择到寄存器分配和汇编输出。可用于分析目标相关输出、后端问题及新增目标移植的大致步骤。

主要功能

  1. 01LLVM 后端流程概览
  2. 02用 llc 生成目标代码
  3. 03TableGen 指令模式概念
  4. 04调用约定降低
  5. 05新增目标的高层步骤

适用场景

  1. 01追踪 IR 如何生成目标指令
  2. 02排查合法化或汇编层问题
  3. 03比较不同目标的 llc 输出
  4. 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. 添加目标架构(概要)
  1. 在 TableGen 中定义寄存器类和指令格式
  2. 实现降级钩子(TargetLowering)
  3. 为重定位实现 AsmPrinter 和 MC 层
  4. 实现内置调用约定以及 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 — 代码生成前的 IR
  • skills/compiler-internals/compiler-optimizations-deep — 寄存器分配直觉
  • skills/compilers/cross-gcc — 嵌入式三元组
  • skills/computer-architecture/abi-and-calling-conventions — 调用降级
  • skills/low-level-programming/assembly-arm — 阅读生成的汇编

评论

支持 Markdown