mcpField
C
clang

clang

github.com/mohitmishra786開発269737 回インストール18 週間前に更新
リポジトリ

clang について

Clang 固有の機能を扱うエージェント向けスキルです。診断、静的解析、最適化レポート、LTO、PGO に加え、プラットフォーム固有の点や GCC との差異を説明します。

主な機能

  1. 01診断ヒントと警告の制御
  2. 02最適化レポートによる処理確認
  3. 03clang-tidy による静的解析
  4. 04LTO とプロファイル誘導最適化の設定
  5. 05macOS の特性と GCC との差異の把握

活用シーン

  1. 01コンパイラの診断やエラーを調査
  2. 02ループが最適化されない理由を確認
  3. 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 フラグを受け付けます。主な違いは次のとおりです。

機能GCCClang
最小サイズ-Os-Os または -Oz(より積極的)
ホットな部分のみを最適化—-fprofile-instr-use(LLVM PGO)
Thin LTO-flto-flto=thin(高速)
静的解析ツール-fanalyzerclang --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 を使用してください

コメント