clang

Guide agents through Clang-specific features: superior diagnostics, sanitizer integration, optimization remarks, static analysis, and LLVM tooling. Covers divergences from GCC and Apple/FreeBSD specifics.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "clang" with this command: npx skills add mohitmishra786/low-level-dev-skills/mohitmishra786-low-level-dev-skills-clang

Clang

Purpose

Guide agents through Clang-specific features: superior diagnostics, sanitizer integration, optimization remarks, static analysis, and LLVM tooling. Covers divergences from GCC and Apple/FreeBSD specifics.

Triggers

  • "I want better compiler diagnostics/errors"

  • "How do I use clang-tidy / clang-format?"

  • "How do I see what the compiler optimised or didn't?"

  • "I'm on macOS / FreeBSD using clang"

  • "clang-cl for MSVC-compatible builds" — see skills/compilers/msvc-cl

  • Sanitizer queries — see skills/runtimes/sanitizers

Workflow

  1. Build mode flags (identical to GCC)

Clang accepts most GCC flags. Key differences:

Feature GCC Clang

Min size -Os

-Os or -Oz (more aggressive)

Optimise only hot — -fprofile-instr-use (LLVM PGO)

Thin LTO -flto

-flto=thin (faster)

Static analyser -fanalyzer

clang --analyze or clang-tidy

  1. Clang-specific diagnostic flags

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's diagnostics include exact range highlighting and fix-it suggestions that GCC lacks.

  1. Optimization remarks

Optimization remarks let you see what Clang did or refused to do:

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

Interpret remarks:

  • remark: foo inlined into bar — inlining happened; good for hot paths

  • remark: loop not vectorized: loop control flow is not understood — restructure the loop

  • remark: not vectorized: cannot prove it is safe to reorder... — add restrict or #pragma clang loop vectorize(assume_safety)

  1. Static analysis

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 --

Common clang-tidy check families:

  • bugprone-* : real bugs (use-after-move, dangling, etc.)

  • clang-analyzer-* : CSA checks (memory, null deref)

  • modernize-* : C++11/14/17 modernisation

  • performance-* : unnecessary copies, move candidates

  • readability-* : naming, complexity

  1. LTO with lld

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

For large projects, ThinLTO is preferred: link times 5-10x faster than full LTO with comparable code quality.

  1. PGO (LLVM instrumentation)

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 (sampling-based, less intrusive): collect with perf , convert with create_llvm_prof , use with -fprofile-sample-use . See skills/profilers/linux-perf .

  1. GCC compatibility

Clang is intentionally GCC-compatible for driver flags. Key differences:

  • Clang does not support all GCC-specific attributes; check with __has_attribute(foo)

  • -Weverything enables all Clang warnings (no GCC equivalent); too noisy for production, useful for one-off audits

  • Some GCC intrinsics need #include <x86intrin.h> on Clang too

  • __int128 is supported; __float128 requires -lquadmath on some targets

  1. macOS specifics

On macOS, clang is the system compiler (Apple LLVM). Key points:

  • ld64 is the default linker; lld requires explicit -fuse-ld=lld and Homebrew LLVM

  • Use -mmacosx-version-min=X.Y to set deployment target

  • Sanitizers on macOS use DYLD_INSERT_LIBRARIES ; do not strip the binary

  • xcrun clang resolves to the Xcode toolchain clang

For flag reference, see references/flags.md. For clang-tidy config examples, see references/clang-tidy.md.

Related skills

  • Use skills/compilers/gcc for GCC-equivalent flag mapping

  • Use skills/runtimes/sanitizers for -fsanitize=* workflows

  • Use skills/compilers/llvm for IR-level work (opt , llc , llvm-dis )

  • Use skills/compilers/msvc-cl for clang-cl on Windows

  • Use skills/binaries/linkers-lto for linker-level LTO details

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

cmake

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

static-analysis

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

llvm

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

gdb

No summary provided by upstream source.

Repository SourceNeeds Review