LLVM-19.1.0

Introduksjon til LLVM

LLVM pakken inneholder en samling av modulære og gjenbrukbare kompilator og verktøykjedet eknologier. Den lave nivået Virtuelle maskin (LLVM) Kjernebiblioteker gir en moderne kilde og mål uavhengig optimaliserer, sammen med kodegenereringsstøtte for mange populære CPUer (samt noen mindre vanlige!). Disse bibliotekene er bygget rundt en godt spesifisert koderepresentasjon kjent som LLVM mellomrepresentasjon ("LLVM IR").

Clang gir nye C, C++, Objective C og Objective C++ grensesnitt for LLVM og kreves av noen skrivebordspakker som f.eks firefox og for rust hvis det er bygget ved hjelp av systemets LLVM.

Compiler RT pakken gir kjøretids rense og profilerings biblioteker for utviklere som bruker Clang og LLVM.

[Notat]

Notat

Utviklingsversjoner av BLFS kan ikke bygge eller kjøre noen pakker riktig hvis LFS eller avhengigheter har blitt oppdatert siden den siste stabile versjonene av bøkene.

Pakkeinformasjon

Ytterligere Nedlastinger

Cmake moduler for LLVM

Tredjepartsavhengigheter for LLVM byggesystemet

Anbefalt Nedlasting

Clang

Valgfri Nedlasting

Compiler RT

LLVM Avhengigheter

Påkrevd

CMake-3.30.4

Valgfri

Doxygen-1.12.0, git-2.46.2, Graphviz-12.1.2, libxml2-2.13.4, psutil-6.0.0 (for tester), Pygments-2.18.0, PyYAML-6.0.2 (for tester), rsync-3.3.0 (for tester), texlive-20240312 (eller install-tl-unx), Valgrind-3.23.0, Zip-3.0, myst-parser (for bygging av dokumentasjonen), OCaml, og Z3

Installasjon av LLVM

To ekstra tarballer llvm-cmake-19.src.tar.xz og llvm-third-party-19.src.tar.xz er nødvendig for LLVM byggesystemet. Oppstrøms forventer at de pakkes ut på samme nivå som llvm-19.1.0.src.tar.xz tarballen, og de utpakkede mappene omdøpt til cmake og third-party. Pakk dem ut og endre byggesystemet for å unngå å lage tvetydige navn på mapper utenfor llvm-19.1.0.src hierarkiet:

tar -xf ../llvm-cmake-19.src.tar.xz                                   &&
tar -xf ../llvm-third-party-19.src.tar.xz                             &&
sed '/LLVM_COMMON_CMAKE_UTILS/s@../cmake@llvm-cmake-19.src@'          \
    -i CMakeLists.txt                                                 &&
sed '/LLVM_THIRD_PARTY_DIR/s@../third-party@llvm-third-party-19.src@' \
    -i cmake/modules/HandleLLVMOptions.cmake

Installer clang inn i kildetreet ved å kjøre følgende kommandoer:

tar -xf ../clang-19.1.0.src.tar.xz -C tools &&
mv tools/clang-19.1.0.src tools/clang

Hvis du har lastet ned compiler-rt, installer den i kildetreet ved å kjøre følgende kommandoer:

tar -xf ../compiler-rt-19.1.0.src.tar.xz -C projects    &&
mv projects/compiler-rt-19.1.0.src projects/compiler-rt

Det er mange Python skript i denne pakken som bruker /usr/bin/env python for å få tilgang til systemets Python som på LFS er Python-3.12.6. Bruk følgende kommando for å fikse disse skriptene:

grep -rl '#!.*python' | xargs sed -i '1s/python$/python3/'

Sørg for å installere FileCheck programmet som er nødvendig av testpakken til noen pakker (for eksempel rustc-1.81.0):

sed 's/utility/tool/' -i utils/FileCheck/CMakeLists.txt

Installer LLVM ved å kjøre følgende kommandoer:

mkdir -v build &&
cd       build &&

