#### Beyond Linux® From Scratch (systemd Edition) - Version 11.1

### Chapter 13. Programming

- Prev

  Librep-0.92.7

- Next

  Lua-5.4.4

- Up
- Home

# LLVM-13.0.1

## Introduction to LLVM

The LLVM package contains a collection of modular and reusable compiler and toolchain technologies. The Low Level Virtual Machine (LLVM) Core libraries provide a modern source and target-independent optimizer, along with code generation support for many popular CPUs (as well as some less common ones!). These libraries are built around a well specified code representation known as the LLVM intermediate representation ("LLVM IR").

Clang provides new C, C++, Objective C and Objective C++ front-ends for LLVM and is required by some desktop packages such as firefox and for rust if that is built using the system LLVM.

The Compiler RT package provides runtime sanitizer and profiling libraries for developers who use Clang and LLVM.

This package is known to build and work properly using an LFS-11.1 platform.

### Package Information

- Download (HTTP): https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/llvm-13.0.1.src.tar.xz

- Download MD5 sum: 4ca3266b539ccec41cb5094c510221a1

- Download size: 43 MB

- Estimated disk space required: 2.6 GB (1 GB installed, with documentation, add 16 GB for tests)

- Estimated build time: 30 SBU (on 4 CPU cores, with documentation, add 18 SBU for tests)

### Recommended Download

#### Clang

- Download: https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/clang-13.0.1.src.tar.xz

- Download MD5 sum: 89017bafd256ac5ad766920d15d8deba

- Download size: 18 MB

### Optional Download

#### Compiler RT

- Download: https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/compiler-rt-13.0.1.src.tar.xz

- Download MD5 sum: f534ab8fb371ec1a8a22a6fa5809be46

- Download size: 2.2 MB

### LLVM Dependencies

#### Required

CMake-3.22.2

#### Optional

Doxygen-1.9.3, git-2.35.1, Graphviz-2.50.0, libxml2-2.9.13, Pygments-2.11.2, rsync-3.2.3 (for tests), texlive-20210325 (or install-tl-unx), Valgrind-3.18.1, PyYAML-5.3.1, Zip-3.0, OCaml, psutil, recommonmark, Sphinx, and Z3

User Notes: https://wiki.linuxfromscratch.org/blfs/wiki/llvm

## Installation of LLVM

Install clang into the source tree by running the following commands:

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

If you have downloaded compiler-rt, install it into the source tree by running the following commands:

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

There are many Python scripts in this package which use /usr/bin/env python to access the system Python which on LFS is Python-3.10.2. Use the following comand to fix these scripts:

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

Install LLVM by running the following commands:

    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       \
          -Wno-dev -G Ninja ..                      &&
    ninja

If you have installed Sphinx and recommonmark and wish to generate the html documentation and manual pages, issue the following commands:

    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

The clang documentation can be built too:

    ninja docs-clang-html docs-clang-man

To test the results, issue: ninja check-all. Tests are built with all available cores, but run using the number of online processors. (The difference is that available cores can be limited using taskset, but taking them offline requires echoing 0 to `/sys/devices/system/cpu/cpu<N>/online` by the `root` user and makes them temporarily unusable by all jobs on the machine.) Note that a few of the compiler-rt Sanitizer based tests (13 of more than 59000 tests run) are known to fail. Some of the LLVM-Unit IR tests are known to fail as well.

Now, as the `root` user:

    ninja install

If you have built the llvm documentation, it has been installed by the above command, but it needs to be moved. As the `root` user:

    install -v -d -m755 /usr/share/doc/llvm-13.0.1                        &&
    mv -v /usr/share/doc/llvm/html /usr/share/doc/llvm-13.0.1/llvm-html   &&
    rmdir -v /usr/share/doc/llvm

If you have built the clang documentation, it has been installed, but needs to be moved too. Again as the `root` user:

    install -v -d -m755 /usr/share/doc/llvm-13.0.1                        &&
    mv -v /usr/share/doc/clang/html /usr/share/doc/llvm-13.0.1/clang-html &&
    rmdir -v /usr/share/doc/clang

## Command Explanations

`-DLLVM_ENABLE_FFI=ON`: This switch allows LLVM to use libffi.

`-DLLVM_BUILD_LLVM_DYLIB=ON`: This switch builds the libraries as static and links all of them into an unique shared one. This is the recommended way of building a shared library.

`-DCMAKE_BUILD_TYPE=Release`: This switch enables compiler optimizations in order to speed up the code and reduce its size. It also disables some compile checks which are not necessary on a production system.

