-
Notifications
You must be signed in to change notification settings - Fork 32
LLVM
git config blame.ignoreRevsFile .git-blame-ignore-revs
git config feature.manyFiles trueMy configure-llvm:
#!/bin/zsh
dry_run=
COMMON=(-GNinja -DLLVM_APPEND_VC_REV=OFF -DLLVM_ENABLE_LLD=On -DPython3_EXECUTABLE=/usr/bin/python3 -DLIBOMPTARGET_BUILD_DEVICERTL_BCLIB=off -DLIBOMPTARGET_BUILD_AMDGPU_PLUGIN=off -DLIBOMPTARGET_BUILD_CUDA_PLUGIN=off)
PROJECTS=(-DLLVM_ENABLE_PROJECTS='bolt;clang;clang-tools-extra;flang;lldb;lld;compiler-rt;openmp;mlir;polly;cross-project-tests' -DLLVM_ENABLE_RUNTIMES='libcxx;libcxxabi;libunwind')
SKIP=(-DCLANG_ENABLE_ARCMT=off -DCLANG_ENABLE_STATIC_ANALYZER=off)
if [[ $1 == --light ]]; then
shift
COMMON=("${COMMON[@]}" -DCMAKE_CXX_COMPILER_LAUNCHER=$HOME/goma/gomacc -DCMAKE_C_COMPILER_LAUNCHER=$HOME/goma/gomacc)
PROJECTS=(-DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;lld;compiler-rt')
fi
if [[ $1 == --dry-run ]]; then
shift
dry_run=1
fi
LLVM=("${COMMON[@]}" "${PROJECTS[@]}" -DCMAKE_CXX_COMPILER=$HOME/Stable/bin/clang++ -DCMAKE_C_COMPILER=$HOME/Stable/bin/clang -DCMAKE_CXX_ARCHIVE_CREATE="$HOME/Stable/bin/llvm-ar qc --thin <TARGET> <OBJECTS>" -DCMAKE_CXX_ARCHIVE_FINISH=: -DLLVM_OPTIMIZED_TABLEGEN=On )
cd ~/llvm
linux=
[[ -f /etc/lsb_release ]] && linux=1
cmake() {
if [[ -n $dry_run ]]; then
echo cmake "$@"
else
command cmake "$@"
fi
}
# Build with system gcc
if [[ $1 == stable ]]; then
cmake -GNinja -Sllvm -Bout/stable -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_PROJECTS='clang;lld;compiler-rt' ${linux:+-DLLVM_USE_LINKER=gold} -DLLVM_APPEND_VC_REV=OFF ${SKIP}
[[ -n $dry_run ]] || ninja -C out/stable clang lld msan
# Build with stable clang/lld
elif [[ $1 == preset ]]; then
cmake -Sllvm -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_EXPERIMENTAL_TARGETS_TO_BUILD='ARC;AVR;LoongArch' -DLIBCXX_ABI_VERSION=2
cmake -Sllvm -B/tmp/Debug -DBUILD_SHARED_LIBS=On -DCMAKE_BUILD_TYPE=Debug ${LLVM} ${SKIP} -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DCMAKE_{EXE,SHARED}_LINKER_FLAGS=-Wl,--gdb-index -DCMAKE_EXPORT_COMPILE_COMMANDS=On -DCOMPILER_RT_DEBUG=On -DLLVM_USE_SPLIT_DWARF=On -DLLVM_BINUTILS_INCDIR=$HOME/Dev/binutils-gdb/include -DLLVM_ENABLE_EXPENSIVE_CHECKS=on -DLLVM_OPTIMIZE_SANITIZED_BUILDS=OFF -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='LoongArch'
elif [[ $1 == laptop ]]; then
cmake -Sllvm -B~/llvm/out/debug -DBUILD_SHARED_LIBS=On -DCMAKE_BUILD_TYPE=Debug ${LLVM} ${SKIP} -DCMAKE_SYSROOT=$HOME/src/.sysroot -DCMAKE_C_COMPILER=$HOME/src/chromeclang/third_party/llvm-build/Release+Asserts/bin/clang -DCMAKE_CXX_COMPILER=$HOME/src/chromeclang/third_party/llvm-build/Release+Asserts/bin/clang++ -DCMAKE_{EXE,SHARED}_LINKER_FLAGS=-Wl,--gdb-index -DCMAKE_EXPORT_COMPILE_COMMANDS=On -DCOMPILER_RT_DEBUG=On -DLLVM_PARALLEL_LINK_JOBS=2 -DLLVM_USE_SPLIT_DWARF=On -DLLVM_OPTIMIZE_SANITIZED_BUILDS=OFF
elif [[ $1 == static-debug ]]; then
cmake -Sllvm -B/tmp/StaticDebug -DCMAKE_BUILD_TYPE=Debug ${LLVM} -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DCMAKE_{EXE,SHARED}_LINKER_FLAGS=-Wl,--gdb-index -DCOMPILER_RT_DEBUG=On -DLLVM_USE_SPLIT_DWARF=On
elif [[ $1 == asan ]]; then
cmake -Sllvm -B/tmp/out/asan -DCMAKE_BUILD_TYPE=RelWithDebInfo ${LLVM} ${SKIP} -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DLLVM_USE_SANITIZER=Address -DLLVM_OPTIMIZE_SANITIZED_BUILDS=Off -DLLVM_ENABLE_PROJECTS='clang;lld;clang-tools-extra'
elif [[ $1 == tsan ]]; then
cmake -Sllvm -B/tmp/out/tsan -DCMAKE_BUILD_TYPE=RelWithDebInfo ${LLVM} ${SKIP} -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DLLVM_USE_SANITIZER=Thread -DLLVM_ENABLE_PROJECTS='clang;lld'
elif [[ $1 == ubsan ]]; then
cmake -Sllvm -B/tmp/out/ubsan -DCMAKE_BUILD_TYPE=RelWithDebInfo ${LLVM} ${SKIP} -DCMAKE_CXX_FLAGS_DEBUG='-g -fno-limit-debug-info' -DLLVM_USE_SANITIZER=Undefined -DLLVM_ENABLE_PROJECTS='clang;lld'
elif [[ $1 == custom* ]]; then
rm -fr /tmp/out/$1
cmake -Sllvm -B/tmp/out/$1 -DCMAKE_BUILD_TYPE=Release ${LLVM} "${@:2}"
# Build with a stage-1 clang/lld
elif [[ $1 == s2-debug ]]; 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 -Sllvm -B/tmp/out/s2 -DCMAKE_BUILD_TYPE=Debug ${LLVM} -DCMAKE_CXX_FLAGS='-g --stdlib=libc++' -DCMAKE_{EXE,SHARED}_LINKER_FLAGS=--stdlib=libc++ -DLLVM_ENABLE_ASSERTIONS=on -DLLVM_OPTIMIZE_SANITIZED_BUILDS=Off
elif [[ $1 == s2-custom* ]]; then
rm -fr /tmp/out/$1
cmake -Sllvm -B/tmp/out/$1 -DCMAKE_BUILD_TYPE=Release ${LLVM} -DCMAKE_CXX_COMPILER=/tmp/RelA/bin/clang++ -DCMAKE_C_COMPILER=/tmp/RelA/bin/clang "${@:2}"
fi# Configure /tmp/RelA and /tmp/Debug
configure-llvm presetmsan
ninja -C out/stable clang lld msan compiler-rt-headers
LLVM_COMMON=(-GNinja -DCMAKE_CXX_COMPILER=$HOME/llvm/out/stable/bin/clang++ -DCMAKE_C_COMPILER=$HOME/llvm/out/stable/bin/clang -DCMAKE_CXX_ARCHIVE_CREATE="$HOME/llvm/out/stable/bin/llvm-ar qcS --thin <TARGET> <OBJECTS>" -DCMAKE_CXX_ARCHIVE_FINISH=: -DLLVM_APPEND_VC_REV=OFF -DLLVM_ENABLE_LLD=On -DLLVM_TARGETS_TO_BUILD=host -DLLVM_TABLEGEN=/tmp/RelA/bin/llvm-tblgen -DCLANG_ENABLE_ARCMT=off -DCLANG_ENABLE_STATIC_ANALYZER=off -DCLANG_TABLEGEN=/tmp/RelA/bin/clang-tblgen)
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
cmake -Sruntimes -B$libcxx_out $LLVM_COMMON -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RUNTIMES='libcxx;libcxxabi' -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=on -DLLVM_USE_SANITIZER=Memory
ninja -C $libcxx_out cxx cxxabi
sanitizer_ldflags="-Wl,--rpath=$libcxx_out/lib/x86_64-unknown-linux-gnu -L$libcxx_out/lib/x86_64-unknown-linux-gnu -lc++abi"
sanitizer_cflags="-nostdinc++ -isystem$libcxx_out/include/x86_64-unknown-linux-gnu/c++/v1 -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 -B/tmp/out/msan ${LLVM_COMMON} -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS='clang;lld' -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_LIBSfor buildinglibLLVM*.solibclang*.soinstead oflibLLVM*.alibclang*.a -
-DLLVM_ENABLE_LLDfor faster linking -
-DLLVM_USE_SPLIT_DWARFfaster linking forDebugRelWithDebInfo. Don't use it forRelease. -
-DLLVM_PARALLEL_LINK_JOBS=1if memory is small -
-Wl,--gdb-indexfor speeding up gdb -
-DCMAKE_CXX_FLAGS=--stdlib=libc++ -DCMAKE_{EXE,SHARED}_LINKER_FLAGS=--stdlib=libc++: Make clang default to libc++ -
-DCMAKE_CXX_ARCHIVE_CREATE="$HOME/Stable/bin/llvm-ar qc --thin <TARGET> <OBJECTS>" -DCMAKE_CXX_ARCHIVE_FINISH=:uses thin archives, which make the output directory much smaller. However, this is not suitable forninja install(used by downstream projects like Halide).
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'mips32el-unknown-linux-gnu cross toolchain
cmake -GNinja -Sllvm -B/tmp/out/mips32 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/mipsel-linux-gnu-g++ -DCMAKE_C_COMPILER=/usr/bin/mipsel-linux-gnu-gcc -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/mips -DLLVM_TARGETS_TO_BUILD=Mips -DLLVM_DEFAULT_TARGET_TRIPLE=mipsel-unknown-linux-gnu -DLLVM_TARGET_ARCH=Mips -DLLVM_TABLEGEN=/tmp/RelA/bin/llvm-tblgen -DCLANG_TABLEGEN=/tmp/RelA/bin/clang-tblgen -DLLVM_ENABLE_PROJECTS='clang;compiler-rt'mips64-unknown-linux-gnuabi64 cross toolchain
cmake -GNinja -Sllvm -B/tmp/out/mips64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/mips64-linux-gnuabi64-g++ -DCMAKE_C_COMPILER=/usr/bin/mips64-linux-gnuabi64-gcc -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/mips64 -DLLVM_TARGETS_TO_BUILD=Mips -DLLVM_DEFAULT_TARGET_TRIPLE=mips64-unknown-linux-gnuabi64 -DLLVM_TARGET_ARCH=Mips -DLLVM_TABLEGEN=/tmp/RelA/bin/llvm-tblgen -DCLANG_TABLEGEN=/tmp/RelA/bin/clang-tblgen -DLLVM_ENABLE_PROJECTS='clang;compiler-rt'mips64el-unknown-linux-gnuabi64 cross toolchain
cmake -GNinja -Sllvm -B/tmp/out/mips64el -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/mips64el-linux-gnuabi64-g++ -DCMAKE_C_COMPILER=/usr/bin/mips64el-linux-gnuabi64-gcc -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/mips64el -DLLVM_TARGETS_TO_BUILD=Mips -DLLVM_DEFAULT_TARGET_TRIPLE=mips64el-unknown-linux-gnuabi64 -DLLVM_TARGET_ARCH=Mips -DLLVM_TABLEGEN=/tmp/RelA/bin/llvm-tblgen -DCLANG_TABLEGEN=/tmp/RelA/bin/clang-tblgen -DLLVM_ENABLE_PROJECTS='clang;compiler-rt'
# How to use runtimes/? Failed attempt:
#cmake -GNinja -Sruntimes -B/tmp/out/mips64el -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/mips64el-linux-gnuabi64-g++ -DCMAKE_C_COMPILER=/usr/bin/mips64el-linux-gnuabi64-gcc -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/mips64el -DLLVM_ENABLE_RUNTIMES=compiler-rt -DLLVM_TARGETS_TO_BUILD=Sparc -D{LLVM_BUILTIN_TARGETS,LLVM_RUNTIME_TARGETS}=mips64el-unknown-linux-gnuabi64 -DLLVM_DEFAULT_TARGET_TRIPLE=mips64el-unknown-linux-gnuabi64
PATH=/tmp/RelA/bin:$PATH cmake -GNinja -Sruntimes -B/tmp/out/mips64el -DCMAKE_BUILD_TYPE=Release -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/mips64el -DLLVM_ENABLE_RUNTIMES=compiler-rt -DLLVM_TARGETS_TO_BUILD=Sparc -D{LLVM_BUILTIN_TARGETS,LLVM_RUNTIME_TARGETS}=mips64el-unknown-linux-gnuabi64 -DLLVM_DEFAULT_TARGET_TRIPLE=mips64el-unknown-linux-gnuabi64riscv64-unknown-linux-gnu cross toolchain
cmake -GNinja -Sllvm -B/tmp/out/rv64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++ -DCMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/rv64 -DLLVM_TARGETS_TO_BUILD=RISCV -DLLVM_DEFAULT_TARGET_TRIPLE=riscv64-unknown-linux-gnu -DLLVM_TARGET_ARCH=riscv64 -DLLVM_TABLEGEN=/tmp/RelA/bin/llvm-tblgen -DCLANG_TABLEGEN=/tmp/RelA/bin/clang-tblgen -DLLVM_ENABLE_PROJECTS='clang;compiler-rt'sparc64-unknown-linux-gnu cross toolchain
cmake -GNinja -Sllvm -B/tmp/out/sparc64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/sparc64-linux-gnu-g++ -DCMAKE_C_COMPILER=/usr/bin/sparc64-linux-gnu-gcc -DCMAKE_CROSSCOMPILING=on -DCMAKE_INSTALL_PREFIX=/tmp/opt/sparc64 -DLLVM_TARGETS_TO_BUILD=Sparc -DLLVM_DEFAULT_TARGET_TRIPLE=sparc64-unknown-linux-gnu -DLLVM_TARGET_ARCH=Sparc -DLLVM_TABLEGEN=/tmp/RelA/bin/llvm-tblgen -DCLANG_TABLEGEN=/tmp/RelA/bin/clang-tblgen -DLLVM_ENABLE_PROJECTS='clang;compiler-rt'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/llvm/utils/gn/get.py
llvm/utils/gn/gn.py gen /tmp/out/gn
llvm/utils/gn/gn.py format llvm/utils/gn/secondary/llvm/tools/*/BUILD.gnninja -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'https://chromium.googlesource.com/chromium/src/+/master/docs/linux/build_instructions.md
- Make sure that
.gclientincludestarget_os = [..., "android"]. If not, rungclient 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-fuchsiato getthird_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 atthird_party/llvm-build/Release+Asserts/android-aarch64.
For Windows, target_os = "win".
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.
Build compiler-rt mips64el with prebuilt llvm-config/clang/lld.
cmake -GNinja -Scompiler-rt -B/tmp/out/custom1 -DLLVM_CONFIG_PATH=/tmp/RelA/bin/llvm-config -DCMAKE_C_COMPILER=/tmp/RelA/bin/clang -DCMAKE_CXX_COMPILER=/tmp/RelA/bin/clang++ -DCMAKE_C_COMPILER_TARGET=mips64el-linux-gnuabi64 -DCMAKE_CXX_COMPILER_TARGET=mips64el-linux-gnuabi64 '-DCOMPILER_RT_EMULATOR=qemu-mips64el-static -L /usr/mips64el-linux-gnuabi64' -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=lld -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld -DCOMPILER_RT_TEST_USE_LLD=ON -DCOMPILER_RT_INCLUDE_TESTS=on -DCOMPILER_RT_TEST_COMPILER_CFLAGS=--target=mips64el-linux-gnuabi64Chromium testing uses Ubuntu 16.04
- rootfs: http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/
- New CMake: https://cmake.org/download/
apt install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt install python3.7 # lit needs Python>=3.6sudo debootstrap --arch i386 buster buster.i386
sudo mount -t proc /proc buster.i386/proc
sudo chroot buster.i386git rebase -i --exec 'arc diff HEAD^' origin/main