clang について
Clang 固有の機能を扱うエージェント向けスキルです。診断、静的解析、最適化レポート、LTO、PGO に加え、プラットフォーム固有の点や GCC との差異を説明します。
主な機能
- 01診断ヒントと警告の制御
- 02最適化レポートによる処理確認
- 03clang-tidy による静的解析
- 04LTO とプロファイル誘導最適化の設定
- 05macOS の特性と GCC との差異の把握
活用シーン
- 01コンパイラの診断やエラーを調査
- 02ループが最適化されない理由を確認
- 03Clang ビルドの解析や最適化を設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill clangインストール後、Claude Code で/clangを入力して読み込まれたか確認します。
同梱ファイルreferences/clang-tidy.mdreferences/flags.md
詳細
Clang
目的
Clang 固有の機能(優れた診断、サニタイザーとの連携、最適化に関する注釈、静的解析、LLVM ツール)についてエージェントを案内します。GCC との違いや、Apple/FreeBSD 固有の情報も扱います。
トリガー
- 「コンパイラーの診断/エラーを改善したい」
- 「clang-tidy/clang-format の使い方を知りたい」
- 「コンパイラーが何を最適化したか、またはしなかったか確認したい」
- 「macOS/FreeBSD で clang を使っている」
- 「MSVC 互換ビルドで clang-cl を使いたい」—
skills/compilers/msvc-clを参照してください - サニタイザーに関する問い合わせ —
skills/runtimes/sanitizersを参照してください
ワークフロー
1. ビルドモードのフラグ(GCC と同じ)
Clang はほとんどの GCC フラグを受け付けます。主な違いは次のとおりです。
| 機能 | GCC | Clang |
|---|---|---|
| 最小サイズ | -Os | -Os または -Oz(より積極的) |
| ホットな部分のみを最適化 | — | -fprofile-instr-use(LLVM PGO) |
| Thin LTO | -flto | -flto=thin(高速) |
| 静的解析ツール | -fanalyzer | clang --analyze または clang-tidy |
2. Clang 固有の診断フラグ
# Show fix-it hints inline
clang -Wall -Wextra --show-fixits src.c
# Limit error count
clang -ferror-limit=5 src.c
# Verbose template errors (disable elision)
clang -fno-elide-type src.cpp
# Show tree diff for template mismatch
clang -fdiagnostics-show-template-tree src.cpp
Clang の診断には、GCC にはない正確な範囲の強調表示と修正提案が含まれます。
3. 最適化に関する注釈
最適化に関する注釈を使うと、Clang が実行した処理や、実行しなかった処理を確認できます。
# Inliner decisions
clang -O2 -Rpass=inline src.c
# Missed vectorisation
clang -O2 -Rpass-missed=loop-vectorize src.c
# Why a loop was not vectorized
clang -O2 -Rpass-analysis=loop-vectorize src.c
# Save all remarks to YAML for post-processing
clang -O2 -fsave-optimization-record src.c
# Produces src.opt.yaml
注釈の解釈:
remark: foo inlined into bar— インライン化が行われました。ホットパスでは望ましい結果ですremark: loop not vectorized: loop control flow is not understood— ループの構造を変更してくださいremark: not vectorized: cannot prove it is safe to reorder...—__restrict__または#pragma clang loop vectorize(assume_safety)を追加してください
4. 静的解析
# Built-in analyser (CSA)
clang --analyze -Xanalyzer -analyzer-output=text src.c
# clang-tidy (separate tool, richer checks)
clang-tidy src.c -- -std=c++17 -I/usr/include
# Enable specific check families
clang-tidy -checks='clang-analyzer-*,modernize-*,bugprone-*' src.cpp --
# Apply fixits automatically
clang-tidy -fix src.cpp --
clang-tidy の主なチェックファミリー:
bugprone-*:実際のバグ(ムーブ後の使用、ダングリングなど)clang-analyzer-*:CSA チェック(メモリー、ヌル参照)modernize-*:C++11/14/17 のモダナイズperformance-*:不要なコピー、ムーブの候補readability-*:命名、複雑さ
5. lld を使った LTO
# Full LTO
clang -O2 -flto -fuse-ld=lld src.c -o prog
# Thin LTO (faster link, nearly same quality)
clang -O2 -flto=thin -fuse-ld=lld src.c -o prog
# Check lld is available
clang -fuse-ld=lld -Wl,--version 2>&1 | head -1
大規模なプロジェクトでは ThinLTO が推奨されます。コード品質は同等で、リンク時間は通常の LTO より 5~10 倍高速です。
6. PGO(LLVM インストルメンテーション)
# Step 1: instrument
clang -O2 -fprofile-instr-generate prog.c -o prog_inst
# Step 2: run with representative input
./prog_inst < workload.input
# Generates default.profraw
# Step 3: merge profiles
llvm-profdata merge -output=prog.profdata default.profraw
# Step 4: use profile
clang -O2 -fprofile-instr-use=prog.profdata prog.c -o prog
AutoFDO(サンプリングベースで、影響が小さい):perf でデータを収集し、create_llvm_prof で変換して、-fprofile-sample-use で使用します。skills/profilers/linux-perf を参照してください。
7. GCC との互換性
Clang はドライバーフラグについて、意図的に GCC との互換性を保っています。主な違いは次のとおりです。
- Clang は GCC 固有の属性すべてに対応しているわけではありません。
__has_attribute(foo)で確認してください -Weverythingを使うと Clang のすべての警告が有効になります(GCC に相当するものはありません)。本番環境では警告が多すぎますが、単発の監査には便利です- GCC の一部の組み込み関数を Clang でも使うには、
#include <x86intrin.h>が必要です __int128はサポートされています。__float128は一部のターゲットで-lquadmathが必要です
8. macOS 固有の情報
macOS では、clang がシステムコンパイラー(Apple LLVM)です。主なポイントは次のとおりです。
ld64がデフォルトのリンカーです。lldを使うには、-fuse-ld=lldと Homebrew LLVM を明示的に指定する必要があります-mmacosx-version-min=X.Yを使ってデプロイメントターゲットを設定してください- macOS のサニタイザーは
DYLD_INSERT_LIBRARIESを使用します。バイナリーをストリップしないでください xcrun clangは Xcode ツールチェーンの clang に解決されます
フラグのリファレンスについては、references/flags.md を参照してください。 clang-tidy の設定例については、references/clang-tidy.md を参照してください。
関連するスキル
- GCC と同等のフラグ対応については、
skills/compilers/gccを使用してください -fsanitize=*のワークフローについては、skills/runtimes/sanitizersを使用してください- IR レベルの作業(
opt、llc、llvm-dis)については、skills/compilers/llvmを使用してください - Windows での
clang-clについては、skills/compilers/msvc-clを使用してください - リンカーレベルの LTO の詳細については、
skills/binaries/linkers-ltoを使用してください