Aller au contenu

Clang/LLVM - Infrastructure moderne de compilateur

Copier toutes les commandes Générer PDF

Clang et LLVM représentent une approche révolutionnaire de la conception du compilateur qui a fondamentalement changé le paysage des outils de développement logiciel. LLVM (Low Level Virtual Machine) est une collection de technologies modulaires et réutilisables de compilateur et de chaîne d'outils, tandis que Clang est un front-end de compilateur C, C++, Objective-C et Objective-C++ qui utilise LLVM comme moteur. Développé d'abord à l'Université de l'Illinois puis adopté par Apple, Google, et de nombreuses autres entreprises technologiques, Clang/LLVM a acquis une large adoption en raison de ses diagnostics d'erreurs supérieurs, des temps de compilation plus rapides, de l'architecture modulaire et d'un excellent support multiplateforme. L'accent mis par le projet sur les API propres, la documentation complète et l'extensibilité en a fait la base de nombreux outils de développement, analyseurs statiques et implémentations de langage, l'établissant comme une pierre angulaire de l'infrastructure moderne de développement de logiciels.

Installation et configuration

Installation de Clang/LLVM sur différentes plateformes

# Ubuntu/Debian installation
sudo apt update
sudo apt install clang llvm

# Install specific version
sudo apt install clang-15 llvm-15
sudo apt install clang-16 llvm-16
sudo apt install clang-17 llvm-17

# Install complete LLVM toolchain
sudo apt install clang llvm lld lldb

# Install development packages
sudo apt install clang-tools clang-format clang-tidy

# CentOS/RHEL/Fedora installation
sudo dnf install clang llvm
sudo dnf install clang-tools-extra

# macOS installation (Xcode includes Clang)
xcode-select --install

# Or using Homebrew
brew install llvm
brew install clang-format

# Windows installation
# Download from https://releases.llvm.org/
# Or using Chocolatey
choco install llvm

# Or using vcpkg
vcpkg install llvm

# Verify installation
clang --version
clang++ --version
llvm-config --version

# Check available tools
ls /usr/bin/clang*
ls /usr/bin/llvm*

# Set default version (Ubuntu/Debian)
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-15 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-15 100

LVVM Configuration et environnement

# Environment variables
export CC=clang
export CXX=clang++
export CFLAGS="-O2 -Wall"
export CXXFLAGS="-O2 -Wall -std=c++17"

# LLVM-specific environment
export LLVM_CONFIG=/usr/bin/llvm-config
export LLVM_DIR=/usr/lib/llvm-15

# Library and include paths
export LD_LIBRARY_PATH=/usr/lib/llvm-15/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/usr/lib/llvm-15/include:$C_INCLUDE_PATH

# Check Clang configuration
clang -v
clang -print-targets
clang -print-supported-cpus

# Show default include paths
clang -E -v - </dev/null
clang++ -E -v - </dev/null

# Show default library paths
clang -print-search-dirs

# Show built-in defines
clang -dM -E - </dev/null

# LLVM configuration
llvm-config --version
llvm-config --prefix
llvm-config --bindir
llvm-config --libdir
llvm-config --includedir
llvm-config --cppflags
llvm-config --ldflags
llvm-config --libs
```_

## Compilation de base

### Commandes simples de compilation
```bash
# Compile C program
clang hello.c -o hello
clang -o hello hello.c

# Compile C++ program
clang++ hello.cpp -o hello
clang++ -o hello hello.cpp

# Compile without linking (object file only)
clang -c source.c
clang++ -c source.cpp

# Compile multiple source files
clang file1.c file2.c file3.c -o program
clang++ file1.cpp file2.cpp file3.cpp -o program

# Link object files
clang file1.o file2.o file3.o -o program

# Compile with specific C standard
clang -std=c99 program.c -o program
clang -std=c11 program.c -o program
clang -std=c17 program.c -o program