`-DLLVM_TARGETS_TO_BUILD="host;AMDGPU;BPF"`: This switch enables building for the same target as the host, and also for the r600 AMD GPU used by the Mesa r600 and radeonsi drivers. The BPF target is required to build v4l-utils-1.22.1. The Default is all of the targets. You can use a semicolon separated list. Valid targets are: host, X86, Sparc, PowerPC, ARM, AArch64, Mips, Hexagon, Xcore, M68K, MSP430, NVPTX, SystemZ, AMDGPU, BPF, CppBackend, or all.

`-DLLVM_LINK_LLVM_DYLIB=ON`: Used in conjunction with `-DLLVM_BUILD_LLVM_DYLIB=ON`, this switch enables linking the tools against the shared library instead of the static ones. It also slightly reduces their size and also ensures that llvm-config will correctly use libLLVM-13.0.so.

`-DLLVM_ENABLE_RTTI=ON`: This switch is used to build LLVM with run-time type information. This is required for building Mesa-21.3.6.

`-DLLVM_BINUTILS_INCDIR=/usr/include`: This switch is used to tell the build system the location of binutils headers, which were installed in LFS. This allows the building of `LLVMgold.so`, which is needed for building programs with clang and Link Time Optimization (LTO).

`-DBUILD_SHARED_LIBS=ON`: if used instead of `-DLLVM_BUILD_LLVM_DYLIB=ON` and `-DLLVM_LINK_LLVM_DYLIB=ON`, builds all the LLVM libraries (about 60) as shared libraries instead of static.

`-DLLVM_ENABLE_DOXYGEN`: Enables the generation of browsable HTML documentation if you have installed Doxygen-1.9.3. You should run make doxygen-html afterwards, and install the generated documentation manually.

## Contents

