mcpField
L
llvm-learning

llvm-learning

github.com/gmh5225開発89065 回インストール4 週間前に更新
リポジトリ

llvm-learning について

LLVM、Clang、コンパイラー開発を学ぶ人向けのリソーススキルです。初級から上級までの学習経路を整理し、IR、パス、ツール、分析 API の資料と実践ガイドをまとめています。

主な機能

  1. 01初級から上級までの学習経路
  2. 02LLVM と Clang のリソース一覧
  3. 03LLVM IR とパスのガイド
  4. 04Clang AST と LibTooling の例
  5. 05開発コマンドと分析 API

活用シーン

  1. 01コンパイラー開発の学習経路を計画
  2. 02LLVM IR を学び最初のパスを作成
  3. 03LibTooling で 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. シンプルなパスを作成する:カスタムパスで IR を変換します
  4. Clang を調べる:C/C++ フロントエンドを理解します
中級者向けパス
  1. 最適化を深く掘り下げる:組み込みの最適化パスを学びます
  2. バックエンド開発:ターゲットコードを生成します
  3. 解析フレームワーク:ポインター解析、データフロー
  4. Clang ツーリング:LibTooling、AST マッチャー
上級者向けパス
  1. MLIR:ドメイン固有コンパイル向けのマルチレベル IR
  2. JIT コンパイル:ORC JIT フレームワーク
  3. セキュリティ機能:サニタイザー、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 パスの作成

新しいパスマネージャー(推奨)
#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;
                    });
            }};
}
カスタムパスの実行
# 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. 命令カウンターパス
  2. 関数呼び出しロガー
  3. デッドコード検出器
中級者向け
  1. シンプルな定数伝播
  2. 分岐確率推定器
  3. メモリアクセスパターンアナライザー
上級者向け
  1. カスタム最適化パス
  2. セキュリティ脆弱性検出器
  3. ドメイン固有言語フロントエンド

コミュニティ

ヘルプを得る
  • LLVM Discourse:https://discourse.llvm.org
  • LLVM Discord:リアルタイムチャット
  • LLVM メーリングリスト:llvm-dev、cfe-dev
貢献する

リソース一覧

チュートリアル、書籍、サンプルプロジェクトの包括的な一覧については、メインの 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 セクション)
  • コンパイラとセキュリティに関する書籍

コメント