CC=gcc CXX=g++                               \
cmake -D CMAKE_INSTALL_PREFIX=/usr           \
      -D CMAKE_SKIP_INSTALL_RPATH=ON         \
      -D LLVM_ENABLE_FFI=ON                  \
      -D CMAKE_BUILD_TYPE=Release            \
      -D LLVM_BUILD_LLVM_DYLIB=ON            \
      -D LLVM_LINK_LLVM_DYLIB=ON             \
      -D LLVM_ENABLE_RTTI=ON                 \
      -D LLVM_TARGETS_TO_BUILD="host;AMDGPU" \
      -D LLVM_BINUTILS_INCDIR=/usr/include   \
      -D LLVM_INCLUDE_BENCHMARKS=OFF         \
      -D CLANG_DEFAULT_PIE_ON_LINUX=ON       \
      -D CLANG_CONFIG_FILE_SYSTEM_DIR=/etc/clang \
      -W no-dev -G Ninja ..                  &&
ninja

Hvis du ønsker å kjøre testene, fjern en test som er kjent for å henge på ubestemt tid på enkelte systemer:

rm -f ../projects/compiler-rt/test/tsan/getline_nohang.cpp

LLVM testpakken kan produsere mange kjernedumpfiler. De vil okkupere en stor mengde diskplass, og kjernedumpprosessen kan reduserer testingen betydelig. For å teste resultatene med kjernedump deaktivert, utsted:

sh -c 'ulimit -c 0 && ninja check-all'

Hvis -jN (N erstattet med et nummer) sendes til ninja, testene vil bygges med N logiske kjerner, men kjører med alle tilgjengelige logiske kjerner. Kjør testkommandoen i en cgroup ( les «Bruk Linux Control Group for å begrense ressursbruken» for detaljer) for å begrense antall logiske kjerner for å kjøre testene. To tester knyttet til TestCases/Linux/printf-fortify-5.c er kjent for å mislykkes med Glibc-2.40 eller nyere. En test navngitt Linux/clone_setns.cpp vil mislykkes hvis CONFIG_USER_NS ikke er aktivert i kjernekonfigurasjonen.

Nå, som root bruker:

ninja install

Parameterforklaringer

-D CMAKE_SKIP_INSTALL_RPATH=ON: Denne bryteren gjør at cmake fjerner hardkodede biblioteksøkebaner (rpath) når du installerer en binær kjørbar fil eller et delt bibliotek. Denne pakken trenger ikke rpath når den først er installert i standard plassering, og rpath kan noen ganger forårsake uønskede effekter eller til og med sikkerhetsproblemer.

-D LLVM_ENABLE_FFI=ON: Denne bryteren tillater LLVM å bruke libffi.

-D LLVM_BUILD_LLVM_DYLIB=ON: Denne bryteren bygger bibliotekene som statiske og kobler dem alle sammen til en unik delt. Dette er den anbefalte måten å bygge et delt bibliotek på.

-D CMAKE_BUILD_TYPE=Release: Denne bryteren aktiverer kompilatoroptimaliseringer for å øke hastigheten på koden og redusere størrelsen. Den deaktiverer også noen kompileringskontroller som ikke er nødvendige på en produksjonssystem.

-D LLVM_TARGETS_TO_BUILD="host;AMDGPU": Denne bryteren gjør det mulig å bygge for samme mål som verten, og også for r600 AMD GPU som brukes av Mesa r600 og radeonsi drivere. Standard er alle målene. Du kan bruke en semikolonseparert liste. Gyldige mål er: host, AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, LoongArch, Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SystemZ, SystemZ, VE, WebAssembly, X86, XCore, eller alle.

-D LLVM_LINK_LLVM_DYLIB=ON: Brukes sammen med -D LLVM_BUILD_LLVM_DYLIB=ON, denne bryteren aktiverer kobling av verktøyene mot det delte biblioteket i stedet for de statiske. Det reduserer størrelsen litt og sikrer også at llvm-config vil bruke libLLVM-19.so riktig.

-D LLVM_ENABLE_RTTI=ON: Denne bryteren brukes til å bygge LLVM med informasjon om kjøretidstype. Dette er nødvendig for å bygge Mesa-24.2.3.

-D LLVM_BINUTILS_INCDIR=/usr/include: Denne bryteren brukes til å fortelle byggesystemet plasseringen av binutils deklarasjoner, som ble installert i LFS. Dette tillater bygging av LLVMgold.so, som trengs for å bygge programmer med clang og Link Time Optimization (LTO).

-D LLVM_INCLUDE_BENCHMARKS=OFF: brukes til å deaktivere generasjonsbyggmål for LLVM benchmarks. Dette alternativet krever tilleggskode som ikke er tilgjengelig for øyeblikket.