Installed Programs: bugpoint, c-index-test, clang, clang++ (symlinks to clang-<version>), clang-<version>, clang-check, clang-cl, clang-cpp (last two symlinks to clang), clang-extdef-mapping, clang-format, clang-offload-bundler, clang-offload-wrapper, clang-refactor, clang-rename, clang-repl, clang-scan-deps, diagtool, dsymutil, git-clang-format, hmaptool, llc, lli, llvm-addr2line (symlink to llvm-symbolizer), llvm-ar, llvm-as, llvm-bcanalyzer, llvm-bitcode-strip (symlink to llvm-objcopy), llvm-cat, llvm-cfi-verify, llvm-config, llvm-cov, llvm-c-test, llvm-cvtres, llvm-cxxdump, llvm-cxxfilt, llvm-cxxmap, llvm-diff, llvm-dis, llvm-dlltool (symlink to llvm-ar), llvm-dwarfdump, llvm-dwp, llvm-exegenesis, llvm-extract, llvm-gsymutil, llvm-ifs, llvm-install-name-tool (symlink to llvm-objcopy), llvm-jitlink, llvm-lib (symlink to 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 (symlink to llv-objdump), llvm-pdbutil, llvm-profdata, llvm-profgen, llvm-ranlib (symlink to llvm-ar), llvm-rc, llvm-readelf (symlink to llvm-readobj), llvm-readobj, llvm-reduce, llvm-rtdyld, llvm-sim, llvm-size, llvm-split, llvm-stress, llvm-strings, llvm-strip (symlink to llvm-objcopy), llvm-symbolizer, llvm-tapi-diff, llvm-tblgen, llvm-undname, llvm-windres (symlink to llvm-rc, llvm-xray, opt, sancov, sanstats, scan-build, scan-view, split-file, and verify-uselistorder
Installed Libraries: libLLVM.so, libLLVM*.a (89 libraries), libLTO.so, libRemarks.so, libclang.so, libclang-cpp.so, libclang*.a (38 libraries), and LLVMgold.so
Installed Directories: /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}, and /usr/share/doc/llvm-13.0.1

### Short Descriptions

bugpoint | is the automatic test case reduction tool
c-index-test | is used to test the libclang API and demonstrate its usage
clang | is the Clang C, C++, and Objective-C compiler
clang-check | is a tool to perform static code analysis and display Abstract Syntax Trees (AST)
clang-extdef-mapping | is a tool to collect the USR name and location of external definitions in a source file
clang-format | is a tool to format C/C++/Java/JavaScript/Objective-C/Protobuf code
clang-offload-bundler | is a tool to bundle/unbundle OpenMP offloaded files associated with a common source file
clang-offload-wrapper | is a tool to create wrapper bitcode for offload target binaries
clang-refactor | is a Clang-based refactoring tool for C, C++ and Objective-C
clang-rename | is a tool to rename symbols in C/C++ programs
clang-scan-deps | is a tool to scan for dependencies in a source file
diagtool | is a combination of tools for dealing with diagnostics in clang
dsymutil | is a tool used to manipulate archived DWARF debug symbol files, compatible with the Darwin command dsymutil
git-clang-format | runs clang-format on git generated patches (requires git-2.35.1)
hmaptool | is a Python tool to dump and construct header maps
llc | is the LLVM static compiler
lli | is used to directly execute programs from LLVM bitcode
llvm-addr2line | is a tool used to convert addresses into file names and line numbers
llvm-ar | is the LLVM archiver
llvm-as | is the LLVM assembler
llvm-bcanalyzer | is the LLVM bitcode analyzer
llvm-bitcode-strip | strips LLVM bitcode from an object
llvm-cat | is a tool to concatenate llvm modules
llvm-cfi-verify | identifies whether Control Flow Integrity protects all indirect control flow instructions in the provided object file, DSO, or binary
llvm-config | Prints LLVM compilation options
llvm-cov | is used to emit coverage information
llvm-c-test | is a bytecode disassembler
llvm-cvtres | is a tool to convert Microsoft resource files to COFF
llvm-cxxdump | is used as a C++ ABI Data Dumper
llvm-cxxfilt | is used to demangle C++ symbols in llvm code
llvm-cxxmap | is used to remap C++ mangled symbols
llvm-diff | is the LLVM structural 'diff'
llvm-dis | is the LLVM disassembler
llvm-dwarfdump | prints the content of DWARF sections in object files
llvm-dwp | merges split DWARF files
llvm-elfabi | is used to read information about an ELF binary's ABI
llvm-exegesis | is a benchmarking tool that uses information available in LLVM to measure host machine instruction characteristics like latency or port decomposition
llvm-extract | is used to extract a function from an LLVM module
llvm-gsymutil | is used to process GSYM Symbolication Format files which convert memory addresses to function name and source file line. These files are smaller than DWARF or Breakpad files
llvm-ifs | is used to merge interface stubs with object files
llvm-install-name-tool | is used to rewrite load commands into MachO binary format
llvm-jitlink | is used to parse relocatable object files to make their contents executable in a target process
llvm-libtool-darwin | provides basic libtool functionality on Darwin-based systems. This is mostly useful if you are generating binaries for macOS systems
llvm-link | is the LLVM linker
llvm-lipo | is used to create universal binaries from MachO files
llvm-lto | is the LLVM LTO (link time optimization) linker
llvm-lto2 | is a test harness for the resolution based LTO interface
llvm-mc | is a standalone machine code assembler/disassembler
llvm-mca | is a performance analysis tool to statically measure the performance of machine code
llvm-ml | is a playground for machine code provided by LLVM
llvm-modextract | is a tool to extract one module from multimodule bitcode files
llvm-mt | is a tool to generate signed files and catalogs from a side-by-side assembly manifest (used for Microsoft SDK)
llvm-nm | is used to list LLVM bitcode and object file's symbol table
llvm-objcopy | is LLVM's version of an objcopy tool
llvm-objdump | is an LLVM object file dumper
llvm-opt-report | is a tool to generate an optimization report from YAML optimization record files
llvm-pdbutil | is a PDB (Program Database) dumper. PDB is a Microsoft format
llvm-profdata | is a small tool to manipulate and print profile data files
llvm-profgen | generates LLVM SPGO profiling information
llvm-ranlib | is used to generate an index for a LLVM archive
llvm-rc | is a platform-independent tool to compile resource scripts into binary resource files
llvm-readobj | displays low-level format-specific information about object files
llvm-reduce | is used to automatically reduce testcases when running a test suite
llvm-rtdyld | is the LLVM MC-JIT tool
llvm-size | is the LLVM object size dumper
llvm-split | is the LLVM module splitter
llvm-stress | is used to generate random `.ll` files
llvm-strings | print strings found in a binary (object file, executable, or archive library)
llvm-symbolizer | converts adresses into source code locations
llvm-tblgen | is the LLVM Target Description To C++ Code Generator
llvm-undname | is a tool to demangle names
llvm-xray | is an implementation of Google's XRay function call tracing system
opt | is the LLVM optimizer
sancov | is the sanitizer coverage processing tool
sanstats | is the sanitizer statistics processing tool
scan-build | is a Perl script that invokes the Clang static analyzer
scan-view | is a viewer for Clang static analyzer results
split-file | splits an input file into multiple parts separated by regex
verify-uselistorder | is the LLVM tool to verify use-list order

Last updated on

- Prev

  Librep-0.92.7

- Next

  Lua-5.4.4

- Up
- Home