llvm-learning について
LLVM、Clang、コンパイラー開発を学ぶ人向けのリソーススキルです。初級から上級までの学習経路を整理し、IR、パス、ツール、分析 API の資料と実践ガイドをまとめています。
主な機能
- 01初級から上級までの学習経路
- 02LLVM と Clang のリソース一覧
- 03LLVM IR とパスのガイド
- 04Clang AST と LibTooling の例
- 05開発コマンドと分析 API
活用シーン
- 01コンパイラー開発の学習経路を計画
- 02LLVM IR を学び最初のパスを作成
- 03LibTooling で 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 を理解する:中間表現を学びます
- シンプルなパスを作成する:カスタムパスで IR を変換します
- Clang を調べる:C/C++ フロントエンドを理解します
中級者向けパス
- 最適化を深く掘り下げる:組み込みの最適化パスを学びます
- バックエンド開発:ターゲットコードを生成します
- 解析フレームワーク:ポインター解析、データフロー
- Clang ツーリング:LibTooling、AST マッチャー
上級者向けパス
- MLIR:ドメイン固有コンパイル向けのマルチレベル IR
- JIT コンパイル:ORC JIT フレームワーク
- セキュリティ機能:サニタイザー、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 パスの作成: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 パスの作成
新しいパスマネージャー(推奨)
#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);
実践プロジェクト
初心者向け
- 命令カウンターパス
- 関数呼び出しロガー
- デッドコード検出器
中級者向け
- シンプルな定数伝播
- 分岐確率推定器
- メモリアクセスパターンアナライザー
上級者向け
- カスタム最適化パス
- セキュリティ脆弱性検出器
- ドメイン固有言語フロントエンド
コミュニティ
ヘルプを得る
- 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 対応