-D CLANG_DEFAULT_PIE_ON_LINUX=ON: gjør -fpie alternativet standard når du kompilerer programmer. Sammen med ASLR funksjonen aktivert i kjernen, dette beseirer en slags angrep basert på kjente minneoppsett.

-D CLANG_CONFIG_FILE_SYSTEM_DIR=/etc/clang: gjør at clang og clang++ søker /etc/clang for konfigurasjonsfiler.

-D BUILD_SHARED_LIBS=ON: hvis brukt i stedet for -D LLVM_BUILD_LLVM_DYLIB=ON og -D LLVM_LINK_LLVM_DYLIB=ON, bygger alle LLVM biblioteker (ca. 60) som delte biblioteker i stedet for statiske.

-D LLVM_ENABLE_DOXYGEN: Gjør det mulig å generere søkbar HTML dokumentasjon hvis du har installert Doxygen-1.12.0. Du bør kjøre make doxygen-html etterpå, og installer den genererte dokumentasjonen manuelt.

Konfigurere LLVM

Konfigurasjonsinformasjon

Hvis du har bygget Clang, som root bruker opprett to konfigurasjonsfiler å lage SSP aktivert som standard for clang og clang++, sånn at standardkonfigurasjonen av deres SSP funksjon vil bli konsistent med GCC-14.2.0:

mkdir -pv /etc/clang &&
for i in clang clang++; do
  echo -fstack-protector-strong > /etc/clang/$i.cfg
done

Innhold

Installerte Programmer: amdgpu-arch, analyze-build, bugpoint, c-index-test, clang, clang++ (symbolkobling til clang-19), clang-19, clang-check, clang-cl, clang-cpp (siste to symbolkobling til clang), clang-extdef-mapping, clang-format, clang-linker-wrapper, clang-offload-bundler, clang-offload-packager, clang-refactor, clang-rename, clang-repl, clang-scan-deps, clang-tblgen, diagtool, dsymutil, FileCheck, git-clang-format, hmaptool, intercept-build, llc, lli, llvm-addr2line (symbolkobling til llvm-symbolizer), llvm-ar, llvm-as, llvm-bcanalyzer, llvm-bitcode-strip (symbolkobling til llvm-objcopy), llvm-cat, llvm-cfi-verify, llvm-config, llvm-cov, llvm-c-test, llvm-cvtres, llvm-cxxdump, llvm-cxxfilt, llvm-cxxmap, llvm-debuginfo-analyzer, llvm-debuginfod, llvm-debuginfod-find, llvm-diff, llvm-dis, llvm-dlltool (symbolkobling til llvm-ar), llvm-dwarfdump, llvm-dwarfutil, llvm-dwp, llvm-exegesis, llvm-extract, llvm-gsymutil, llvm-ifs, llvm-install-name-tool (symbolkobling til llvm-objcopy), llvm-jitlink, llvm-lib (symbolkobling til llvm-ar), llvm-libtool-darwin, llvm-link, llvm-lipo, llvm-lto, llvm-lto2, llvm-mc, llvm-mca, llvm-ml, llvm-modextract, llvm-mt, llvm-nm, llvm-objcopy, llvm-objdump, llvm-opt-report, llvm-otool (symbolkobling til llv-objdump), llvm-pdbutil, llvm-profdata, llvm-profgen, llvm-ranlib (symbolkobling til llvm-ar), llvm-rc, llvm-readelf (symbolkobling til llvm-readobj), llvm-readobj, llvm-readtapi, llvm-reduce, llvm-remarkutil, llvm-rtdyld, llvm-sim, llvm-size, llvm-split, llvm-stress, llvm-strings, llvm-strip (symbolkobling til llvm-objcopy), llvm-symbolizer, llvm-tblgen, llvm-tli-checker, llvm-undname, llvm-windres (symbolkobling til llvm-rc), llvm-xray, nvptx-arch, opt, sancov, sanstats, scan-build, scan-build-py, scan-view, og verify-uselistorder
Installerte Biblioteker: libLLVM.so, libLLVM*.a (100 biblioteker), libLTO.so, libRemarks.so, libclang.so, libclang-cpp.so, libclang*.a (42 biblioteker), og LLVMgold.so
Installerte Mapper: /usr/include/{clang,clang-c,llvm,llvm-c}, /usr/lib/{clang,cmake/{clang,llvm},libear,libscanbuild}, /usr/share/{clang,opt-viewer,scan-build,scan-view}, og /etc/clang

