LLVM-18.1.7

Introdução ao LLVM

O pacote LLVM contém uma coleção de compiladores modulares e reusáveis e tecnologias de conjunto de ferramentas. As bibliotecas centrais Low Level Virtual Machine (LLVM) fornecem um otimizador moderno independente de origem e destino, junto com suporte para geração de código para muitas CPUs populares (bem como algumas menos comuns!). Essas bibliotecas são construídas em torno de uma representação de código bem especificada, conhecida como a LLVM Intermediate Representation ("LLVM IR").

Clang fornece novas estruturas C, C++, Objective C e Objective C++ de interação direta com o(a) usuário(a) para o LLVM e é exigido por alguns pacotes de área de trabalho, como firefox, e para rust se for construído usando o sistema LLVM.

O pacote Compiler RT fornece higienizador de tempo de execução e bibliotecas de perfilamento para desenvolvedores(as) que usam Clang e LLVM.

Esse pacote é conhecido por construir e funcionar corretamente usando uma plataforma LFS 12.2.

Informação do Pacote

  • Transferência (HTTP): https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.7/llvm-18.1.7.src.tar.xz

  • Transferência (FTP):

  • Soma de verificação MD5 da transferência: ad39785449a878df1eed590339c3a8c4

  • Tamanho da transferência: 60 MB

  • Espaço em disco estimado exigido: 3,5 GB (964 MB instalado; adicionar 20 GB para testes e 308 MB para documentação)

  • Tempo de construção estimado: 13 UPC (Adicionar 8 UPC para testes; ambos usando paralelismo=8)

Transferências Adicionais

módulos Cmake para LLVM

Dependências de terceiros(as) para sistema de construção LLVM

Transferência Recomendada

Clang

Transferência Opcional

Compilador RT

Dependências do LLVM

Exigidas

CMake-3.30.2

Opcionais

Doxygen-1.12.0, git-2.46.0, Graphviz-12.1.0, libxml2-2.13.3, psutil-6.0.0 (para testes), Pygments-2.18.0, PyYAML-6.0.2 (para testes), rsync-3.3.0 (para testes), Systemd-256.4 (reconstruído com PAM, para testes), texlive-20240312 (ou install-tl-unx), Valgrind-3.23.0, Zip-3.0, myst-parser (para construir documentação), OCaml e Z3

Instalação do LLVM

Dois tarballs adicionais llvm-cmake-18.src.tar.xz e llvm-third-party-18.src.tar.xz são necessários para o sistema de construção do LLVM. O(A) fluxo de desenvolvimento espera eles extraídos no mesmo nível, como o tarball llvm-18.1.7.src.tar.xz, e os diretórios extraídos renomeados para cmake e third-party. Extraia-os e modifique o sistema de construção para evitar criar diretórios ambiguamente nomeados fora da hierarquia llvm-18.1.7.src:

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

Instale o clang na árvore do fonte executando os seguintes comandos:

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

Se você tiver baixado compiler-rt, instale-o na árvore do fonte executando os seguintes comandos:

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

Existem muitos conjuntos de comandos sequenciais Python nesse pacote que usam /usr/bin/env python para acessar o Python do sistema, que no LFS é Python-3.12.5. Use o seguinte comando para corrigir esses conjuntos de comandos sequenciais:

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

Certifique-se de instalar o programa FileCheck que é necessário para a suíte de teste de alguns pacotes (por exemplo rustc-1.80.1):

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

Instale o LLVM executando os seguintes comandos:

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

Se você desejar executar os testes, remova um caso de teste conhecido por travar indefinidamente em alguns sistemas:

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

