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.
This commit is contained in:
Martin Storsjö committed 2025-06-25 11:51:06 +03:00
1 parent 454962132a
commit 6d31f358d8
1 file changed
+44 -4
+44 -4
View File
@@ -24,6 +24,7 @@ LINK_DYLIB=ON
ASSERTSSUFFIX="" ASSERTSSUFFIX=""
LLDB=ON LLDB=ON
CLANG_TOOLS_EXTRA=ON CLANG_TOOLS_EXTRA=ON
INSTRUMENTED=OFF
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
case "$1" in case "$1" in
@@ -71,6 +72,28 @@ while [ $# -gt 0 ]; do
--macos-native-tools) --macos-native-tools)
MACOS_NATIVE_TOOLS=1 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" PREFIX="$1"
;; ;;
@@ -80,12 +103,14 @@ done
BUILDDIR="$BUILDDIR$ASSERTSSUFFIX" BUILDDIR="$BUILDDIR$ASSERTSSUFFIX"
if [ -z "$CHECKOUT_ONLY" ]; then if [ -z "$CHECKOUT_ONLY" ]; then
if [ -z "$PREFIX" ]; 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 exit 1
fi fi
if [ -z "$INSTRUMENTED" ]; then
mkdir -p "$PREFIX" mkdir -p "$PREFIX"
PREFIX="$(cd "$PREFIX" && pwd)" PREFIX="$(cd "$PREFIX" && pwd)"
fi
fi fi
if [ ! -d llvm-project ]; then if [ ! -d llvm-project ]; then
@@ -316,6 +341,12 @@ if [ -z "$HOST" ] && [ "$(uname)" = "Darwin" ]; then
fi fi
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 TOOLCHAIN_ONLY=ON
if [ -n "$FULL_LLVM" ]; then if [ -n "$FULL_LLVM" ]; then
TOOLCHAIN_ONLY=OFF TOOLCHAIN_ONLY=OFF
@@ -364,10 +395,19 @@ cmake \
-DLLVM_LINK_LLVM_DYLIB=$LINK_DYLIB \ -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" \ -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} \ ${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 \ $CMAKEFLAGS \
.. ..
cmake --build . ${CORES:+-j${CORES}} if [ "$INSTRUMENTED" != "OFF" ]; then
cmake --install . --strip # 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