Korte Beskrivelser

amdgpu-arch

viser AMD GPUer installert; ved kjøretid trenger den libhsa-runtime64.so som ikke er en del av BLFS

analyze-build

er et statisk analyseverktøy

bugpoint

er det automatiske reduksjonsverktøyet for testtilfeller

c-index-test

brukes til å teste libclang API og demonstrere bruken

clang

er Clang C, C++, og Objective-C kompilator

clang-check

er et verktøy for å utføre statisk kodeanalyse og vise abstrakt syntaks trær (AST)

clang-extdef-mapping

er et verktøy for å samle USR navn og plasseringen til eksterne definisjoner i en kildefil

clang-format

er et verktøy for å formatere C/C++/Java/JavaScript/Objective-C/Protobuf kode

clang-linker-wrapper

er et innpakningsverktøy over vertslinkeren

clang-offload-bundler

er et verktøy for å pakke/oppløse OpenMP avlastede filer knyttet til en vanlig kildefil

clang-offload-packager

er et verktøy for å samle flere objektfiler til en enkelt binær, som deretter kan brukes til å lage en fatbinærholdig avlastningskode

clang-refactor

er et Clang basert refaktoriseringsverktøy for C, C++ og Objective-C

clang-rename

er et verktøy for å gi nytt navn til symboler i C/C++ programmer

clang-scan-deps

er et verktøy for å skanne etter avhengigheter i en kildefil

clang-tblgen

er et program som oversetter kompilatorrelatert mål beskrivelse (.td) filer til C++ kode og andre utdataformater

diagtool

er en kombinasjon av verktøy for å håndtere diagnostikk i clang

FileCheck

er et verktøy som leser to filer (en fra standardinndata, og en spesifisert på kommandolinjen) og bruker den ene til å bekrefte den andre.

dsymutil

er et verktøy som brukes til å manipulere arkiverte DWARF feilsøkingssymbolfiler, kompatibel med Darwin kommandoen dsymutil

git-clang-format

kjører clang-format på git genererte oppdateringer (krever git-2.46.2)

hmaptool

er et Python verktøy for å dumpe og konstruere deklarasjonskart

intercept-build

genererer en database med byggekommandoer for et prosjekt

llc

er LLVM statisk kompilator

lli

brukes til å kjøre programmer direkte fra LLVM bitkode

llvm-addr2line

er et verktøy som brukes til å konvertere adresser til filnavn og linjetall

llvm-ar

er LLVM arkiverer

llvm-as

er LLVM assembler

llvm-bcanalyzer

er LLVM bitkode analysator

llvm-bitcode-strip

fjerner LLVM bitkode fra et objekt

llvm-cat

er et verktøy for å sette sammen llvm moduler

llvm-cfi-verify

identifiserer om Control Flow Integrity beskytter alle indirekte kontrollflytinstruksjoner i den medfølgende objektfilen, DSO, eller binære

llvm-config

Printer LLVM kompileringsalternativer

llvm-cov

brukes til å sende ut dekningsinformasjon

llvm-c-test

er en bytecode disassembler

llvm-cvtres

er et verktøy for å konvertere Microsoft ressursfiler til COFF

llvm-cxxdump

brukes som en C++ ABI Data Dumper

llvm-cxxfilt

brukes til å demangle C++ symboler i llvm kode

llvm-cxxmap

brukes til å omforme C++ manglede symboler

llvm-debuginfo-analyzer

skriver ut en logisk representasjon av feilsøkingsinformasjon på lavt nivå

llvm-debuginfod

er en tjeneste som gir feilsøkingsinformasjon over en HTTP API for å analysere strippede binære filer

llvm-debuginfod-find

er et grensesnitt til llvm-debuginfod nissen for å finne debuginfod artefakter

llvm-diff

er LLVM strukturelle 'diff'

llvm-dis

er LLVM disassembler

llvm-dwarfdump

skriver ut innholdet av DWARF seksjoner i objektfiler

llvm-dwarfutil

er et verktøy for å kopiere og manipulere feilsøkingsinformasjon

llvm-dwp

