LLVM-20.1.7

Introduksjon til LLVM

LLVM pakken inneholder en samling av modulære og gjenbrukbare kompilator og verktøykjedeteknologier. Lavnivå virtuelle maskin (LLVM) kjernebibliotekene gir en moderne kilde og måluavhengig optimalisering, sammen med støtte for kodegenerering for mange populære CPUer, samt noen mindre vanlige. Disse bibliotekene er bygget rundt en velspesifisert koderepresentasjon kjent som LLVM mellomrepresentasjonen ("LLVM IR").

Clang tilbyr nye C, C++, Objective C og Objective C++ grensesnitt for LLVM og er nødvendig for noen skrivebordspakker som Firefox og for rustc-1.88.0 hvis det er bygget ved hjelp av systemets LLVM.

Compiler RT pakken inneholder kjøretidsrenser og profileringsbiblioteker for utviklere som bruker Clang og LLVM.

Instruksjonene nedenfor vil installere alle disse prosjektene, men du kan hoppe over installasjonen av noen av de valgfrie pakkene hvis ønskelig.

[Notat]

Notat

Dette kan ta litt tid å bygge. Gjør gjerne noe annet mens dette bygges.

LLVM Avhengigheter

Påkrevd

CMake-4.0.3

Nedlasting av LLVM tarballer

Tarballene som skal lastes ned har dårlig navn og kan komme i konflikt med andre tarballer som kan være i gjeldende mappe. Instruksjonene nedenfor omgår dette ved å plassere tarballene i en ny mappe slik at de er isolert.

Først, lag en liste over filer som skal lastes ned:

cat > llvm-20.1.7-list << "EOF"
# The three tarballs below are required
llvm-20.1.7.src.tar.xz
cmake-20.1.7.src.tar.xz
third-party-20.1.7.src.tar.xz

# The following clang tarball is for Clang (Recommended)
clang-20.1.7.src.tar.xz

# The following compiler-rt tarball is for Compiler RT (Recommended)
compiler-rt-20.1.7.src.tar.xz
EOF

For å laste ned de nødvendige filene ved hjelp av Wget-1.25.0, bruk følgende kommandoer:

mkdir llvm &&
cd llvm &&
grep -v '^#' ../llvm-20.1.7-list | wget -i- -c \
    -B https://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.7/

Installasjon av LLVM

Pakk ut llvm-20.1.7.src.tar.xz tarballen og naviger til den utpakkede llvm-20.1.7.src mappen:

tar -xf llvm-20.1.7.src.tar.xz &&
cd llvm-20.1.7.src

cmake-20.1.7.src.tar.xz og third-party-20.1.7.src.tar.xz tarballene er nødvendig for LLVM byggeprosessen. cmake-20.1.7.src.tar.xz tarballen inkluderer CMake moduler som LLVM bruker, for eksempel riktig angivelse av versjonsnummeret. third-party-20.1.7.src.tar.xz tarballen inkluderer avhengigheter, som benchmark og unittest. Oppstrøms forventer at begge tarballene pakkes ut på samme nivå som llvm-20.1.7.src.tar.xz tarballen. I tillegg må de utpakkede mappene gis nytt navn til cmake og third-party henholdsvis. Pakk dem ut og modifiser byggesystemet for å unngå å opprette tvetydig navngitte mapper utenfor llvm-20.1.7.src hierarkiet:

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

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

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

Pakk ut compiler-rt inn i kildetreet ved å kjøre følgende kommandoer:

tar -xf ../compiler-rt-20.1.7.src.tar.xz -C projects    &&
mv projects/compiler-rt-20.1.7.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 Python3. 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 for testpakken til noen pakker (for eksempel rustc-1.88.0):

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

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

mkdir 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="X86;host;AMDGPU;NVPTX" \
      -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

Nå, som root bruker:

ninja install &&
cp bin/FileCheck /usr/bin

lib32 Installasjon av LLVM

Hvis du bruker multilib, må du også installere 32-bit kjøretids bibliotekene. Installer dem ved å gjøre følgende:

rm -rf * &&

CC=gcc CXX=g++                                          \
cmake -D CMAKE_INSTALL_PREFIX=/usr                      \
      -D CMAKE_C_FLAGS:STRING=-m32                      \
      -D CMAKE_SKIP_INSTALL_RPATH=ON                    \
      -D CMAKE_CXX_FLAGS:STRING=-m32                    \
      -D LLVM_TARGET_ARCH:STRING=i686                   \
      -D LLVM_LIBDIR_SUFFIX=32                          \
      -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_DEFAULT_TARGET_TRIPLE="i686-pc-linux-gnu" \
      -D LLVM_TARGETS_TO_BUILD="X86;host;AMDGPU;NVPTX"  \
      -D LLVM_HOST_TRIPLE="x86_64-pc-linux-gnu"         \
      -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

Nå som root bruker:

