LLVM-17.0.6

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.1.

Informação do Pacote

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

  • Transferência (FTP):

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

  • Tamanho da transferência: 57 MB

  • Espaço em disco estimado exigido: 4,2 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 o "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.28.3

Opcionais

Doxygen-1.10.0, git-2.44.0, Graphviz-10.0.1, libxml2-2.12.5, Pygments-2.17.2, rsync-3.2.7 (para testes), recommonmark-0.7.1 (para construir documentação), texlive-20230313 (ou install-tl-unx), Valgrind-3.22.0, PyYAML-6.0.1, Zip-3.0, OCaml, psutil (para testes) e Z3

Instalação do "LLVM"

Dois tarballs adicionais llvm-cmake-17.src.tar.xz e llvm-third-party-17.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-17.0.6.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-17.0.6.src:

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

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

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

Se você tiver baixado compiler-rt, instale-o na árvore do fonte executando os seguintes comandos e modifique o sistema de construção, de forma que ele encontre o llvm-cmake-17.src corretamente:

tar -xf ../compiler-rt-17.0.6.src.tar.xz -C projects    &&
mv projects/compiler-rt-17.0.6.src projects/compiler-rt &&
sed '/^set(LLVM_COMMON_CMAKE_UTILS/d'                   \
    -i projects/compiler-rt/CMakeLists.txt

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.2. Use o seguinte comando para corrigir esses conjuntos de comandos sequenciais:

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

Se você tiver baixado o clang, [então] aplique o seguinte remendo para habilitar SSP por padrão em aplicativos compilados.

patch -Np2 -d tools/clang <../clang-17-enable_default_ssp-1.patch

Se você tiver baixado o compiler-rt, corrija um caso de teste quebrado pelo SSP padrão em clang:

sed 's/clang_dfsan/& -fno-stack-protector/' \
    -i projects/compiler-rt/test/dfsan/origin_unaligned_memtrans.c

Instale o LLVM executando os seguintes comandos:

mkdir -v build &&
cd       build &&

CC=gcc CXX=g++                              \
cmake -DCMAKE_INSTALL_PREFIX=/usr           \
      -DLLVM_ENABLE_FFI=ON                  \
      -DCMAKE_BUILD_TYPE=Release            \
      -DLLVM_BUILD_LLVM_DYLIB=ON            \
      -DLLVM_LINK_LLVM_DYLIB=ON             \
      -DLLVM_ENABLE_RTTI=ON                 \
      -DLLVM_TARGETS_TO_BUILD="host;AMDGPU" \
      -DLLVM_BINUTILS_INCDIR=/usr/include   \
      -DLLVM_INCLUDE_BENCHMARKS=OFF         \
      -DCLANG_DEFAULT_PIE_ON_LINUX=ON       \
      -Wno-dev -G Ninja ..                  &&
ninja

Se tiver instalado o recommonmark-0.7.1 e as dependências dele, [então] você consegue gerar a documentação "HTML" e as páginas de manual com os seguintes comandos:

cmake -DLLVM_BUILD_DOCS=ON           \
      -DLLVM_ENABLE_SPHINX=ON         \
      -DSPHINX_WARNINGS_AS_ERRORS=OFF \
      -Wno-dev -G Ninja ..            &&
ninja docs-llvm-html  docs-llvm-man

A documentação do "clang" pode ser construída também:

ninja docs-clang-html docs-clang-man

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-255 e Shadow-4.14.5 tenham sido reconstruídos com suporte a Linux-PAM-1.6.0 (se você estiver interagindo por meio de uma sessão SSH ou gráfica, certifique-se também de que o servidor OpenSSH-9.6p1 ou o gerenciador de área de trabalho tenha sido construído com Linux-PAM-1.6.0) 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. Um teste chamado Linux/clone_setns.cpp falhará se CONFIG_USER_NS não estiver habilitada na configuração do núcleo.

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

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

Se você tiver construído a documentação do "llvm", [então] ela foi instalada pelo comando acima, mas precisa ser movida. Como o(a) usuário(a) root:

install -v -d -m755 /usr/share/doc/llvm-17.0.6           &&
mv -v /usr/share/doc/LLVM/llvm /usr/share/doc/llvm-17.0.6 &&
rmdir -v --ignore-fail-on-non-empty /usr/share/doc/LLVM

Se você tiver construído a documentação do "clang", [então] ela foi instalada, mas precisa ser movida também. Novamente como o(a) usuário(a) root:

install -v -d -m755 /usr/share/doc/llvm-17.0.6            &&
mv -v /usr/share/doc/LLVM/clang /usr/share/doc/llvm-17.0.6 &&
rmdir -v --ignore-fail-on-non-empty /usr/share/doc/LLVM

Explicações do Comando

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

-DLLVM_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.

-DCMAKE_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.

-DLLVM_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. Alvos válidos são: host, X86, Sparc, PowerPC, ARM, AArch64, Mips, Hexagon, Xcore, M68K, MSP430, NVPTX, SystemZ, AMDGPU, BPF, CppBackend ou todos.

-DLLVM_LINK_LLVM_DYLIB=ON: Usado em conjunção com -DLLVM_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-17.so".

-DLLVM_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.0.1.

-DLLVM_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").

-DLLVM_INCLUDE_BENCHMARKS=OFF: é usado para desabilitar alvos de construção de geração para os referenciais do "LLVM". Essa opção exige código adicional que não está disponível atualmente.

-DCLANG_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.

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

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

Conteúdo

Aplicativos Instalados: amdgpu-arch, analyze-build, bugpoint, c-index-test, clang, clang++ (links simbólicos para clang-17), clang-17, 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, 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-reduce, llvm-remark-size-diff, 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-tapi-diff, 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, split-file 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 /usr/share/doc/llvm-17.0.6

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

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.44.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" "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" multimó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-reduce

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

llvm-remark-size-diff

informa a diferença na contagem de instruções e nas observações do tamanho da pilha entre dois arquivos de observações

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

split-file

divide um arquivo de entrada em múltiplas partes separadas por expressão regular

verify-uselistorder

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