关于 clang
面向 Agent 的 Clang 技能,介绍诊断、静态分析、优化备注、LTO 和 PGO 等编译器功能,并说明平台差异及与 GCC 的不同。
主要功能
- 01使用诊断提示和警告控制
- 02通过优化备注检查编译决策
- 03使用 clang-tidy 进行静态分析
- 04配置 LTO 和基于性能分析的优化
- 05了解 macOS 特性及 GCC 差异
适用场景
- 01排查编译器诊断和错误
- 02了解循环未被优化的原因
- 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 标志。主要差异如下:
| 功能 | 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。
相关技能
- 使用
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