A suíte de testes do LLVM pode produzir muitos arquivos de despejo de core. Eles ocuparão uma grande quantidade de espaço em disco e o processo de despejo de core pode retardar significativamente a testagem. Para testar os resultados com o despejo de core desabilitado, certifique-se de que Systemd-256.4 e Shadow-4.16.0 tenham sido reconstruídos com suporte a Linux-PAM-1.6.1 (se você estiver interagindo por meio de uma sessão SSH ou gráfica, certifique-se também de que o servidor OpenSSH-9.8p1 ou o gerenciador de área de trabalho tenha sido construído com Linux-PAM-1.6.1) e a sessão de login atual seja iniciada depois de atualizar o arquivo /etc/pam.d/system-session para incluir pam_systemd.so e, em seguida, emita:

systemctl   --user start dbus &&
systemd-run --user --pty -d -G -p LimitCORE=0 ninja check-all

Se -jN (N substituído por um número) for passado para ninja, os testes serão construídos com N núcleos lógicos, mas executados usando todos os núcleos lógicos disponíveis. Execute o comando de teste em um cgroup (passe a opção -p AllowedCPUs=... para o comando systemd-run, leia “Use o Grupo de Controle do Linux para Limitar o Uso de Recursos” para detalhes) para limitar o número de núcleos lógicos para executar os testes. Dois testes relacionados a TestCases/Linux/printf-fortify-5.c são conhecidos por falharem com Glibc-2.40 ou mais recente. Um teste chamado Linux/clone_setns.cpp falhará se CONFIG_USER_NS não estiver habilitado na configuração do núcleo.

Agora, como o(a) usuário(a) root:

ninja install

Explicações do Comando

-D CMAKE_SKIP_INSTALL_RPATH=ON: Essa chave faz com que cmake remova caminhos de pesquisa de biblioteca rigidamente codificados (rpath) ao instalar um arquivo binário executável ou uma biblioteca compartilhada. Esse pacote não precisa do rpath depois de instalado no local padrão, e o rpath ocasionalmente pode causar efeitos indesejados ou até mesmo problemas de segurança.

-D LLVM_ENABLE_FFI=ON: Essa chave permite que o LLVM use libffi.

-D LLVM_BUILD_LLVM_DYLIB=ON: Essa chave constrói as bibliotecas como estáticas e vincula todas elas em uma biblioteca compartilhada exclusiva. Essa é a forma recomendada de construir uma biblioteca compartilhada.

-D CMAKE_BUILD_TYPE=Release: Essa chave habilita otimizações do compilador para a finalidade de acelerar o código e reduzir o tamanho dele. Também desabilita algumas verificações de compilação que não são necessárias em um sistema de produção.

-D LLVM_TARGETS_TO_BUILD="host;AMDGPU": Essa chave habilita construir para o mesmo alvo que o anfitrião e, também, para a GPU r600 da AMD, usada pelos controladores r600 e radeonsi do Mesa. O padrão é todos os alvos. Você pode usar uma lista separada por ponto e vírgula. Os alvos válidos são: host, AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, LoongArch, Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SystemZ, SystemZ, VE, WebAssembly, X86, XCore ou all.

-D LLVM_LINK_LLVM_DYLIB=ON: Usado em conjunção com -D LLVM_BUILD_LLVM_DYLIB=ON, essa chave habilita vincular as ferramentas à biblioteca compartilhada em vez das estáticas. Reduz ligeiramente o tamanho delas e também garante que "llvm-config" usará corretamente "libLLVM-18.so".

-D LLVM_ENABLE_RTTI=ON: Essa chave é usada para construir LLVM com informações de tipo de tempo de execução. Isso é necessário para construir Mesa-24.1.5.

-D LLVM_BINUTILS_INCDIR=/usr/include: Essa chave é usada para informar ao sistema de construção o local dos cabeçalhos do binutils, que foram instalados no LFS. Isso permite a construção de LLVMgold.so, que é necessário para construir aplicativos com clang e Link Time Optimization (LTO).

-D LLVM_INCLUDE_BENCHMARKS=OFF: é usado para desabilitar geração de alvos de construção para as avaliações do LLVM. Essa opção exige código adicional que não está disponível atualmente.

