mcpField
L
llvm-learning

llvm-learning

github.com/gmh5225开发89065 次安装4 周前更新
代码仓库

关于 llvm-learning

面向 LLVM、Clang 和编译器开发学习者的资源技能,按难度组织学习路径,并提供 IR、Pass、工具及分析 API 的参考与实践指引。

主要功能

  1. 01从入门到进阶的学习路径
  2. 02LLVM 与 Clang 资源索引
  3. 03LLVM IR 与 Pass 指引
  4. 04Clang AST 和 LibTooling 示例
  5. 05开发命令与分析 API

适用场景

  1. 01规划编译器开发学习路线
  2. 02学习 LLVM IR 并编写首个 Pass
  3. 03使用 LibTooling 探索 Clang AST
  4. 04练习编译器分析与优化项目

安装

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

$npx skills add https://github.com/gmh5225/awesome-llvm-security --skill llvm-learning

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

详细介绍

LLVM 学习技能

此技能提供精心整理的学习路径和资源,帮助您掌握 LLVM、Clang 和编译器开发。

学习路径

初学者路径
  1. 从 Kaleidoscope 开始:LLVM 官方教程,介绍如何构建一门简单的语言
  2. 了解 LLVM IR:学习中间表示
  3. 编写简单的 Pass:使用自定义 Pass 转换 IR
  4. 探索 Clang:了解 C/C++ 前端
中级路径
  1. 深入研究优化:学习内置优化 Pass
  2. 后端开发:面向目标平台的代码生成
  3. 分析框架:指针分析、数据流
  4. Clang 工具:LibTooling、AST 匹配器
高级路径
  1. MLIR:用于领域专用编译的多级 IR
  2. JIT 编译:ORC JIT 框架
  3. 安全特性:Sanitizer、CFI 实现
  4. 为 LLVM 做贡献:补丁、代码审查、社区参与

官方资源

文档
教程

社区资源

书籍和指南
  • 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);

实践项目

初级
  1. 指令计数 Pass
  2. 函数调用记录器
  3. 死代码查找器
中级
  1. 简单的常量传播
  2. 分支概率估算器
  3. 内存访问模式分析器
高级
  1. 自定义优化 Pass
  2. 安全漏洞检测器
  3. 领域专用语言前端

社区

获取帮助
贡献

资源索引

如需教程、书籍和示例项目的完整列表,请参阅主 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