From a5bb2c9cba03c5dd6f33e1d42ddf54c45e48d70e Mon Sep 17 00:00:00 2001
From: Song Liu <songliubraving@fb.com>
Date: Wed, 13 Oct 2021 01:03:55 -0700
Subject: [PATCH 110/118] kpatch-build: add support for clang pgo
For clang with Profile-Guided Optimization (PGO), profile data is needed
to compile the livepatch properly. Add option -p|--profile-data, which
specifies the profile data file. This option is only valid with
CONFIG_CC_IS_CLANG and CONFIG_PGO_CLANG.
Signed-off-by: Song Liu <songliubraving@fb.com>
(cherry picked from commit 19c4942a1415d0f99c910949ba55c95ddcc5a976)
---
kpatch-build/kpatch-build | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build
index 57b00c5..d35ede4 100755
--- a/kpatch-build/kpatch-build
+++ b/kpatch-build/kpatch-build
@@ -738,13 +738,14 @@ usage() {
echo " --skip-compiler-check Skip compiler version matching check" >&2
echo " (not recommended)" >&2
echo " --version Version of kpatch-build"
+ echo " -p, --profile-data specify profile data for PGO (clang only)" >&2
}
if ! command -v gawk &> /dev/null; then
die "gawk not installed"
fi
-options="$(getopt -o ha:r:s:c:v:j:t:n:o:dR -l "help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,oot-module-src:,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace,version" -- "$@")" || die "getopt failed"
+options="$(getopt -o ha:r:s:c:v:j:t:n:o:dRp: -l "help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,oot-module-src:,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace,version,profile-data" -- "$@")" || die "getopt failed"
eval set -- "$options"
@@ -830,6 +831,10 @@ while [[ $# -gt 0 ]]; do
echo "Version : $VERSION"
exit 0
;;
+ -p|--profile-data)
+ PROFILE_DATA="$(readlink -f "$2")"
+ shift
+ ;;
*)
[[ "$1" = "--" ]] && shift && continue
[[ ! -f "$1" ]] && die "patch file '$1' not found"
@@ -1242,6 +1247,16 @@ fi
if [[ -n "$CONFIG_CC_IS_CLANG" ]]; then
echo "WARNING: Clang support is experimental"
+ if [[ -z "$PROFILE_DATA" ]] && [[ -n "$CONFIG_PGO_CLANG" ]]; then
+ die "Please specify profile-data for CONFIG_PGO_CLANG"
+ fi
+ if [[ -n "$PROFILE_DATA" ]] && [[ -z "$CONFIG_PGO_CLANG" ]]; then
+ echo "WARNING profile-data specified w/o CONFIG_PGO_CLANG, ignore it"
+ fi
+else
+ if [[ -n "$PROFILE_DATA" ]]; then
+ die "Only supports profile-data with Clang"
+ fi
fi
if [[ "$SKIPCOMPILERCHECK" -eq 0 ]]; then
@@ -1296,6 +1311,10 @@ declare -a MAKEVARS
if [[ -n "$CONFIG_CC_IS_CLANG" ]]; then
MAKEVARS+=("CC=${KPATCH_CC_PREFIX}${CLANG}")
MAKEVARS+=("HOSTCC=clang")
+ if [[ -n "$CONFIG_PGO_CLANG" ]]; then
+ MAKEVARS+=("CFLAGS_PGO_CLANG=-fprofile-use=$PROFILE_DATA")
+ MAKEVARS+=("LLVM=1")
+ fi
else
MAKEVARS+=("CC=${KPATCH_CC_PREFIX}${GCC}")
fi
--
2.48.1