slår sammen delte DWARF filer

llvm-elfabi

brukes til å lese informasjon om en ELF binærs ABI

llvm-exegesis

er et benchmarking verktøy som bruker informasjon tilgjengelig i LLVM til å måle vertsmaskininstruksjonskarakteristikker som latens eller portnedbrytning

llvm-extract

brukes til å trekke ut en funksjon fra en LLVM modul

llvm-gsymutil

brukes til å behandle GSYM Symbolication Format filer som konvertere minneadresser til funksjonsnavn og kildefillinje. Disse filene er mindre enn DWARF- eller Breakpad-filer

llvm-ifs

brukes til å slå sammen grensesnittstubs med objektfiler

llvm-install-name-tool

brukes til å omskrive lastekommandoer til MachO binært format

llvm-jitlink

brukes til å analysere flyttbare objektfiler for å lage innholdet kjørbar i en målprosess

llvm-libtool-darwin

gir grunnleggende libtool funksjonalitet på Darwin-baserte systemer. Dette er mest nyttig hvis du genererer binærfiler for macOS systemer

llvm-link

er LLVM linker

llvm-lipo

brukes til å lage universelle binærfiler fra MachO filer

llvm-lto

er LLVM LTO (link time optimization) linker

llvm-lto2

er en testpakke for det oppløsningsbaserte LTO grensesnittet

llvm-mc

er en frittstående maskinkode assembler/disassembler

llvm-mca

er et ytelsesanalyseverktøy for statisk å måle ytelsen til maskinkoden

llvm-ml

er en lekeplass for maskinkode levert av LLVM

llvm-modextract

er et verktøy for å trekke ut en modul fra flermodul bitkodefiler

llvm-mt

er et verktøy for å generere signerte filer og mapper fra en side-by-side monteringsmanifest (brukes for Microsoft SDK)

llvm-nm

brukes til å liste LLVM bitkode og objektfilens symboltabell

llvm-objcopy

er LLVMs versjon av et objektfil verktøy

llvm-objdump

er en LLVM objektfil dumper

llvm-opt-report

er et verktøy for å generere en optimaliseringsrapport fra YAML optimalisering opptaksfiler

llvm-pdbutil

er en PDB (Program Database) dumper. PDB er et Microsoft format

llvm-profdata

er et lite verktøy for å manipulere og skrive ut profildatafiler

llvm-profgen

genererer LLVM SPGO profileringsinformasjon

llvm-ranlib

brukes til å generere en indeks for et LLVM arkiv

llvm-rc

er et plattformuavhengig verktøy for å kompilere ressursskript inn i binære ressursfiler

llvm-readobj

viser formatspesifikk informasjon på lavt nivå om objektfiler

llvm-readtapi

er LLVM TAPI filleseren og transformatoren

llvm-reduce

brukes til å automatisk redusere testcases når du kjører en testpakke

llvm-remarkutil

konverterer merknadsfiler mellom bitstrøm og YAML; eller skriver ut funksjonsinstruksjon telleinformasjon i merknadsfiler

llvm-rtdyld

er LLVM MC-JIT verktøy

llvm-size

er LLVM objektstørrelse dumper

llvm-split

er LLVM modul splitter

llvm-stress

brukes til å generere tilfeldige .ll filer

llvm-strings

skrive ut strenger funnet i en binær (objektfil, kjørbar eller arkivbibliotek)

llvm-symbolizer

konverterer adresser til kildekodeplasseringer

llvm-tblgen

er LLVM Target Description To C++ Code Generator

llvm-tli-checker

er LLVM TargetLibraryInfo kontra SDK kontroll

llvm-undname

er et verktøy for å demangle navn

llvm-xray

er en implementering av Googles XRay funksjonsanropssporingssystem

nvptx-arch

viser NVIDIA GPUer installert; ved kjøretid trenger den libcuda.so som ikke er en del av BLFS

opt

er LLVM optimizer

sancov

er behandlingsverktøyet for rensedekning

sanstats

er behandlingsverktøyet for rensestatistikk

scan-build

er Perl skript som påkaller Clang statiske analysator

scan-build-py

er Python skript som påkaller Clang statiske analysator

scan-view

er en viser for Clang statiske analysator resultater

verify-uselistorder

er LLVM verktøy for å bekrefte brukslistens rekkefølge