Audit — bibliothèques requises pour une toolchain clang/LLVM C/C++ sur Air
Statut : note d’objectif. Ce document recense ce qu’Air devra fournir pour qu’un
clang air(et la toolchain LLVM associée) puisse compiler et linker des programmes C et C++. C’est un objectif post-phase-3, pas un travail en cours : il sert à savoir « ce qu’on a dans le viseur ». Rien ici n’est encore un ADR ni un contrat.
Cadre
- Le pal de la
stdRust d’Air repose sur la couche 1 (Rust pur), pas sur une libc. Passer par une libc (même la nôtre) =unsafe+ FFI au fondement, ce qu’Air refuse (l’unsafeest confiné, audité, à la couche 0). Cf. décision d’architecture (mémoire projet « pal Rust sur couche 1 + clang air »). - Les développeurs C et C++ sont servis séparément, via un
clang air: libc / libm / libstdc++→libc++ air, au-dessus de la couche 1 (clientes, jamais dedans), à parité avec la std-pal Rust. - Saveur retenue : tout-LLVM (décision 2026-06-28) →
libc++/libc++abi/libunwind(et non libstdc++ / libsupc++).
Étage bas — natif Air (Rust sur couche 1, exporté en ABI C)
| Composant | Rôle | Note |
|---|---|---|
| libc air | stdlib C (malloc/stdio/string/…) + headers système | Rust sur couche 1, ABI C. Motif « une brique, deux faces » (f() fidèle-POSIX + air_f() qui restitue le Result). |
| objets crt | démarrage C : Scrt1.o / crti.o / crtn.o (glue _start→main, init/fini) | Équivalent C d’air-rt. |
| libm air | math (sin/pow/…) | Rust, ou portage musl (cf. audit musl en cours). |
| ld air | dynamic loader | Seulement si dynamique ; différable (static-only au début). |
Runtimes LLVM (C/C++/asm, bâtis contre libc air → reposent sur couche 1 par transitivité)
| Composant | Rôle | Obligatoire ? |
|---|---|---|
compiler-rt builtins | équivalent libgcc : __divti3, soft-float, int 128 bits… | Oui |
compiler-rt profile (__llvm_profile_*) | couverture / PGO | Optionnel |
| compiler-rt sanitizers (asan/ubsan/tsan/msan) | -fsanitize= | Optionnel |
| libunwind (LLVM) | déroulage de pile ; requis pour exceptions C++ + backtraces | Oui (C++) |
| libc++abi | ABI C++ bas niveau (__cxa_*, exceptions, RTTI) ; dépend de libunwind | Oui (C++) |
| libc++ | stdlib C++ + headers ; dépend de libc++abi | Oui (C++) |
Ordre de build : libc air + crt + libm → compiler-rt builtins + libunwind → libc++abi → libc++.
Pour bâtir les binaires de la toolchain (qui tourneront sur Air)
- Un C++ de bootstrap + libc / libm / libc++.
- zlib / zstd (compression objets & debug info).
- Optionnels : libxml2, ncurses/terminfo (diagnostics colorés), libffi, libedit (REPL / lldb).
- Outils de build hôte (pas des libs runtime) : CMake, Ninja, Python.
Headers
- clang fournit ses resource headers (
stddef.h,stdarg.h,stdbool.h, intrinsics…). - libc air fournit les headers système (
stdio.h,stdlib.h,unistd.h, …).
Synthèse de la pile (C/C++)
couche 0 (interne, volatile)
└─ couche 1 (contrat gelé : briques Rust + export ABI C)
└─ libc air / libm air / crt air / ld air (natif Air, Rust)
└─ compiler-rt builtins · libunwind (runtimes LLVM)
└─ libc++abi → libc++ (C++ LLVM)
└─ clang air compile/linke C et C++