gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

⎇ main recipes/compiler-rt-profile.toml TOML · 103 siq'ikuna · 5.2 KB Ñawpa willay ch'uya

compiler-rt-profile: la runtime de perfilado que el lab no trae (b3:32dff740) f9d457207 · Sergio ·

1# compiler-rt-profile — la runtime de PERFILADO de compiler-rt para el target nativo.
2#
3# QUÉ ES: `libclang_rt.profile.a`, la librería que implementa los `__llvm_profile_*` y que ESCRIBE
4# los ficheros `.profraw`. Sin ella, `-fprofile-generate` compila y no enlaza.
5#
6# ══ POR QUÉ EXISTE: EL LAB NO TRAE NINGUNA RUNTIME DE COMPILER-RT ══════════════════════════════
7# Lo descubrió el build del firefox instrumentado, en el minuto 38:56:
8#
9#     ld.lld: error: cannot open
10#       /usr/lib/llvm22/lib/clang/22/lib/x86_64-alpine-linux-musl/libclang_rt.profile.a
11#
12# El lab trae clang 22.1.8 con su `include/` pero **el `lib/` del resource dir no existe** — es
13# exactamente lo que ya documentaba `recipes/wasi-compiler-rt.toml` para el caso wasm. Esta receta
14# es su HERMANA NATIVA: mismo tarball, mismo patrón, mismo sitio de aterrizaje; lo que cambia es el
15# target (x86_64 en vez de wasm32) y el componente (profile en vez de builtins).
16#
17# ⚠ LA VERSIÓN SIGUE A LA DEL LAB, igual que su hermana y por lo mismo: la runtime de perfilado es
18# un contrato con el clang que la va a usar (el formato del `.profraw` tiene versión). El tarball es
19# 22.1.8 y el lab trae llvm22 22.1.8-r1. Como `clang`/`llvm` son prefijos de `TOOLCHAIN_PREFIXES`,
20# un bump del lab mueve la huella y re-hashea esto solo: la alineación está vigilada, no confiada.
21#
22# DÓNDE ATERRIZA: `/usr/lib/llvm22/lib/clang/22/lib/<triple>/`, que es donde clang la busca sin que
23# nadie le pase un flag — el layout "per-target runtime dir", que es el que nombra el error. En el
24# lab ese directorio no existe y las deps se apilan como overlay BAJO el rootfs, así que esta receta
25# lo CREA sin pisar nada.
26name    = "compiler-rt-profile"
27version = "22.1.8"
28license = "Apache-2.0 WITH LLVM-exception"
29
30[source]
31tarball = "https://github.com/llvm/llvm-project/releases/download/llvmorg-22.1.8/llvm-project-22.1.8.src.tar.xz"
32sha256  = "922f1817a0df7b1489272d18134ee0087a8b068828f87ac63b9861b1a9965888"
33
34[build]
35compiler = "clang"
36
37[deps]
38# `python3` por lo mismo que en la hermana: el CMakeLists de compiler-rt busca Python3 y sin él cae
39# a un `find_package(Python2 ... REQUIRED)` que muere diciendo «Could NOT find Python2» — el mensaje
40# nombra el fallback, no la causa.
41build = ["cmake", "samurai", "python3"]
42
43[build.phases]
44configure = '''
45set -e
46# Se apaga TODO menos profile. compiler-rt trae sanitizers, xray, memprof, orc… y ninguno hace falta
47# acá; construirlos multiplicaría el tiempo y ampliaría la superficie de fallo sin destinatario.
48unset CFLAGS CXXFLAGS LDFLAGS
49cmake -B build -G Ninja -S compiler-rt -Wno-dev \
50  -DCMAKE_BUILD_TYPE=MinSizeRel \
51  -DCMAKE_C_COMPILER=clang \
52  -DCMAKE_CXX_COMPILER=clang++ \
53  -DCMAKE_AR=/usr/bin/llvm-ar \
54  -DCMAKE_RANLIB=/usr/bin/llvm-ranlib \
55  -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
56  -DCMAKE_C_COMPILER_TARGET=x86_64-alpine-linux-musl \
57  -DCMAKE_CXX_COMPILER_TARGET=x86_64-alpine-linux-musl \
58  -DCMAKE_ASM_COMPILER_TARGET=x86_64-alpine-linux-musl \
59  -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON \
60  -DCOMPILER_RT_BUILD_PROFILE=ON \
61  -DCOMPILER_RT_BUILD_BUILTINS=OFF \
62  -DCOMPILER_RT_BUILD_SANITIZERS=OFF \
63  -DCOMPILER_RT_BUILD_XRAY=OFF \
64  -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
65  -DCOMPILER_RT_BUILD_MEMPROF=OFF \
66  -DCOMPILER_RT_BUILD_ORC=OFF \
67  -DCOMPILER_RT_BUILD_CTX_PROFILE=OFF \
68  -DCOMPILER_RT_INCLUDE_TESTS=OFF \
69  -DCMAKE_INSTALL_PREFIX=/usr/lib/llvm22/lib/clang/22/
70'''
71compile = 'cmake --build build'
72install = '''
73set -e
74DESTDIR=/out cmake --install build
75
76RES=/out/usr/lib/llvm22/lib/clang/22
77# El `include/` del resource dir es del LAB (los headers de clang). Instalarlo desde acá lo taparía
78# con una copia del tarball — la misma trampa que su hermana wasm documenta y evita.
79rm -rf "$RES/include"
80
81# ── GUARDIÁN 1: el fichero EXACTO que el enlazador pidió ─────────────────────────────────────
82# No «alguna libclang_rt»: la ruta literal del error, porque el layout per-target es una opción de
83# cmake y equivocarla deja la librería instalada donde clang no mira. Es el mismo fallo que la
84# libstdc++ en /usr/lib64 de esta misma noche, un directorio más allá.
85A="$RES/lib/x86_64-alpine-linux-musl/libclang_rt.profile.a"
86test -s "$A" || {
87  echo "!! no está $A — ¿cambió el layout del resource dir?" >&2
88  find /out -name 'libclang_rt*' >&2
89  exit 1
90}
91echo "guardián: $A ($(stat -c%s "$A") bytes)"
92
93# ── GUARDIÁN 2: LA PRUEBA DEL CONSUMIDOR ─────────────────────────────────────────────────────
94# «Existe» no es «sirve». Se exige que DEFINA lo que un binario instrumentado va a buscar: la
95# función que vuelca el `.profraw` y el contador de versión del formato. Si el `.a` sale vacío o
96# con otro componente dentro, esto lo caza acá y no al final de una corrida de perfilado.
97falta=""
98for s in __llvm_profile_write_file __llvm_profile_get_version __llvm_profile_initialize_file; do
99  llvm-nm --defined-only "$A" 2>/dev/null | grep -qE " $s(@|$)" || falta="$falta $s"
100done
101test -z "$falta" || { echo "!! el .a no define:$falta" >&2; exit 1; }
102echo "guardián: define los símbolos que emite -fprofile-generate"
103'''