-D CLANG_DEFAULT_PIE_ON_LINUX=ON: torna a opção -fpie o padrão ao compilar aplicativos. Junto com o recurso ASLR habilitado no núcleo, isso derrota alguns tipos de ataques baseados em esquemas conhecidos de memória.

-D CLANG_CONFIG_FILE_SYSTEM_DIR=/etc/clang: faz com que clang e clang++ pesquisem /etc/clang para arquivos de configuração.

-D BUILD_SHARED_LIBS=ON: se usado em vez de -D LLVM_BUILD_LLVM_DYLIB=ON e -D LLVM_LINK_LLVM_DYLIB=ON, constrói todas as bibliotecas LLVM (cerca de sessenta (60)) como bibliotecas compartilhadas em vez de estáticas.

-D LLVM_ENABLE_DOXYGEN: habilita a geração de documentação HTML navegável se você tiver instalado Doxygen-1.12.0. Você deveria executar make doxygen-html depois e instalar a documentação gerada manualmente.

Configurando LLVM

Informação de Configuração

Se você tiver construído o Clang, como o(a) usuário(a) root, crie dois arquivos de configuração para tornar SSP habilitado por padrão para clang e clang++, de forma que a configuração padrão do recurso SSP deles seja consistente com GCC-14.2.0:

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

Conteúdo

