关于 llvm-learning
面向 LLVM、Clang 和编译器开发学习者的资源技能,按难度组织学习路径,并提供 IR、Pass、工具及分析 API 的参考与实践指引。
主要功能
- 01从入门到进阶的学习路径
- 02LLVM 与 Clang 资源索引
- 03LLVM IR 与 Pass 指引
- 04Clang AST 和 LibTooling 示例
- 05开发命令与分析 API
适用场景
- 01规划编译器开发学习路线
- 02学习 LLVM IR 并编写首个 Pass
- 03使用 LibTooling 探索 Clang AST
- 04练习编译器分析与优化项目
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gmh5225/ awesome-llvm-security --skill llvm-learning安装后在 Claude Code 中输入/llvm-learning确认已加载。
详细介绍
LLVM 学习技能
此技能提供精心整理的学习路径和资源,帮助您掌握 LLVM、Clang 和编译器开发。
学习路径
初学者路径
- 从 Kaleidoscope 开始:LLVM 官方教程,介绍如何构建一门简单的语言
- 了解 LLVM IR:学习中间表示
- 编写简单的 Pass:使用自定义 Pass 转换 IR
- 探索 Clang:了解 C/C++ 前端
中级路径
- 深入研究优化:学习内置优化 Pass
- 后端开发:面向目标平台的代码生成
- 分析框架:指针分析、数据流
- Clang 工具:LibTooling、AST 匹配器
高级路径
- MLIR:用于领域专用编译的多级 IR
- JIT 编译:ORC JIT 框架
- 安全特性:Sanitizer、CFI 实现
- 为 LLVM 做贡献:补丁、代码审查、社区参与
官方资源
文档
- LLVM 文档:https://llvm.org/docs
- Clang 文档:https://clang.llvm.org/docs
- LLVM 语言参考:完整的 IR 规范
- 程序员手册:核心 API 和用法
教程
- Kaleidoscope:https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html
- 编写 LLVM Pass:https://llvm.org/docs/WritingAnLLVMPass.html
- 构建 LLVM:https://llvm.org/docs/GettingStarted.html
社区资源
书籍和指南
- Learn LLVM 12,作者 Kai Nacke:全面的实践指南
- LLVM Techniques, Tips, and Best Practices:高级模式
- Getting Started with LLVM Core Libraries:基础概念
- LLVM Essentials:快速入门指南
视频资源
- LLVM Developer Meetings:YouTube 上的演讲录像
- LLVM Weekly:介绍最新进展的简报
- EuroLLVM/US LLVM:会议录像
GitHub 学习项目
# Highly recommended starter projects
banach-space/llvm-tutor # Comprehensive pass examples
hunterzju/llvm-tutorial # Step-by-step tutorials
jauhien/iron-kaleidoscope # Kaleidoscope in Rust
bigconvience/llvm-ir-in-action # IR examples
LLVM IR 基础
基本结构
; Module level
@global_var = global i32 42
; Function definition
define i32 @add(i32 %a, i32 %b) {
entry:
%sum = add i32 %a, %b
ret i32 %sum
}
; External declaration
declare i32 @printf(i8*, ...)
常见指令
; Arithmetic
%result = add i32 %a, %b
%result = sub i32 %a, %b
%result = mul i32 %a, %b
; Memory
%ptr = alloca i32
store i32 %value, i32* %ptr
%loaded = load i32, i32* %ptr
; Control flow
br i1 %cond, label %then, label %else
br label %next
; Function calls
%retval = call i32 @function(i32 %arg)
类型系统
; Integer types: i1, i8, i16, i32, i64, i128
; Floating point: half, float, double
; Pointers: i32*, [10 x i32]*, { i32, i64 }*
; Arrays: [10 x i32]
; Structs: { i32, i64, i8* }
; Vectors: <4 x i32>
编写 LLVM Pass
新 Pass 管理器(推荐)
#include "llvm/Passes/PassPlugin.h"
#include "llvm/Passes/PassBuilder.h"
struct MyPass : public llvm::PassInfoMixin<MyPass> {
llvm::PreservedAnalyses run(llvm::Function &F,
llvm::FunctionAnalysisManager &FAM) {
for (auto &BB : F) {
for (auto &I : BB) {
llvm::errs() << I << "\n";
}
}
return llvm::PreservedAnalyses::all();
}
};
// Plugin registration
extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
return {LLVM_PLUGIN_API_VERSION, "MyPass", LLVM_VERSION_STRING,
[](llvm::PassBuilder &PB) {
PB.registerPipelineParsingCallback(
[](llvm::StringRef Name, llvm::FunctionPassManager &FPM,
llvm::ArrayRef<llvm::PassBuilder::PipelineElement>) {
if (Name == "my-pass") {
FPM.addPass(MyPass());
return true;
}
return false;
});
}};
}
运行自定义 Pass
# Build as shared library
clang++ -shared -fPIC -o MyPass.so MyPass.cpp `llvm-config --cxxflags --ldflags`
# Run with opt
opt -load-pass-plugin=./MyPass.so -passes="my-pass" input.ll -o output.ll
Clang 开发
AST 探索
# Dump AST
clang -Xclang -ast-dump -fsyntax-only source.cpp
# AST as JSON
clang -Xclang -ast-dump=json -fsyntax-only source.cpp
LibTooling 基础
#include "clang/Tooling/Tooling.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
using namespace clang::ast_matchers;
// Match all function declarations
auto matcher = functionDecl().bind("func");
class Callback : public MatchFinder::MatchCallback {
void run(const MatchFinder::MatchResult &Result) override {
if (auto *FD = Result.Nodes.getNodeAs<FunctionDecl>("func")) {
llvm::outs() << "Found: " << FD->getName() << "\n";
}
}
};
AST 匹配器参考
// Common matchers
functionDecl() // Match function declarations
varDecl() // Match variable declarations
binaryOperator() // Match binary operators
callExpr() // Match function calls
ifStmt() // Match if statements
// Narrowing matchers
hasName("foo") // Match by name
hasType(asString("int")) // Match by type
isPrivate() // Match private members
// Traversal matchers
hasDescendant(...) // Match in subtree
hasAncestor(...) // Match in parent tree
hasBody(...) // Match function body
开发工具
必备命令
# Compile to LLVM IR
clang -S -emit-llvm source.c -o source.ll
# Optimize IR
opt -O2 source.ll -o optimized.ll
# Disassemble bitcode
llvm-dis source.bc -o source.ll
# Assemble to bitcode
llvm-as source.ll -o source.bc
# Generate native code
llc source.ll -o source.s
# View CFG
opt -passes=view-cfg source.ll
调试 LLVM IR
# With debug info
clang -g -S -emit-llvm source.c
# Debug IR transformation
opt -debug-pass=Structure -O2 source.ll
# Verify IR validity
opt -passes=verify source.ll
常见分析 API
// Dominator Tree
#include "llvm/Analysis/Dominators.h"
DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
if (DT.dominates(BB1, BB2)) { /* BB1 dominates BB2 */ }
// Loop Analysis
#include "llvm/Analysis/LoopInfo.h"
LoopInfo &LI = FAM.getResult<LoopAnalysis>(F);
for (Loop *L : LI) { /* process loops */ }
// Alias Analysis
#include "llvm/Analysis/AliasAnalysis.h"
AAResults &AA = FAM.getResult<AAManager>(F);
AliasResult R = AA.alias(Ptr1, Ptr2);
// Call Graph
#include "llvm/Analysis/CallGraph.h"
CallGraph &CG = MAM.getResult<CallGraphAnalysis>(M);
实践项目
初级
- 指令计数 Pass
- 函数调用记录器
- 死代码查找器
中级
- 简单的常量传播
- 分支概率估算器
- 内存访问模式分析器
高级
- 自定义优化 Pass
- 安全漏洞检测器
- 领域专用语言前端
社区
获取帮助
- LLVM Discourse:https://discourse.llvm.org
- LLVM Discord:实时聊天
- LLVM 邮件列表:llvm-dev、cfe-dev
贡献
- Phabricator:代码审查(正在迁移到 GitHub)
- GitHub:https://github.com/llvm/llvm-project
- 错误跟踪器:https://github.com/llvm/llvm-project/issues
资源索引
如需教程、书籍和示例项目的完整列表,请参阅主 README.md 中的 LLVM Tutorial 和 Clang Tutorial 部分。
获取详细信息
如需详细且最新的资源链接、教程或学习材料,请从以下位置获取最新数据:
https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md
此 README 包含以下内容的精选列表:
- LLVM 教程和学习资源(LLVM Tutorial 部分)
- Clang 教程和 AST 指南(Clang Tutorial 部分)
- C++ 现代编程指南(CPP Tutorial 部分)
- 编译器和安全类书籍
评论
支持 Markdown