mcpField
C
clang

clang

github.com/mohitmishra786开发269737 次安装18 周前更新
代码仓库

关于 clang

面向 Agent 的 Clang 技能,介绍诊断、静态分析、优化备注、LTO 和 PGO 等编译器功能,并说明平台差异及与 GCC 的不同。

主要功能

  1. 01使用诊断提示和警告控制
  2. 02通过优化备注检查编译决策
  3. 03使用 clang-tidy 进行静态分析
  4. 04配置 LTO 和基于性能分析的优化
  5. 05了解 macOS 特性及 GCC 差异

适用场景

  1. 01排查编译器诊断和错误
  2. 02了解循环未被优化的原因
  3. 03为 Clang 构建配置分析或优化

安装

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

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill clang

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

附带文件references/clang-tidy.mdreferences/flags.md

详细介绍

Clang

用途

指导 Agent 使用 Clang 专属功能:更出色的诊断信息、消毒器集成、优化备注、静态分析和 LLVM 工具。涵盖与 GCC 的差异,以及 Apple/FreeBSD 特有内容。

触发条件

  • “我想要更好的编译器诊断信息/错误信息”
  • “如何使用 clang-tidy / clang-format?”
  • “如何查看编译器优化了什么,或没有优化什么?”
  • “我在 macOS / FreeBSD 上使用 clang”
  • “使用 clang-cl 进行兼容 MSVC 的构建”——参见 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。

相关技能

  • 使用 skills/compilers/gcc 查看 GCC 等效标志的映射
  • 使用 skills/runtimes/sanitizers 查看 -fsanitize=* 工作流
  • 使用 skills/compilers/llvm 进行 IR 级别的操作(opt、llc、llvm-dis)
  • 使用 skills/compilers/msvc-cl 在 Windows 上使用 clang-cl
  • 使用 skills/binaries/linkers-lto 查看链接器级别的 LTO 详情

评论

支持 Markdown