DESTDIR=$PWD/DESTDIR ninja install    &&
cp -vr DESTDIR/usr/lib32/* /usr/lib32 &&
rm -rf DESTDIR                        &&
ldconfig

Parameterforklaringer

[Notat]

Notat

For en fullstendig liste over alternativer og verdier, sørg for at du er i en byggemappe, og kjør deretter cmake -LAH ...

-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 til et unikt delt bibliotek. Dette er den anbefalte måten å bygge et delt bibliotek på, og det er obligatorisk for rustc-1.88.0 for å bygge mot det systeminstallerte LLVM.

-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å et produksjonssystem.

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

-D LLVM_TARGETS_TO_BUILD="X86;host;AMDGPU;NVPTX": Denne bryteren muliggjør bygging for x86, samme mål som verten, for r600 AMD GPUen som brukes av Mesa-25.1.4 r600 og radeonsi drivere, samt NVIDIA GPUer som brukes sammen med CUDA. Standardinnstillingen 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 all.

-D LLVM_LINK_LLVM_DYLIB=ON: Brukes sammen med -D LLVM_BUILD_LLVM_DYLIB=ON, Denne bryteren muliggjør kobling av verktøyene mot det delte biblioteket i stedet for de statiske. Den reduserer størrelsen deres litt og sikrer også at llvm-config vil bruke riktig libLLVM-20.

-D LLVM_ENABLE_RTTI=ON: Denne bryteren brukes til å bygge LLVM med kjøretidstypeinformasjon. Dette er nødvendig for å bygge Gallium3D LLVMpipe fra Mesa-25.1.4.

-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, som er nødvendig for å bygge programmer med clang og Koblingstidspunkt Optimalisering (LTO).

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

-D CLANG_DEFAULT_PIE_ON_LINUX=ON: gjør -fpie standardalternativet når programmer kompileres. Sammen med ASLR funksjonen aktivert i kjernen, dette bekjemper noen typer 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, bygges alle LLVM biblioteker (omtrent 60) som delte biblioteker i stedet for statiske.

Konfigurere LLVM

Konfigurasjonsinformasjon

Hvis du har bygget Clang, som root brukeren oppretter to konfigurasjonsfiler for å lage SSP aktivert som standard for clang og clang++, så standardkonfigurasjonen til SSP funksjonen deres vil være konsistent med GCC:

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++ (symlinks to clang-20), clang-20, clang-check, clang-cl, clang-cpp (de to siste symbollenker til clang), clang-extdef-mapping, clang-format, clang-installapi, clang-linker-wrapper, clang-nvlink-wrapper, clang-offload-bundler, clang-offload-packager, clang-refactor, clang-repl, clang-scan-deps, clang-sycl-linker, clang-tblgen, diagtool, dsymutil, FileCheck, git-clang-format, hmaptool, intercept-build, llc, lli, llvm-addr2line (symbollenke til llvm-symbolizer), llvm-ar, llvm-as, llvm-bcanalyzer, llvm-bitcode-strip (symbollenke til llvm-objcopy), llvm-cat, llvm-cfi-verify, llvm-cgdata, llvm-config, llvm-cov, llvm-c-test, llvm-ctxprog-util, llvm-cvtres, llvm-cxxdump, llvm-cxxfilt, llvm-cxxmap, llvm-debuginfo-analyzer, llvm-debuginfod, llvm-debuginfod-find, llvm-diff, llvm-dis, llvm-dlltool (symbollenke til llvm-ar), llvm-dwarfdump, llvm-dwarfutil, llvm-dwp, llvm-exegesis, llvm-extract, llvm-gsymutil, llvm-ifs, llvm-install-name-tool (symbollenke til llvm-objcopy), llvm-jitlink, llvm-lib (symbollenke 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 (symbollenke til llv-objdump), llvm-pdbutil, llvm-profdata, llvm-profgen, llvm-ranlib (symbollenke til llvm-ar), llvm-rc, llvm-readelf (symbollenke 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 (symbollenke til llvm-objcopy), llvm-symbolizer, llvm-tblgen, llvm-tli-checker, llvm-undname, llvm-windres (symbollenke til llvm-rc), llvm-xray, nvptx-arch, opt, sancov, sanstats, scan-build, scan-build-py, scan-view, og verify-uselistorder
Installerte Biblioteker: libLLVM, libLLVM* (107 statiske biblioteker), libLTO, libRemarks, libclang, libclang-cpp, libclang* (43 statiske biblioteker), og LLVMgold
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 installerte AMD GPUer; ved kjøretid trenger den libhsa-runtime64 som ikke er en del av BLFS

analyze-build

er et statisk analyseverktøy

bugpoint

er det automatiske verktøyet for reduksjon av testtilfeller

c-index-test

brukes til å teste libclang API og demonstrere bruken av den

clang

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

clang-check

er et verktøy for å utføre statisk kodeanalyse og vise et sammendrag av syntaks trær ((Abstract Syntax Trees)(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 vertslenkeren

clang-offload-bundler

er et verktøy for å pakke/avpakke OpenMP avlastede filer tilknyttet en felles kildefil.

clang-offload-packager

er et verktøy for å samle flere objektfiler til én enkelt binærfil, som deretter kan brukes til å lage en fatbinærfil som inneholder avlastningskode

clang-refactor

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

clang-scan-deps

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

clang-tblgen

er et program som oversetter kompilatorrelaterte 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 (én fra standard inndata og én 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)

hmaptool

er et Pythonverktøy for å dumpe og konstruere deklarasjonskart

intercept-build

genererer en database med byggekommandoer for et prosjekt

llc

er LLVM statiske 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 linjenumre

llvm-ar

er LLVM arkiver

llvm-as

er LLVM assembler

llvm-bcanalyzer

er LLVM bitkodeanalysator

llvm-bitcode-strip

stripper LLVM bitkode fra et objekt

llvm-cat

er et verktøy for å sammenkoble llvm moduler

llvm-cfi-verify

identifiserer om kontrollflytintegritet beskytter alle indirekte kontrollflytinstruksjoner i den oppgitte objektfilen, DSO eller binærfilen.

llvm-config

Skriver ut LLVM kompileringsalternativer

llvm-cov

brukes til å sende ut dekningsinformasjon

llvm-c-test

er en bytekode demonterer

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 å omdefinere mangled C++ symboler

llvm-debuginfo-analyzer

skriver ut en logisk representasjon av lavnivå feilsøkingsinformasjon

llvm-debuginfod

er en tjeneste som tilbyr feilsøkingsinformasjon over et HTTP API for å analysere fjernede binærfiler

llvm-debuginfod-find

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

llvm-diff

er LLVM strukturelle 'diff'

llvm-dis

er LLVM disassembler

llvm-dwarfdump

skriver ut innholdet i 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ærfils ABI

llvm-exegesis

er et benchmarkingverktøy som bruker informasjon tilgjengelig i LLVM til å måle instruksjonsegenskaper for vertsmaskinen, som latens eller portdekomposisjon

llvm-extract

brukes til å trekke ut en funksjon fra en LLVM modul

llvm-gsymutil

brukes til å behandle GSYM Symboliseringsformatfiler som konverterer minneadresser til funksjonsnavn og kildefillinje. Disse filene er mindre enn DWARF eller Breakpad filer

llvm-ifs

brukes til å slå sammen grensesnittstubber med objektfiler

llvm-install-name-tool

brukes til å omskrive lastekommandoer til MachO binærformat

llvm-jitlink

brukes til å analysere flyttbare objektfiler for å gjøre innholdet deres kjørbart 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 lenker

llvm-lipo

brukes til å lage universelle binærfiler fra MachO filer

llvm-lto

er LLVM LTO (koblingstidsoptimalisering) lenker

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åling av ytelsen til maskinkode

llvm-ml

er en lekeplass for maskinkode levert av LLVM

llvm-modextract

er et verktøy for å trekke ut én modul fra multimodul bitkodefiler

llvm-mt

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

llvm-nm

brukes til å liste LLVM bitkode og objektfilens symboltabell

llvm-objcopy

er LLVM sin versjon av et objcopy verktøy

llvm-objdump

er en LLVM objektfildumper

llvm-opt-report

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

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 til 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 testtilfeller når en testpakke kjøres

llvm-remarkutil

konverterer kommentarfiler mellom bitstrøm og YAML; eller skriver ut informasjon om antall funksjonsinstruksjoner i kommentarfiler

llvm-rtdyld

er LLVM MC-JIT verktøyet

llvm-size

er LLVM objektstørrelsesdumper

llvm-split

er LLVM modulsplitter

llvm-stress

brukes til å generere tilfeldige .ll filer

llvm-strings

skriver ut strenger funnet i en binærfil (objektfil, kjørbar fil eller arkivbibliotek)

llvm-symbolizer

konverterer adresser til kildekodeplasseringer

llvm-tblgen

er LLVM målbeskrivelse til C++ kodegenerator

llvm-tli-checker

er LLVM TargetLibraryInfo versus SDK sjekker

llvm-undname

er et verktøy for å demangle navn

llvm-xray

er en implementering av Googles XRay funksjonskallsporingssystem

nvptx-arch

lister installerte NVIDIA GPUer; ved kjøretid trenger den libcuda fra NVIDIA-575.64

opt

er LLVM optimaliserer

sancov

er rensedekning prosesseringsverktøy

sanstats

er rensestatistikk prosesseringsverktøy

scan-build

er et Perl skript som påkaller Clang statisk analysator

scan-build-py

er et Python skript som påkaller Clang statisk analysator

scan-view

er en viser for Clang statisk analysator resultat

verify-uselistorder

er LLVM verktøy for å verifisere use-list rekkefølge