mcpField
L
llvm

llvm

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

关于 llvm

面向使用 LLVM 工具的 Agent,提供 IR 生成、检查、优化和降级为汇编的操作指南。还介绍诊断未触发优化的原因,并区分了编写自定义 LLVM pass 的相关技能。

主要功能

  1. 01生成文本 IR 和 bitcode
  2. 02使用 opt 运行优化 pass
  3. 03用 llc 降级为汇编
  4. 04检查 IR 指令与结构
  5. 05诊断未触发的优化

适用场景

  1. 01查看 C 函数生成的 LLVM IR
  2. 02对 IR 应用优化 pass
  3. 03排查循环未自动向量化

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill llvm

安装后在 Claude Code 中输入/llvm确认已加载。

附带文件references/ir-reference.md

详细介绍

LLVM IR 和工具链

用途

指导 Agent 以用户的身份使用 LLVM:生成和检查 IR、使用 opt 运行现有优化 Pass、使用 llc 降低为汇编,以及诊断优化未生效的原因。若要编写新的 LLVM Pass(PassPlugin、llvm-lit 测试),请改用 skills/compiler-internals/llvm-passes。

触发条件

  • “显示这个函数的 LLVM IR”
  • “如何运行 LLVM 优化 Pass?”
  • “这条 LLVM IR 指令是什么意思?”
  • “如何编写自定义 LLVM Pass?”
  • “为什么 LLVM 没有进行自动向量化?”

工作流

1. 生成 LLVM IR
# Emit textual IR (.ll)
clang -O0 -emit-llvm -S src.c -o src.ll

# Emit bitcode (.bc)
clang -O2 -emit-llvm -c src.c -o src.bc

# Disassemble bitcode to text
llvm-dis src.bc -o src.ll
2. 使用 opt 运行优化 Pass
# Apply a specific pass
opt -passes='mem2reg,instcombine,simplifycfg' src.ll -S -o out.ll

# Standard optimisation pipelines
opt -passes='default<O2>' src.ll -S -o out.ll
opt -passes='default<O3>' src.ll -S -o out.ll

# List available passes
opt --print-passes 2>&1 | less

# Print IR before and after a pass
opt -passes='instcombine' --print-before=instcombine --print-after=instcombine src.ll -S -o out.ll 2>&1 | less
3. 使用 llc 将 IR 降低为汇编
# Compile IR to object file
llc -filetype=obj src.ll -o src.o

# Compile to assembly
llc -filetype=asm -masm-syntax=intel src.ll -o src.s

# Target a specific CPU
llc -mcpu=skylake -mattr=+avx2 src.ll -o src.s

# Show available targets
llc --version
4. 检查 IR

需要理解的关键 IR 结构:

结构含义
alloca栈分配(SSA 之前;mem2reg 会将其提升到寄存器)
load/store内存访问
getelementptr(GEP)指针运算/字段访问
phiSSA φ 节点:合并来自前驱基本块的值
call/invoke函数调用(invoke 包含异常边)
icmp/fcmp整数/浮点比较
br分支(有条件或无条件)
ret返回
bitcast重新解释位(代码生成中的空操作)
ptrtoint/inttoptr指针↔整数转换(尽可能避免)
5. 关键 Pass
Pass效果
mem2reg将 alloca 提升为 SSA 寄存器
instcombine指令合并/窥孔优化
simplifycfgCFG 清理,移除死基本块
loop-vectorize自动向量化
slp-vectorize超字级并行(直线代码向量化)
inline函数内联
gvn全局值编号(公共子表达式消除)
licm循环不变量代码外提
loop-unroll循环展开
argpromotion将指针参数提升为值
sroa聚合体标量替换
6. 调试未生效的优化
# Why was a loop not vectorised?
clang -O2 -Rpass-missed=loop-vectorize -Rpass-analysis=loop-vectorize src.c

# Dump pass pipeline
clang -O2 -mllvm -debug-pass=Structure src.c -o /dev/null 2>&1 | less

# Print IR after each pass (very verbose)
opt -passes='default<O2>' -print-after-all src.ll -S 2>&1 | less
7. 实用的 llvm 工具
工具用途
llvm-dis位码 → 文本 IR
llvm-as文本 IR → 位码
llvm-link链接多个位码文件
llvm-lto独立 LTO
llvm-nm查看位码/目标文件中的符号
llvm-objdump反汇编目标文件
llvm-profdata合并/显示 PGO 配置文件
llvm-cov覆盖率报告
llvm-mca机器码分析器(吞吐量/延迟)

binutils 的对应工具请参阅 skills/binaries/binutils。

相关技能

  • 编写和测试自定义 LLVM Pass,请使用 skills/compiler-internals/llvm-passes
  • 从 AST 生成 LLVM IR,请使用 skills/compiler-internals/compiler-frontend
  • 使用 ORC JIT 执行 LLVM IR,请使用 skills/compiler-internals/jit-compilation
  • 查看源代码级 Clang 标志,请使用 skills/compilers/clang
  • 在链接时使用 LTO,请使用 skills/binaries/linkers-lto
  • 结合 llvm-mca 进行微架构分析,请使用 skills/profilers/linux-perf

评论

支持 Markdown