From 6d31f358d8c8bf5732e5d02aed8baf8bb9653d23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Fri, 9 May 2025 15:01:06 +0300 Subject: [PATCH] build-llvm: Add options for doing PGO builds Passing --instrumented=IR or --instrumented=Frontend builds instrumented tool binaries. After running them and merging the output profile files, run build-llvm.sh with --profile=profile.profdata. --- build-llvm.sh | 52 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/build-llvm.sh b/build-llvm.sh index 3f2bcd7..9f21b71 100755 --- a/build-llvm.sh +++ b/build-llvm.sh @@ -24,6 +24,7 @@ LINK_DYLIB=ON ASSERTSSUFFIX="" LLDB=ON CLANG_TOOLS_EXTRA=ON +INSTRUMENTED=OFF while [ $# -gt 0 ]; do case "$1" in @@ -71,6 +72,28 @@ while [ $# -gt 0 ]; do --macos-native-tools) MACOS_NATIVE_TOOLS=1 ;; + --instrumented|--instrumented=*) + INSTRUMENTED="${1#--instrumented}" + INSTRUMENTED="${INSTRUMENTED#=}" + INSTRUMENTED="${INSTRUMENTED:-Frontend}" + : ${LLVM_PROFILE_DATA_DIR:=/tmp/llvm-profile} + # A fixed BUILDDIR is set at the end for this case. + ;; + --pgo|--pgo=*) + case "$1" in + --pgo=*) + LLVM_PROFDATA_FILE="${1#--pgo}" + LLVM_PROFDATA_FILE="${LLVM_PROFDATA_FILE#=}" + ;; + esac + LLVM_PROFDATA_FILE="${LLVM_PROFDATA_FILE:-profile.profdata}" + if [ ! -e "$LLVM_PROFDATA_FILE" ]; then + echo Profile \"$LLVM_PROFDATA_FILE\" not found + exit 1 + fi + LLVM_PROFDATA_FILE="$(cd "$(dirname "$LLVM_PROFDATA_FILE")" && pwd)/$(basename "$LLVM_PROFDATA_FILE")" + BUILDDIR="$BUILDDIR-pgo" + ;; *) PREFIX="$1" ;; @@ -80,12 +103,14 @@ done BUILDDIR="$BUILDDIR$ASSERTSSUFFIX" if [ -z "$CHECKOUT_ONLY" ]; then if [ -z "$PREFIX" ]; then - echo $0 [--enable-asserts] [--with-clang] [--thinlto] [--lto] [--disable-dylib] [--full-llvm] [--with-python] [--disable-lldb] [--disable-clang-tools-extra] [--host=triple] [--macos-native-tools] dest + echo $0 [--enable-asserts] [--with-clang] [--thinlto] [--lto] [--instrumented[=type]] [--pgo[=profile]] [--disable-dylib] [--full-llvm] [--with-python] [--disable-lldb] [--disable-clang-tools-extra] [--host=triple] [--macos-native-tools] dest exit 1 fi - mkdir -p "$PREFIX" - PREFIX="$(cd "$PREFIX" && pwd)" + if [ -z "$INSTRUMENTED" ]; then + mkdir -p "$PREFIX" + PREFIX="$(cd "$PREFIX" && pwd)" + fi fi if [ ! -d llvm-project ]; then @@ -316,6 +341,12 @@ if [ -z "$HOST" ] && [ "$(uname)" = "Darwin" ]; then fi fi +if [ "$INSTRUMENTED" != "OFF" ]; then + # For instrumented build, use a hardcoded builddir that we can + # locate, and don't install the built files. + BUILDDIR="build-instrumented" +fi + TOOLCHAIN_ONLY=ON if [ -n "$FULL_LLVM" ]; then TOOLCHAIN_ONLY=OFF @@ -364,10 +395,19 @@ cmake \ -DLLVM_LINK_LLVM_DYLIB=$LINK_DYLIB \ -DLLVM_TOOLCHAIN_TOOLS="llvm-ar;llvm-ranlib;llvm-objdump;llvm-rc;llvm-cvtres;llvm-nm;llvm-strings;llvm-readobj;llvm-dlltool;llvm-pdbutil;llvm-objcopy;llvm-strip;llvm-cov;llvm-profdata;llvm-addr2line;llvm-symbolizer;llvm-windres;llvm-ml;llvm-readelf;llvm-size;llvm-cxxfilt;llvm-lib" \ ${HOST+-DLLVM_HOST_TRIPLE=$HOST} \ + -DLLVM_BUILD_INSTRUMENTED=$INSTRUMENTED \ + ${LLVM_PROFILE_DATA_DIR+-DLLVM_PROFILE_DATA_DIR=$LLVM_PROFILE_DATA_DIR} \ + ${LLVM_PROFDATA_FILE+-DLLVM_PROFDATA_FILE=$LLVM_PROFDATA_FILE} \ $CMAKEFLAGS \ .. -cmake --build . ${CORES:+-j${CORES}} -cmake --install . --strip +if [ "$INSTRUMENTED" != "OFF" ]; then + # For instrumented builds, don't install the built files (so $PREFIX + # is entirely unused). + cmake --build . ${CORES:+-j${CORES}} --target clang --target lld +else + cmake --build . ${CORES:+-j${CORES}} + cmake --install . --strip -cp ../LICENSE.TXT $PREFIX + cp ../LICENSE.TXT $PREFIX +fi