Skip to content
Fangrui Song edited this page Jul 22, 2021 · 34 revisions

Configuration

git config blame.ignoreRevsFile .git-blame-ignore-revs
git config feature.manyFiles true
COMMON=(-GNinja -DLLVM_APPEND_VC_REV=OFF -DLLVM_ENABLE_LLD=On -DLLVM_INCLUDE_GO_TESTS=OFF -DPython3_EXECUTABLE=/usr/bin/python3)

LLVM=(-GNinja -DCMAKE_CXX_COMPILER_LAUNCHER=$HOME/goma/gomacc -DCMAKE_C_COMPILER_LAUNCHER=$HOME/goma/gomacc -DCMAKE_CXX_COMPILER=$HOME/Stable/bin/clang++ -DCMAKE_C_COMPILER=$HOME/Stable/bin/clang -DBUILD_SHARED_LIBS=On -DLLVM_APPEND_VC_REV=OFF -DLLVM_ENABLE_LLD=On -DLLVM_INCLUDE_GO_TESTS=OFF -DLLVM_OPTIMIZED_TABLEGEN=On -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;lldb;lld;compiler-rt;libcxx;libcxxabi;libunwind;openmp;mlir;polly;debuginfo-tests' -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='ARC;AVR;VE' -DPython3_EXECUTABLE=/usr/bin/python3)
LLVM=("${COMMON[@]}" -DCMAKE_CXX_COMPILER=$HOME/Stable/bin/clang++ -DCMAKE_C_COMPILER=$HOME/Stable/bin/clang -DLLVM_APPEND_VC_REV=OFF -DLLVM_ENABLE_LLD=On -DLLVM_OPTIMIZED_TABLEGEN=On -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;lldb;lld;compiler-rt;libcxx;libcxxabi;libunwind;openmp;mlir;polly;debuginfo-tests' -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='ARC;AVR;VE')

cd ~/llvm
if [[ $1 == asan ]]; then
  cmake -Hllvm -B/tmp/out/asan -DCMAKE_BUILD_TYPE=Release ${LLVM} -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DLLVM_USE_SANITIZER=Address -DLLVM_OPTIMIZE_SANITIZED_BUILDS=Off
elif [[ $1 == s2 ]]; then
  LLVM=("${COMMON[@]}" -DCMAKE_CXX_COMPILER=/tmp/RelA/bin/clang++ -DCMAKE_C_COMPILER=/tmp/RelA/bin/clang -DLLVM_OPTIMIZED_TABLEGEN=On -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;lld;compiler-rt')
  cmake -Hllvm -B/tmp/out/s2 -DCMAKE_BUILD_TYPE=Debug ${LLVM} -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DLLVM_ENABLE_ASSERTIONS=on -DLLVM_OPTIMIZE_SANITIZED_BUILDS=Off
elif [[ $1 == preset ]]; then
  cmake -Hllvm -B/tmp/RelA -DCMAKE_BUILD_TYPE=Release ${LLVM} -DLLVM_ENABLE_ASSERTIONS=on -DLLVM_ENABLE_SPHINX=ON -DLLVM_BINUTILS_INCDIR=$HOME/Dev/binutils-gdb/include -DLLVM_OPTIMIZED_TABLEGEN=Off -DLLVM_OPTIMIZE_SANITIZED_BUILDS=OFF
  cmake -Hllvm -B/tmp/Debug -DBUILD_SHARED_LIBS=On -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DCMAKE_EXE_LINKER_FLAGS=-Wl,--gdb-index -DCMAKE_SHARED_LINKER_FLAGS=-Wl,--gdb-index -DCMAKE_EXPORT_COMPILE_COMMANDS=On -DCOMPILER_RT_DEBUG=On -DLLVM_USE_SPLIT_DWARF=On ${LLVM} -DLLVM_BINUTILS_INCDIR=$HOME/Dev/binutils-gdb/include
elif [[ $1 == custom ]]; then
  rm -fr /tmp/out/custom
  cmake -Hllvm -B/tmp/out/custom -DCMAKE_BUILD_TYPE=Release ${LLVM} "${@:2}"
elif [[ $1 == s2-custom ]]; then
  rm -fr /tmp/out/s2-custom
  cmake -Hllvm -B/tmp/out/s2-custom -DCMAKE_BUILD_TYPE=Release ${LLVM} -DCMAKE_CXX_COMPILER=/tmp/out/custom/bin/clang++ -DCMAKE_C_COMPILER=/tmp/out/custom/bin//clang "${@:2}"
elif [[ $1 == s3-custom ]]; then
  rm -fr /tmp/out/s3-custom
  cmake -Hllvm -B/tmp/out/s3-custom -DCMAKE_BUILD_TYPE=Release ${LLVM} -DCMAKE_CXX_COMPILER=/tmp/out/custom/bin/clang++ -DCMAKE_C_COMPILER=/tmp/out/custom/bin//clang "${@:2}"
fi
# /tmp/RelA and /tmp/Debug
configure-llvm preset
LLVM_COMMON=(-GNinja -DCMAKE_CXX_COMPILER=$HOME/Stable/bin/clang++ -DCMAKE_C_COMPILER=$HOME/Stable/bin/clang -DLLVM_APPEND_VC_REV=OFF -DLLVM_ENABLE_LLD=On -DLLVM_OPTIMIZED_TABLEGEN=On -DLLVM_TARGETS_TO_BUILD='ARM;AArch64;PowerPC;X86;RISCV' -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;lldb;lld;compiler-rt;libcxx;libcxxabi')

# Debug msan
libcxx_out=$PWD/out/msan-libcxx
cmake -Hllvm -B$libcxx_out ${LLVM_COMMON} -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS='libcxx;libcxxabi' -DLLVM_USE_SANITIZER=Memory
ninja -C $libcxx_out cxx cxxabi

sanitizer_ldflags="-Wl,--rpath=$libcxx_out/lib -L$libcxx_out/lib -lc++abi"
sanitizer_cflags="-nostdinc++ -isystem$libcxx_out/include -isystem$libcxx_out/include/c++/v1"
# See http://llvm.org/bugs/show_bug.cgi?id=19071, http://www.cmake.org/Bug/view.php?id=15264
sanitizer_cflags="$sanitizer_cflags $sanitizer_ldflags -fsanitize=memory -w"
cmake -Hllvm -Bout/msan ${LLVM_COMMON} -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS=$sanitizer_cflags -DCMAKE_CXX_FLAGS=$sanitizer_cflags -DCMAKE_EXE_LINKER_FLAGS=$sanitizer_ldflags -DCMAKE_SHARED_LINKER_FLAGS=$sanitizer_ldflags -DLLVM_ENABLE_LIBCXX=On -DLLVM_USE_SPLIT_DWARF=On -DLLVM_USE_SANITIZER=Memory
  • -DBUILD_SHARED_LIBS for building libLLVM*.so libclang*.so instead of libLLVM*.a libclang*.a
  • -DLLVM_ENABLE_LLD for faster linking
  • -DLLVM_USE_SPLIT_DWARF faster linking for Debug RelWithDebInfo. Don't use it for Release.
  • -DLLVM_PARALLEL_LINK_JOBS=1 if memory is small
  • -Wl,--gdb-index for speeding up gdb

arm-linux-gnueabihf cross toolchain

cmake -GNinja -Hllvm -B/tmp/out/arm -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/arm-linux-gnueabihf-g++-9 -DCMAKE_C_COMPILER=/usr/bin/arm-linux-gnueabihf-gcc-9 -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/arm -DLLVM_TARGETS_TO_BUILD=ARM -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf -DLLVM_TARGET_ARCH=ARM -DLLVM_TABLEGEN=/tmp/RelA/bin/llvm-tblgen -DCLANG_TABLEGEN=/tmp/RelA/bin/clang-tblgen -DLLVM_ENABLE_PROJECTS='clang;libcxx;libcxxabi;compiler-rt;libunwind'

Copy ccls-cache built from a powerful machine to an underpowered machine.

from=remote
cd ~/llvm

# Make sure timestamps of source files match those of remote's
rsync -tr --existing -f '+ /llvm' -f '+ /clang' -f '+ /clang-tools-extra' -f '+ /lld' -f '+ /lldb' -f '+ /compiler-rt' -f '+ /libcxx' -f '+ /libcxxabi' -f '+ /libunwind' -f '+ /libc' -f '- /*' -f '+ */' -f '+ *.cpp' -f '+ *.h' -f '+ *.def' -f '+ *.inc' -f '- *' ${from}:llvm/ ./

# Make sure generated source files match those of remote's
rsync -a -f '+ */' -f '+ *.def' -f '+ *.inc' -f '+ *.h' -f '+ compile_commands.json' -f '- *' ${from}:llvm/Debug/ Debug/

# Copy ccls cache
mkdir -p .ccls-cache
rsync -a ${from}:llvm/.ccls-cache/@home@ray@llvm/ .ccls-cache/@home@ray@llvm/

Testing tips

clang/lib/Driver

ninja -C /tmp/RelA check-clang-driver

# Default --rtlib=compiler-rt --unwindlib=libunwind --stdlib=libc++
configure-llvm custom -DCLANG_DEFAULT_RTLIB=compiler-rt -DCLANG_DEFAULT_UNWINDLIB=libunwind -DCLANG_DEFAULT_CXX_STDLIB=libc++ -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=on
ninja -C /tmp/out/custom check-clang-driver

# Runtime build
configure-llvm custom -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=on -DLLVM_RUNTIME_TARGETS=default -DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' -DLLVM_BUILTIN_TARGETS=default -DLLVM_ENABLE_PROJECTS='clang;lld'
export LLVM_COMPILER_PATH=~/llvm/Release/bin
cmake -GNinja -H. -BGLLVM -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gclang -DCMAKE_CXX_COMPILER=gclang++ -DCMAKE_C_FLAGS='-Xclang -disable-llvm-passes' -DCMAKE_CXX_FLAGS='-Xclang -disable-llvm-passes'

How to reproduce build bots

Chromium

https://chromium.googlesource.com/chromium/src/+/master/docs/linux/build_instructions.md

  • Make sure that .gclient includes target_os = [..., "android"]. If not, run gclient runhooks.
  • cd ~/chromium/src; PATH=~/projects/depot_tools:$PATH gclient sync
  • Run tools/clang/scripts/build.py --llvm-force-head-revision --with-android=True --without-fuchsia to get third_party/llvm
  • Apply local patch and run tools/clang/scripts/build.py --skip-checkout --without-fuchsia
  • There are several build directories. The main one is at third_party/llvm-build/Release+Asserts. android-aarch64 is at third_party/llvm-build/Release+Asserts/android-aarch64.

Sanitizers

https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild

For issues which don't require a bootstrapped compiler, just set -DLLVM_USE_SANITIZER=.

MemrorySanitizer is the trickest because it requires an instrumented C++ standard library (read: libc++). See out/msan above.

Other systems

Chromium testing uses Ubuntu 16.04

apt install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt install python3.7  # lit needs Python>=3.6

Debian 10 i386

sudo debootstrap --arch i386 buster buster.i386
sudo mount -t proc /proc buster.i386/proc
sudo chroot buster.i386
git rebase -i --exec 'arc diff HEAD^' origin/main
Clone this wiki locally