# Compile with specific C++ standard
clang++ -std=c++11 program.cpp -o program
clang++ -std=c++14 program.cpp -o program
clang++ -std=c++17 program.cpp -o program
clang++ -std=c++20 program.cpp -o program
clang++ -std=c++2b program.cpp -o program

# Target-specific compilation
clang -target x86_64-linux-gnu program.c -o program
clang -target arm64-apple-macos program.c -o program
clang -target x86_64-pc-windows-msvc program.c -o program.exe

# Generate assembly output
clang -S source.c                    # Creates source.s
clang -S -o output.s source.c

# Generate LLVM IR
clang -S -emit-llvm source.c         # Creates source.ll
clang -c -emit-llvm source.c         # Creates source.bc (bitcode)

# Generate preprocessed output
clang -E source.c                    # Output to stdout
clang -E source.c -o source.i        # Save to file

# Verbose compilation
clang -v source.c -o program

# Show compilation commands
clang -### source.c -o program
```_

### LVVM Représentation intermédiaire
```bash
# Generate LLVM IR (human-readable)
clang -S -emit-llvm source.c -o source.ll

# Generate LLVM bitcode (binary)
clang -c -emit-llvm source.c -o source.bc

# Optimize LLVM IR
opt -O2 source.ll -o optimized.ll
opt -O3 source.bc -o optimized.bc

# Analyze LLVM IR
llvm-dis source.bc -o source.ll      # Convert bitcode to IR
llvm-as source.ll -o source.bc       # Convert IR to bitcode

# Link LLVM bitcode files
llvm-link file1.bc file2.bc -o combined.bc

# Generate assembly from LLVM IR
llc source.ll -o source.s
llc source.bc -o source.s

# Generate object file from LLVM IR
llc -filetype=obj source.ll -o source.o

# Execute LLVM IR directly
lli source.ll
lli source.bc

# Profile LLVM IR execution
lli -stats source.ll

Options d'optimisation

Niveaux d'optimisation

# No optimization (default)
clang -O0 source.c -o program

# Basic optimization
clang -O1 source.c -o program

# Standard optimization (recommended)
clang -O2 source.c -o program

# Aggressive optimization
clang -O3 source.c -o program

# Optimize for size
clang -Os source.c -o program
clang -Oz source.c -o program        # More aggressive size optimization

# Optimize for debugging
clang -Og source.c -o program

# Fast math optimizations
clang -O2 -ffast-math source.c -o program

# Link-time optimization (LTO)
clang -O2 -flto source1.c source2.c -o program

# Thin LTO (faster than full LTO)
clang -O2 -flto=thin source1.c source2.c -o program

# Profile-guided optimization
# Step 1: Compile with profiling
clang -O2 -fprofile-instr-generate source.c -o program
./program  # Run with representative input
llvm-profdata merge -output=default.profdata default.profraw
# Step 2: Compile with profile data
clang -O2 -fprofile-instr-use=default.profdata source.c -o program_optimized

# Auto-vectorization
clang -O2 -fvectorize source.c -o program
clang -O2 -fslp-vectorize source.c -o program

# Loop optimizations
clang -O2 -funroll-loops source.c -o program

Optimisation avancée

# Architecture-specific optimization
clang -O2 -march=native source.c -o program
clang -O2 -march=skylake source.c -o program
clang -O2 -march=armv8-a source.c -o program

# CPU-specific tuning
clang -O2 -mtune=generic source.c -o program
clang -O2 -mtune=intel source.c -o program

# Show optimization remarks
clang -O2 -Rpass=loop-vectorize source.c -o program
clang -O2 -Rpass-missed=loop-vectorize source.c -o program
clang -O2 -Rpass-analysis=loop-vectorize source.c -o program

# Save optimization remarks to file
clang -O2 -fsave-optimization-record source.c -o program

# Polyhedral optimization (Polly)
clang -O3 -mllvm -polly source.c -o program
clang -O3 -mllvm -polly -mllvm -polly-vectorizer=stripmine source.c -o program