Aplicativos Instalados: amdgpu-arch, analyze-build, bugpoint, c-index-test, clang, clang++ (links simbólicos para clang-18), clang-18, clang-check, clang-cl, clang-cpp (os últimos dois links simbólicos para 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 (link simbólico para llvm-symbolizer), llvm-ar, llvm-as, llvm-bcanalyzer, llvm-bitcode-strip (link simbólico para 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 (link simbólico para llvm-ar), llvm-dwarfdump, llvm-dwarfutil, llvm-dwp, llvm-exegesis, llvm-extract, llvm-gsymutil, llvm-ifs, llvm-install-name-tool (link simbólico para llvm-objcopy), llvm-jitlink, llvm-lib (link simbólico para 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 (link simbólico para llv-objdump), llvm-pdbutil, llvm-profdata, llvm-profgen, llvm-ranlib (link simbólico para llvm-ar), llvm-rc, llvm-readelf (link simbólico para llvm-readobj), llvm-readobj, llvm-readtapi, llvm-reduce, llvm-remarkutil, llvm-rtdyld, llvm-sim, llvm-size, llvm-split, llvm-stress, llvm-strings, llvm-strip (link simbólico para llvm-objcopy), llvm-symbolizer, llvm-tblgen, llvm-tli-checker, llvm-undname, llvm-windres (link simbólico para llvm-rc), llvm-xray, nvptx-arch, opt, sancov, sanstats, scan-build, scan-build-py, scan-view e verify-uselistorder
Bibliotecas Instaladas: libLLVM.so, libLLVM*.a (100 bibliotecas), libLTO.so, libRemarks.so, libclang.so, libclang-cpp.so, libclang*.a (42 bibliotecas) e LLVMgold.so
Diretórios Instalados: /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} e /etc/clang

Descrições Curtas

amdgpu-arch

lista as GPUs AMD instaladas; em tempo de execução ele precisa de libhsa-runtime64.so que não é parte do BLFS

analyze-build

é uma ferramenta de análise estática

bugpoint

é a ferramenta automática de redução de casos de teste

c-index-test

é usado para testar a API da libclang e demonstrar o uso dela

clang

é o compilador C, C++ e Objective-C do Clang

clang-check

é uma ferramenta para realizar análise estática de código e exibir Abstract Syntax Trees (AST)

clang-extdef-mapping

é uma ferramenta para coletar o nome do USR e o local de definições externas em um arquivo de fonte

clang-format

é uma ferramenta para formatar código C/C++/Java/JavaScript/Objective-C/Protobuf

clang-linker-wrapper

é um utilitário envólucro sobre o vinculador de dispositivo

clang-offload-bundler

é uma ferramenta para agrupar/desagrupar arquivos descarregados OpenMP associados a um arquivo fonte comum

clang-offload-packager

é uma ferramenta para agrupar vários arquivos de objeto em um binário, que pode então ser usado para criar um binário que contenha código nativo para várias arquiteturas de processador contendo código de descarregamento

clang-refactor

é uma ferramenta de refatoração baseada em Clang para C, C++ e Objective-C

clang-rename

é uma ferramenta para renomear símbolos em aplicativos C/C++

clang-scan-deps

é uma ferramenta para escanear dependências em um arquivo fonte

clang-tblgen

é um programa que traduz arquivos de descrição de alvo relacionados ao compilador (.td) para código C++ e outros formatos de saída

diagtool

é uma combinação de ferramentas para lidar com diagnósticos em clang

FileCheck

é uma ferramenta que lê dois arquivos (um a partir da entrada padrão e outro especificado na linha de comando) e usa um para verificar o outro.

dsymutil

é uma ferramenta usada para manipular arquivos de símbolos de depuração DWARF arquivados, compatível com o comando dsymutil do Darwin

git-clang-format

executa clang-format em remendos gerados pelo git (exige git-2.46.0)

hmaptool

é uma ferramenta Python para despejar e construir mapas de cabeçalho

intercept-build

gera uma base de dados de comandos de construção para um projeto

llc

é o compilador estático LLVM

lli

é usado para executar aplicativos diretamente a partir do bitcode do LLVM

llvm-addr2line

é uma ferramenta usada para converter endereços em nomes de arquivos e números de linha

llvm-ar

é o arquivador do LLVM

llvm-as

é o montador do LLVM

llvm-bcanalyzer

é o analizador de bitcode do LLVM

llvm-bitcode-strip

remove o bitcode de LLVM de um objeto

llvm-cat

é uma ferramenta para concatenar módulos llvm

llvm-cfi-verify

identifica se o Control Flow Integrity protege todas as instruções de fluxo de controle indireto no arquivo de objeto fornecido, DSO ou binário

llvm-config

Imprime as opções de compilação do LLVM

llvm-cov

é usado para emitir informações de cobertura

llvm-c-test

é um desmontador de bytecode

llvm-cvtres

é uma ferramenta para converter arquivos de recursos da Microsoft em COFF

llvm-cxxdump

é usado como um Despejador de Dados de ABI da C++

llvm-cxxfilt

é usado para desmontar símbolos C++ no código llvm

llvm-cxxmap

é usado para remapear símbolos mutilados da C++

llvm-debuginfo-analyzer

imprime uma representação lógica de informações de depuração de baixo nível

llvm-debuginfod

é um serviço que fornece informações de depuração por meio de uma API de HTTP para analisar binários despojados

llvm-debuginfod-find

é uma interface para o processo de segundo plano llvm-debuginfod para achar artefatos debuginfod

llvm-diff

é o 'diff' estrutural do LLVM

llvm-dis

é o desmontador do LLVM

llvm-dwarfdump

imprime o conteúdo das seções DWARF em arquivos objeto

llvm-dwarfutil

é uma ferramenta para copiar e manipular informações de depuração

llvm-dwp

mescla arquivos divididos DWARF

llvm-elfabi

é usado para ler informações relativas a uma ABI de um binário ELF

llvm-exegesis

é uma ferramenta de comparação que usa informações disponíveis no LLVM para medir características de instrução de máquina do dispositivo, como latência ou decomposição de porta

llvm-extract

é usado para extrair uma função a partir de um módulo do LLVM

llvm-gsymutil

é usado para processar arquivos no formato de simbolização GSYM que convertem endereços de memória para nome de função e linha de arquivo fonte. Esses arquivos são menores que os arquivos "DWARF" ou "Breakpad"

llvm-ifs

é usado para mesclar "stubs" de interface com arquivos de objeto

llvm-install-name-tool

é usado para reescrever comandos de carregamento no formato binário "MachO"

llvm-jitlink

é usado para analisar arquivos de objetos relocáveis para tornar o conteúdo deles executável em um processo alvo

llvm-libtool-darwin

fornece funcionalidade básica da libtool em sistemas baseados em Darwin. Isso é útil principalmente se você estiver gerando binários para sistemas macOS

llvm-link

é o vinculador do LLVM

llvm-lipo

é usado para criar binários universais a partir de arquivos MachO

llvm-lto

é o vinculador Link Time Optimization (LTO) do LLVM

llvm-lto2

é um equipamento de teste para a interface LTO baseada em resolução

llvm-mc

é um montador/desmontador de código de máquina autônomo

llvm-mca

é uma ferramenta de análise de desempenho para medir estaticamente o desempenho do código de máquina

llvm-ml

é um área de recreação para código de máquina fornecido pelo LLVM

llvm-modextract

é uma ferramenta para extrair um módulo a partir de arquivos bitcode multi módulos

llvm-mt

é uma ferramenta para gerar arquivos e catálogos assinados a partir de um manifesto de montagem lado a lado (usado para SDK da Microsoft)

llvm-nm

é usado para listar o bitcode do LLVM e a tabela de símbolos do arquivo objeto

llvm-objcopy

é a versão do LLVM de uma ferramenta objcopy

llvm-objdump

é um despejador de arquivo objeto do LLVM

llvm-opt-report

é uma ferramenta para gerar um informe de otimização a partir de arquivos de registro de otimização YAML

llvm-pdbutil

é um despejador Program Database (PDB). PDB é um formato da Microsoft

llvm-profdata

é uma pequena ferramenta para manipular e imprimir arquivos de dados de perfil

llvm-profgen

gera informações de perfil SPGO do LLVM

llvm-ranlib

é usado para gerar um índice para um arquivamento do LLVM

llvm-rc

é uma ferramenta independente de plataforma para compilar scripts de recursos em arquivos de recursos de binários

llvm-readobj

exibe informações específicas de formato de baixo nível relativas a arquivos de objeto

llvm-readtapi

é o leitor e transformador de arquivos TAPI do LLVM

llvm-reduce

é usado para reduzir automaticamente os casos de teste ao executar uma suíte de teste

llvm-remarkutil

converte arquivos de observação entre bitstream e YAML; ou imprime informações de contagem de instruções de função em arquivos de observação

llvm-rtdyld

é a ferramenta MC-JIT do LLVM

llvm-size

é o despejador de tamanho de objeto do LLVM

llvm-split

é o divisor de módulo do LLVM

llvm-stress

é usado para gerar arquivos aleatórios .ll

llvm-strings

imprime sequências de caracteres encontradas em um binário (arquivo objeto, executável ou biblioteca de arquivamento)

llvm-symbolizer

converte endereços em locais de código-fonte

llvm-tblgen

é a descrição alvo do LLVM para o gerador de código C++

llvm-tli-checker

é o verificador TargetLibraryInfo versus SDK do LLVM

llvm-undname

é uma ferramenta para desmantelar nomes

llvm-xray

é uma implementação do sistema de rastreamento de chamadas de função XRay do Google

nvptx-arch

lista as GPUs NVIDIA instaladas; em tempo de execução ele precisa de libcuda.so que não é parte do BLFS

opt

é o otimizador do LLVM

sancov

é a ferramenta de processamento de cobertura de higienizador

sanstats

é a ferramenta de processamento de estatísticas de higienizador

scan-build

é um conjunto de comandos sequenciais Perl que invoca o analisador estático Clang

scan-build-py

é um conjuntos de comandos sequenciais Python que invoca o analisador estático Clang

scan-view

é um visualizador dos resultados do analisador estático Clang

verify-uselistorder

é a ferramenta do LLVM para verificar a ordem da lista de uso