LLVM-15.0.7

Introdução ao "LLVM"

O pacote LLVM contém uma coleção de compiladores modulares e reutilizá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 à 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 representação intermediária LLVM ("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 adequadamente usando uma plataforma LFS 11.3.

Informação do Pacote

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

  • Transferência (FTP):

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

  • Tamanho da transferência: 50 MB

  • Espaço em disco estimado exigido: 2,7 GB (848 MB instalado; adicionar 18,3 GB para os testes e 308 MB para a documentação)

  • Tempo de construção estimado: 24 UPC (Usando paralelismo=4; adicionar 22 UPC para os testes)

Transferências Adicionais

módulos "Cmake" para o "LLVM"

Transferência Recomendada

Clang

Transferência Opcional

Compiler RT

Dependências do "LLVM"

Exigidas

CMake-3.25.2

Opcionais

Doxygen-1.9.6, git-2.39.2, Graphviz-7.1.0, libxml2-2.10.3, Pygments-2.14.0, rsync-3.2.7 (para testes), recommonmark-0.7.1 (para construir documentação), texlive-20220321 (ou install-tl-unx), Valgrind-3.20.0, PyYAML-6.0, Zip-3.0, OCaml, psutil (para testes) e Z3

Observações de Usuário(a): https://wiki.linuxfromscratch.org/blfs/wiki/llvm

Instalação do "LLVM"

A partir da versão 15.0.0, um "tarball" adicional llvm-cmake-15.0.7.src.tar.xz é necessário. O(A) desenvolvedor(a) espera que ele seja extraído no mesmo nível do "tarball" llvm-15.0.7.src.tar.xz e que o diretório extraído seja renomeado para cmake. Extraia-o e modifique o sistema de construção para evitar criar um diretório fora da hierarquia llvm-15.0.7.src:

tar -xf ../llvm-cmake-15.0.7.src.tar.xz &&
sed '/LLVM_COMMON_CMAKE_UTILS/s@../cmake@cmake-15.0.7.src@' \
   -i CMakeLists.txt

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

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

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

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

Existem muitos scripts "Python" nesse pacote que usam /usr/bin/env python para acessar o "Python" do sistema, que no LFS é Python-3.11.2. Use o seguinte comando para corrigir esses scripts:

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-15.0.7-enable_default_ssp-1.patch

Instale 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;BPF" \
      -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

Para testar os resultados, emita: ninja check-all. Os testes são construídos com todos os núcleos disponíveis, porém executados ussndo o número de processadores online. (A diferença é a de que os núcleos disponíveis podem ser limitados usando o taskset; mas, colocá-los "offline" exige ecoar zero (0) para /sys/devices/system/cpu/cpu<N>/online pelo(a) usuário(a) root e torná-los temporáriamente inutilizáveis por todas as tarefas na máquina). Observe que quatro testes de mais que sessenta e quatro mil e setecentos (64.700) são conhecidos por falharem: DataFlowSanitizer-x86_64 :: custom.cpp, DataFlowSanitizer-x86_64 :: origin_unaligned_memtrans.c, DataFlowSanitizer-x86_64 :: release_shadow_space.c, LLVM :: tools/llvm-libtool-darwin/L-and-l.test,

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-15.0.7           &&
mv -v /usr/share/doc/LLVM/llvm /usr/share/doc/llvm-15.0.7 &&
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-15.0.7            &&
mv -v /usr/share/doc/LLVM/clang /usr/share/doc/llvm-15.0.7 &&
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;BPF": 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 alvo "BPF" é necessário para construir v4l-utils-1.22.1. O padrão é todos os alvos. Você consegue usar uma lista separada por ponto e vírgula. Os alvos válidos são: "host", "X86", "Sparc", "PowerPC", "ARM", "AArch64", "Mips", "Hexagon", "Xcore", "M68K", "MSP430", "NVPTX", "SystemZ", "AMDGPU", "BPF", "CppBackend" ou "all".

-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-15.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-22.3.5.

-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.9.6. Você deveria executar make doxygen-html depois e instalar a documentação gerada manualmente.

Conteúdo

Aplicativos Instalados: analyze-build, bugpoint, c-index-test, clang, clang++ (vínculos simbólicos para clang-15), clang-15, clang-check, clang-cl, clang-cpp (últimos dois vínculos simbólicos para "clang"), clang-extdef-mapping, clang-format, clang-linker-wrapper, clang-nvlink-wrapper, clang-offload-bundler, clang-offload-packager, clang-offload-wrapper, clang-refactor, clang-rename, clang-repl, clang-scan-deps, diagtool, dsymutil, FileCheck, git-clang-format, hmaptool, intercept-build, llc, lli, llvm-addr2line (vínculo simbólico para llvm-symbolizer), llvm-ar, llvm-as, llvm-bcanalyzer, llvm-bitcode-strip (vínculo 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-debuginfod, llvm-debuginfod-find, llvm-diff, llvm-dis, llvm-dlltool (vínculo simbólico para llvm-ar), llvm-dwarfdump, llvm-dwarfutil, llvm-dwp, llvm-exegesis, llvm-extract, llvm-gsymutil, llvm-ifs, llvm-install-name-tool (vínculo simbólico para llvm-objcopy), llvm-jitlink, llvm-lib (vínculo 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 (vínculo simbólico para llv-objdump), llvm-pdbutil, llvm-profdata, llvm-profgen, llvm-ranlib (vínculo simbólico para llvm-ar), llvm-rc, llvm-readelf (vínculo simbólico para llvm-readobj), llvm-readobj, llvm-reduce, llvm-remark-size-diff, llvm-rtdyld, llvm-sim, llvm-size, llvm-split, llvm-stress, llvm-strings, llvm-strip (vínculo simbólico para llvm-objcopy), llvm-symbolizer, llvm-tapi-diff, llvm-tblgen, llvm-tli-checker, llvm-undname, llvm-windres (vínculo simbólico para llvm-rc), llvm-xray, opt, sancov, sanstats, scan-build, scan-build-py, scan-view, split-file e verify-uselistorder
Bibliotecas Instaladas: libLLVM.so, libLLVM*.a (noventa e cinco (95) bibliotecas), libLTO.so, libRemarks.so, libclang.so, libclang-cpp.so, libclang*.a (quarenta e uma (41) 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-15.0.7

Descrições Curtas

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-nvlink-wrapper

é uma ferramenta de envólucro sobre o aplicativo "nvlink"

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-offload-wrapper

é uma ferramenta para criar "bitcode" de envólucro para binários de descarregamento alvo

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.39.2)

hmaptool

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

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

intercept-build

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

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 script Perl que invoca o analisador estático Clang

scan-build-py

é um script 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