# Control flow integrity
clang -O2 -fsanitize=cfi source.c -o program

# Specific optimization passes
clang -O2 -mllvm -enable-loop-distribute source.c -o program
clang -O2 -mllvm -enable-load-pre source.c -o program

# Disable specific optimizations
clang -O2 -fno-vectorize source.c -o program
clang -O2 -fno-unroll-loops source.c -o program
clang -O2 -fno-inline source.c -o program

Options d'avertissement et de diagnostic

Niveaux d'avertissement

# Basic warnings
clang -Wall source.c -o program

# Extra warnings
clang -Wextra source.c -o program

# All warnings
clang -Weverything source.c -o program

# Treat warnings as errors
clang -Werror source.c -o program

# Specific warning categories
clang -Wpedantic source.c -o program
clang -Wconversion source.c -o program
clang -Wshadow source.c -o program
clang -Wunused source.c -o program
clang -Wuninitialized source.c -o program
clang -Wformat source.c -o program
clang -Wcast-align source.c -o program
clang -Wwrite-strings source.c -o program

# Clang-specific warnings
clang -Wdocumentation source.c -o program
clang -Wthread-safety source.c -o program
clang -Wloop-analysis source.c -o program
clang -Wstring-conversion source.c -o program

# Disable specific warnings
clang -Wall -Wno-unused-variable source.c -o program
clang -Weverything -Wno-padded source.c -o program

# C++-specific warnings
clang++ -Wall -Wc++11-compat source.cpp -o program
clang++ -Wall -Wc++14-compat source.cpp -o program
clang++ -Wall -Wc++17-compat source.cpp -o program

# Show all available warnings
clang -Weverything -fsyntax-only source.c 2>&1|grep "warning:"

Diagnostic amélioré

# Colorized output
clang -fcolor-diagnostics source.c -o program

# Show column numbers
clang -fshow-column source.c -o program

# Show source ranges
clang -fshow-source-location source.c -o program

# Caret diagnostics
clang -fcaret-diagnostics source.c -o program

# Fix-it hints
clang -fdiagnostics-fixit-info source.c -o program

# Template instantiation backtrace
clang++ -ftemplate-backtrace-limit=0 source.cpp -o program

# Macro expansion in diagnostics
clang -fmacro-backtrace-limit=0 source.c -o program

# Diagnostic format options
clang -fdiagnostics-format=clang source.c -o program
clang -fdiagnostics-format=msvc source.c -o program

# Show option that triggered warning
clang -fdiagnostics-show-option source.c -o program

# Syntax-only check
clang -fsyntax-only source.c

# Static analysis
clang --analyze source.c
clang --analyze -Xanalyzer -analyzer-output=html source.c

Débogueurs et agents sanitaires

Renseignements sur les débogueurs

# Generate debug information
clang -g source.c -o program

# Different debug levels
clang -g0 source.c -o program        # No debug info
clang -g1 source.c -o program        # Minimal debug info
clang -g2 source.c -o program        # Default debug info
clang -g3 source.c -o program        # Maximum debug info

# Debug format options
clang -gdwarf-4 source.c -o program
clang -gdwarf-5 source.c -o program

# Debug with optimization
clang -O2 -g source.c -o program

# Standalone debug info
clang -g -gsplit-dwarf source.c -o program

# Compressed debug sections
clang -g -gz source.c -o program

# Debug line tables only
clang -gline-tables-only source.c -o program

# Emit debug info for used types only
clang -g -feliminate-unused-debug-types source.c -o program

Hygiènes

# Address sanitizer (detects memory errors)
clang -g -fsanitize=address source.c -o program

# Memory sanitizer (detects uninitialized reads)
clang -g -fsanitize=memory source.c -o program

# Thread sanitizer (detects data races)
clang -g -fsanitize=thread source.c -o program

# Undefined behavior sanitizer
clang -g -fsanitize=undefined source.c -o program

# Leak sanitizer
clang -g -fsanitize=leak source.c -o program

# Control flow integrity
clang -g -fsanitize=cfi source.c -o program

# Safe stack
clang -g -fsanitize=safe-stack source.c -o program

# Kernel address sanitizer
clang -g -fsanitize=kernel-address source.c -o program

# Hardware-assisted address sanitizer
clang -g -fsanitize=hwaddress source.c -o program

# Multiple sanitizers
clang -g -fsanitize=address,undefined source.c -o program

# Sanitizer options
export ASAN_OPTIONS="detect_leaks=1:abort_on_error=1"
export MSAN_OPTIONS="print_stats=1"
export TSAN_OPTIONS="history_size=7"
export UBSAN_OPTIONS="print_stacktrace=1"

# Sanitizer coverage
clang -g -fsanitize=address -fsanitize-coverage=trace-pc-guard source.c -o program

Analyse statique

Analyseur statique de clang

# Basic static analysis
clang --analyze source.c

# Analyze with specific checkers
clang --analyze -Xanalyzer -analyzer-checker=core source.c
clang --analyze -Xanalyzer -analyzer-checker=deadcode source.c
clang --analyze -Xanalyzer -analyzer-checker=security source.c

# List available checkers
clang -cc1 -analyzer-checker-help

# HTML output
clang --analyze -Xanalyzer -analyzer-output=html source.c

# Plist output
clang --analyze -Xanalyzer -analyzer-output=plist source.c

# Text output
clang --analyze -Xanalyzer -analyzer-output=text source.c

# Analyze entire project with scan-build
scan-build make
scan-build -o /tmp/analysis make

# Configure scan-build
scan-build -enable-checker security.insecureAPI.UncheckedReturn make
scan-build -disable-checker deadcode.DeadStores make

# Cross-translation unit analysis
clang --analyze -Xanalyzer -analyzer-config -Xanalyzer experimental-enable-naive-ctu-analysis=true source.c

Clang-Tidy

# Basic clang-tidy usage
clang-tidy source.c

# Specify checks
clang-tidy -checks='*' source.c
clang-tidy -checks='readability-*' source.c
clang-tidy -checks='modernize-*' source.cpp

# Apply fixes automatically
clang-tidy -fix source.c
clang-tidy -fix-errors source.c

# Configuration file (.clang-tidy)
echo "Checks: 'readability-*,modernize-*'" > .clang-tidy

# List available checks
clang-tidy -list-checks

# Explain specific check
clang-tidy -explain-config source.c

# Integration with compilation database
clang-tidy -p build_directory source.c

# Run on entire project
find . -name "*.c" -o -name "*.cpp"|xargs clang-tidy

# Parallel execution
run-clang-tidy -j$(nproc)

Compilation croisée et cibles

Spécification de la cible

# List supported targets
clang -print-targets

# Cross-compile for different architectures
clang -target arm-linux-gnueabihf source.c -o program_arm
clang -target aarch64-linux-gnu source.c -o program_arm64
clang -target x86_64-pc-windows-msvc source.c -o program.exe
clang -target wasm32-unknown-unknown source.c -o program.wasm

# Specify system root
clang -target arm-linux-gnueabihf --sysroot=/path/to/sysroot source.c -o program

# Cross-compilation with specific CPU
clang -target arm-linux-gnueabihf -mcpu=cortex-a9 source.c -o program

# WebAssembly compilation
clang -target wasm32-unknown-unknown -nostdlib -Wl,--no-entry source.c -o program.wasm

# Emscripten (WebAssembly with JavaScript runtime)
emcc source.c -o program.html
emcc source.c -o program.js

# Android cross-compilation
clang -target armv7a-linux-androideabi21 source.c -o program_android

# iOS cross-compilation
clang -target arm64-apple-ios source.c -o program_ios

Systèmes embarqués

# Bare metal compilation
clang -target arm-none-eabi -mcpu=cortex-m4 -mthumb source.c -o program.elf

# Specify floating-point ABI
clang -target arm-none-eabi -mfloat-abi=hard -mfpu=fpv4-sp-d16 source.c -o program.elf

# Link with custom linker script
clang -target arm-none-eabi -T linker_script.ld source.c -o program.elf

# Generate different output formats
llvm-objcopy -O binary program.elf program.bin
llvm-objcopy -O ihex program.elf program.hex

# Size analysis
llvm-size program.elf

# Disassembly
llvm-objdump -d program.elf

# Symbol table
llvm-nm program.elf

# Common embedded flags
clang -target arm-none-eabi -mcpu=cortex-m4 -mthumb \
    -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os \
    -ffunction-sections -fdata-sections \
    -Wl,--gc-sections source.c -o program.elf

LVVM Outils et services publics

Outils d'analyse de code

# LLVM profiling
llvm-profdata merge -output=merged.profdata *.profraw
llvm-profdata show merged.profdata
llvm-cov show program -instr-profile=merged.profdata

# Code coverage
clang -fprofile-instr-generate -fcoverage-mapping source.c -o program
./program
llvm-profdata merge -sparse default.profraw -o default.profdata
llvm-cov show program -instr-profile=default.profdata

# Generate coverage report
llvm-cov report program -instr-profile=default.profdata
llvm-cov export program -instr-profile=default.profdata -format=lcov > coverage.lcov

# Symbol analysis
llvm-nm program
llvm-readobj -symbols program
llvm-readelf -s program

# Binary analysis
llvm-objdump -d program
llvm-objdump -t program
llvm-objdump -h program

# Archive manipulation
llvm-ar rcs libmylib.a file1.o file2.o
llvm-ranlib libmylib.a

# String extraction
llvm-strings program

Analyse d'optimisation

# Optimization remarks
clang -O2 -Rpass=.* source.c -o program 2> remarks.txt
clang -O2 -Rpass-missed=.* source.c -o program 2> missed.txt
clang -O2 -Rpass-analysis=.* source.c -o program 2> analysis.txt

# YAML optimization records
clang -O2 -fsave-optimization-record source.c -o program
opt-viewer optimization-record.opt.yaml

# LLVM IR optimization
opt -O2 -print-before-all -print-after-all source.ll -o optimized.ll

# Pass analysis
opt -analyze -basicaa -aa-eval source.ll
opt -analyze -loops source.ll
opt -analyze -domtree source.ll

# Machine code analysis
llc -print-machineinstrs source.ll -o source.s

# Register allocation analysis
llc -debug-only=regalloc source.ll -o source.s

Outils de développement

# Code formatting
clang-format source.c
clang-format -i source.c              # In-place formatting
clang-format -style=Google source.c
clang-format -style=LLVM source.c
clang-format -style=Mozilla source.c

# Generate .clang-format file
clang-format -style=Google -dump-config > .clang-format

# Include-what-you-use
include-what-you-use source.c
iwyu_tool.py -p build_directory

# Clang-based refactoring
clang-rename -old-name=oldFunction -new-name=newFunction source.c
clang-apply-replacements replacements_directory

# AST dumping
clang -Xclang -ast-dump source.c
clang -Xclang -ast-dump=json source.c

# Token dumping
clang -Xclang -dump-tokens source.c

# Preprocessor output
clang -E -dM source.c               # Show macros
clang -E -dI source.c               # Show includes

L'architecture modulaire de Clang et LLVM, les diagnostics supérieurs et l'écosystème d'outillage étendu en font des composantes essentielles du développement logiciel moderne. L'accent qu'ils ont mis sur des API propres, des tests complets et un soutien multiplateforme les a établis comme la base de nombreux outils de développement et d'implémentations linguistiques. Qu'ils soient utilisés pour la compilation traditionnelle, l'analyse statique, la transformation de code ou comme éléments de construction d'outils personnalisés, Clang et LLVM offrent la flexibilité et la performance nécessaires pour relever les défis changeants du développement de logiciels sur différentes plateformes et domaines.