- Revision
- 294952
- Author
- e...@apple.com
- Date
- 2022-05-27 14:10:47 -0700 (Fri, 27 May 2022)
Log Message
[Xcode] Compute PGO profdata paths instead of searching for them at build time
https://bugs.webkit.org/show_bug.cgi?id=239681
Reviewed by Wenson Hsieh and Alexey Proskuryakov.
Production builds should always use profdata from the SDK, internal
release builds should use profdata from the local WebKitAdditions when
available, and open source builds should use the stub profdata. Add a
PROFILE_DATA_PATH build setting which implements these rules and replace
the script phases that checked those paths dynamically.
This fixes XCBuild validation issues in the open-source build, and
should prevent production builders from using stale profdata in
BUILT_PRODUCTS_DIR. Additionally, engineers can now build with custom
profile data by overriding PROFILE_DATA_PATH.
* Source/_javascript_Core/Configurations/_javascript_Core.xcconfig:
* Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj:
* Source/_javascript_Core/Scripts/copy-profiling-data.sh: Added. This file
is part of _javascript_Core's private headers and replaces the "Copy
Profiling Data" script phase logic all projects.
* Source/WebKit/Configurations/BaseTarget.xcconfig:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebCore/Configurations/WebCore.xcconfig:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
Canonical link: https://commits.webkit.org/251060@main
Modified Paths
Added Paths
Diff
Modified: trunk/Source/_javascript_Core/Configurations/_javascript_Core.xcconfig (294951 => 294952)
--- trunk/Source/_javascript_Core/Configurations/_javascript_Core.xcconfig 2022-05-27 20:52:05 UTC (rev 294951)
+++ trunk/Source/_javascript_Core/Configurations/_javascript_Core.xcconfig 2022-05-27 21:10:47 UTC (rev 294952)
@@ -40,6 +40,11 @@
SECTORDER_FLAGS_Production[sdk=iphoneos*] = -Wl,-order_file,$(SDKROOT)/AppleInternal/OrderFiles/_javascript_Core.order;
SECTORDER_FLAGS_Production[sdk=macosx*] = -Wl,-order_file,_javascript_Core.order;
+PROFILE_DATA_PATH = $(PROFILE_DATA_PATH_INTERNAL_$(USE_INTERNAL_SDK));
+PROFILE_DATA_PATH_INTERNAL_ = $(SRCROOT)/../../Tools/Profiling/Empty.profdata;
+PROFILE_DATA_PATH_INTERNAL_YES = $(BUILT_PRODUCTS_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed;
+PROFILE_DATA_PATH_INTERNAL_YES[config=Production] = $(SDK_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed;
+
PROFILE_DATA_FLAGS_ENABLED = -fprofile-instr-use=$(BUILT_PRODUCTS_DIR)/DerivedSources/_javascript_Core/_javascript_Core.profdata;
PROFILE_DATA_FLAGS = $(PROFILE_DATA_FLAGS_$(CONFIGURATION)_$(WK_PLATFORM_NAME));
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (294951 => 294952)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2022-05-27 20:52:05 UTC (rev 294951)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2022-05-27 21:10:47 UTC (rev 294952)
@@ -1827,6 +1827,7 @@
DD41FA8627CDAD3200394D95 /* LowLevelInterpreter.asm in Sources */ = {isa = PBXBuildFile; fileRef = 86A054461556451B00445157 /* LowLevelInterpreter.asm */; };
DD41FA8727CDAD4300394D95 /* LowLevelInterpreter.asm in Sources */ = {isa = PBXBuildFile; fileRef = 86A054461556451B00445157 /* LowLevelInterpreter.asm */; };
DD41FA8927CDDDEF00394D95 /* LowLevelInterpreter.asm in Sources */ = {isa = PBXBuildFile; fileRef = 86A054461556451B00445157 /* LowLevelInterpreter.asm */; };
+ DD5F74F9283EF58D0027A8C6 /* copy-profiling-data.sh in Headers */ = {isa = PBXBuildFile; fileRef = DD5F74F8283EF4380027A8C6 /* copy-profiling-data.sh */; settings = {ATTRIBUTES = (Private, ); }; };
DDB04F41278E569A008D3678 /* libWTF.a in Product Dependencies */ = {isa = PBXBuildFile; fileRef = 1498CAD3214656C400710879 /* libWTF.a */; };
DDB04F42278E56A2008D3678 /* libWTF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1498CAD3214656C400710879 /* libWTF.a */; };
DDE99310278D087D00F60D26 /* libWebKitAdditions.a in Product Dependencies */ = {isa = PBXBuildFile; fileRef = DDE9930E278D086600F60D26 /* libWebKitAdditions.a */; };
@@ -5253,6 +5254,7 @@
DCF3D5681CD29468003D5C65 /* LazyPropertyInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LazyPropertyInlines.h; sourceTree = "<group>"; };
DCFDFBD71D1F5D9800FE3D72 /* B3BottomProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3BottomProvider.h; path = b3/B3BottomProvider.h; sourceTree = "<group>"; };
DCFDFBD81D1F5D9800FE3D72 /* B3TypeMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3TypeMap.h; path = b3/B3TypeMap.h; sourceTree = "<group>"; };
+ DD5F74F8283EF4380027A8C6 /* copy-profiling-data.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "copy-profiling-data.sh"; sourceTree = "<group>"; };
DDE9930E278D086600F60D26 /* libWebKitAdditions.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWebKitAdditions.a; sourceTree = BUILT_PRODUCTS_DIR; };
DE26E9021CB5DD0500D2BE82 /* BuiltinExecutableCreator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BuiltinExecutableCreator.h; sourceTree = "<group>"; };
DE26E9061CB5DD9600D2BE82 /* BuiltinExecutableCreator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BuiltinExecutableCreator.cpp; sourceTree = "<group>"; };
@@ -9137,6 +9139,7 @@
children = (
535E08C9225460AB00DF00CA /* postprocess-header-rule */,
99DA00971BD598E000F4575C /* wkbuiltins */,
+ DD5F74F8283EF4380027A8C6 /* copy-profiling-data.sh */,
9959E9271BD17FA0001AA413 /* cssmin.py */,
9959E92F1BD181F6001AA413 /* generate-combined-inspector-json.py */,
99DA00AC1BD5993E00F4575C /* generate-js-builtins.py */,
@@ -10009,6 +10012,7 @@
E3FCCB642310A90D00238E72 /* ConstructorKind.h in Headers */,
A57D23F21891B5B40031C7FA /* ContentSearchUtilities.h in Headers */,
52678F911A04177C006A306D /* ControlFlowProfiler.h in Headers */,
+ DD5F74F9283EF58D0027A8C6 /* copy-profiling-data.sh in Headers */,
C4F4B6F41A05C944005CAB76 /* cpp_generator.py in Headers */,
C4F4B6F31A05C944005CAB76 /* cpp_generator_templates.py in Headers */,
0F30D7C01D95D6320053089D /* CPU.h in Headers */,
@@ -12106,9 +12110,9 @@
inputFileListPaths = (
);
inputPaths = (
- "$(BUILT_PRODUCTS_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed",
+ "$(PROFILE_DATA_PATH)",
"$(SRCROOT)/../../Tools/Profiling/Empty.profdata",
- "$(SDK_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed",
+ "$(SRCROOT)/Scripts/copy-profiling-data.sh",
);
name = "Copy Profiling Data";
outputFileListPaths = (
@@ -12118,7 +12122,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "if [ \"${ACTION}\" = \"installhdrs\" -o \"${ACTION}\" = \"installapi\" ]; then\n exit 0;\nfi\n\nif [ -z \"${PROFILE_DATA_FLAGS}\" ]; then\n exit 0;\nfi\n\nRELATIVE_PROFILE_DATA_PATH=\"usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed\";\nABSOLUTE_PROFILE_DATA_PATH=\"${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\n\nif [ ! -f \"${ABSOLUTE_PROFILE_DATA_PATH}\" ]; then\n ABSOLUTE_PROFILE_DATA_PATH=\"${SDK_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\nfi\n\nif [ ! -f \"${ABSOLUTE_PROFILE_DATA_PATH}\" ] || [ $(wc -c <${ABSOLUTE_PROFILE_DATA_PATH}) -lt 4096 ]; then\n if [ \"${CONFIGURATION}\" = \"Production\" ]; then\n echo \"Error: production build missing profiling data at both ${ABSOLUTE_PROFILE_DATA_PATH} and ${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\n
exit 1;\n fi\n echo \"Missing or invalid profiling data at both ${ABSOLUTE_PROFILE_DATA_PATH} and ${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH} - falling back to empty file\";\n cp ${SRCROOT}/../../Tools/Profiling/Empty.profdata ${BUILT_PRODUCTS_DIR}/DerivedSources/_javascript_Core/_javascript_Core.profdata;\nelse\n echo \"Copying profiling data at ${ABSOLUTE_PROFILE_DATA_PATH}\";\n compression_tool -decode -i ${ABSOLUTE_PROFILE_DATA_PATH} -o ${BUILT_PRODUCTS_DIR}/DerivedSources/_javascript_Core/_javascript_Core.profdata -a lzfse;\nfi\n";
+ shellScript = "if [ \"${ACTION}\" = \"installhdrs\" -o \"${ACTION}\" = \"installapi\" ]; then\n exit 0;\nfi\n${SCRIPT_INPUT_FILE_2}\n";
};
/* End PBXShellScriptBuildPhase section */
Added: trunk/Source/_javascript_Core/Scripts/copy-profiling-data.sh (0 => 294952)
--- trunk/Source/_javascript_Core/Scripts/copy-profiling-data.sh (rev 0)
+++ trunk/Source/_javascript_Core/Scripts/copy-profiling-data.sh 2022-05-27 21:10:47 UTC (rev 294952)
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+if [ -z "${PROFILE_DATA_FLAGS}" ]; then
+ exit 0;
+fi
+
+input_profdata="${SCRIPT_INPUT_FILE_0}"
+input_profdata_type="$(file -b "${input_profdata}")"
+
+fallback_decompressed_profdata="${SCRIPT_INPUT_FILE_1}"
+derived_decompressed_profdata="${SCRIPT_OUTPUT_FILE_0}"
+
+if [[ "${input_profdata_type}" = "lzfse compressed"* ]]; then
+ set -x; compression_tool -decode -i "${input_profdata}" -o "${derived_decompressed_profdata}" -a lzfse
+elif [[ "${input_profdata_type}" = "LLVM indexed profile data"* ]]; then
+ set -x; cp "${input_profdata}" "${derived_decompressed_profdata}"
+elif [ "${input_profdata}" != "${fallback_decompressed_profdata}" ]; then
+ echo "warning: unrecognized profiling data at ${input_profdata}, falling back to stub data"
+ set -x; cp "${fallback_decompressed_profdata}" "${derived_decompressed_profdata}"
+else
+ echo "error: unrecognized profiling data at ${input_profdata}"
+ exit 1
+fi
+
Property changes on: trunk/Source/_javascript_Core/Scripts/copy-profiling-data.sh
___________________________________________________________________
Added: svn:executable
+*
\ No newline at end of property
Modified: trunk/Source/WebCore/Configurations/WebCore.xcconfig (294951 => 294952)
--- trunk/Source/WebCore/Configurations/WebCore.xcconfig 2022-05-27 20:52:05 UTC (rev 294951)
+++ trunk/Source/WebCore/Configurations/WebCore.xcconfig 2022-05-27 21:10:47 UTC (rev 294952)
@@ -29,6 +29,11 @@
GCC_PREFIX_HEADER = WebCorePrefix.h;
GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) BUILDING_WEBKIT GL_SILENCE_DEPRECATION=1 GLES_SILENCE_DEPRECATION=1 $(inherited);
+PROFILE_DATA_PATH = $(PROFILE_DATA_PATH_INTERNAL_$(USE_INTERNAL_SDK));
+PROFILE_DATA_PATH_INTERNAL_ = $(SRCROOT)/../../Tools/Profiling/Empty.profdata;
+PROFILE_DATA_PATH_INTERNAL_YES = $(BUILT_PRODUCTS_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed;
+PROFILE_DATA_PATH_INTERNAL_YES[config=Production] = $(SDK_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed;
+
PROFILE_DATA_FLAGS_ENABLED = -fprofile-instr-use=$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/WebCore.profdata;
PROFILE_DATA_FLAGS = $(PROFILE_DATA_FLAGS_$(CONFIGURATION)_$(WK_PLATFORM_NAME));
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (294951 => 294952)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2022-05-27 20:52:05 UTC (rev 294951)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2022-05-27 21:10:47 UTC (rev 294952)
@@ -38921,9 +38921,9 @@
inputFileListPaths = (
);
inputPaths = (
- "$(BUILT_PRODUCTS_DIR)/usr/local/include/WebKitAdditions/Profiling/WebCore.profdata.compressed",
+ "$(PROFILE_DATA_PATH)",
"$(SRCROOT)/../../Tools/Profiling/Empty.profdata",
- "$(SDK_DIR)/usr/local/include/WebKitAdditions/Profiling/WebCore.profdata.compressed",
+ "$(_javascript_CORE_PRIVATE_HEADERS_DIR)/copy-profiling-data.sh",
);
name = "Copy Profiling Data";
outputFileListPaths = (
@@ -38933,7 +38933,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "if [ \"${ACTION}\" = \"installhdrs\" -o \"${ACTION}\" = \"installapi\" ]; then\n exit 0;\nfi\n\nif [ -z \"${PROFILE_DATA_FLAGS}\" ]; then\n exit 0;\nfi\n\nRELATIVE_PROFILE_DATA_PATH=\"usr/local/include/WebKitAdditions/Profiling/WebCore.profdata.compressed\";\nABSOLUTE_PROFILE_DATA_PATH=\"${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\n\nif [ ! -f \"${ABSOLUTE_PROFILE_DATA_PATH}\" ]; then\n ABSOLUTE_PROFILE_DATA_PATH=\"${SDK_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\nfi\n\nif [ ! -f \"${ABSOLUTE_PROFILE_DATA_PATH}\" ] || [ $(wc -c <${ABSOLUTE_PROFILE_DATA_PATH}) -lt 4096 ]; then\n if [ \"${CONFIGURATION}\" = \"Production\" ]; then\n echo \"Error: production build missing profiling data at both ${ABSOLUTE_PROFILE_DATA_PATH} and ${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\n exit 1
;\n fi\n echo \"Missing or invalid profiling data at both ${ABSOLUTE_PROFILE_DATA_PATH} and ${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH} - falling back to empty file\";\n cp ${SRCROOT}/../../Tools/Profiling/Empty.profdata ${BUILT_PRODUCTS_DIR}/DerivedSources/WebCore/WebCore.profdata;\nelse\n echo \"Copying profiling data at ${ABSOLUTE_PROFILE_DATA_PATH}\";\n compression_tool -decode -i ${ABSOLUTE_PROFILE_DATA_PATH} -o ${BUILT_PRODUCTS_DIR}/DerivedSources/WebCore/WebCore.profdata -a lzfse;\nfi\n";
+ shellScript = "if [ \"${ACTION}\" = \"installhdrs\" -o \"${ACTION}\" = \"installapi\" ]; then\n exit 0;\nfi\n${SCRIPT_INPUT_FILE_2}\n";
};
/* End PBXShellScriptBuildPhase section */
Modified: trunk/Source/WebKit/Configurations/BaseTarget.xcconfig (294951 => 294952)
--- trunk/Source/WebKit/Configurations/BaseTarget.xcconfig 2022-05-27 20:52:05 UTC (rev 294951)
+++ trunk/Source/WebKit/Configurations/BaseTarget.xcconfig 2022-05-27 21:10:47 UTC (rev 294952)
@@ -50,6 +50,11 @@
HEADER_SEARCH_PATHS = $(ALTERNATE_HEADER_SEARCH_PATHS) $(BUILT_PRODUCTS_DIR)/usr/local/include "$(WEBCORE_PRIVATE_HEADERS_DIR)/ForwardingHeaders" $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit $(WEBGPU_HEADER_SEARCH_PATHS) $(WEBKITADDITIONS_HEADER_SEARCH_PATHS) $(LIBWEBRTC_HEADER_SEARCH_PATHS) $(SRCROOT) $(HEADER_SEARCH_PATHS);
+PROFILE_DATA_PATH = $(PROFILE_DATA_PATH_INTERNAL_$(USE_INTERNAL_SDK));
+PROFILE_DATA_PATH_INTERNAL_ = $(SRCROOT)/../../Tools/Profiling/Empty.profdata;
+PROFILE_DATA_PATH_INTERNAL_YES = $(BUILT_PRODUCTS_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed;
+PROFILE_DATA_PATH_INTERNAL_YES[config=Production] = $(SDK_DIR)/usr/local/include/WebKitAdditions/Profiling/_javascript_Core.profdata.compressed;
+
PROFILE_DATA_FLAGS_ENABLED = -fprofile-instr-use=$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/WebKit.profdata;
PROFILE_DATA_FLAGS = $(PROFILE_DATA_FLAGS_$(CONFIGURATION)_$(WK_PLATFORM_NAME));
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (294951 => 294952)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2022-05-27 20:52:05 UTC (rev 294951)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2022-05-27 21:10:47 UTC (rev 294952)
@@ -16597,9 +16597,9 @@
inputFileListPaths = (
);
inputPaths = (
- "$(BUILT_PRODUCTS_DIR)/usr/local/include/WebKitAdditions/Profiling/WebKit.profdata.compressed",
+ "$(PROFILE_DATA_PATH)",
"$(SRCROOT)/../../Tools/Profiling/Empty.profdata",
- "$(SDK_DIR)/usr/local/include/WebKitAdditions/Profiling/WebKit.profdata.compressed",
+ "$(_javascript_CORE_PRIVATE_HEADERS_DIR)/copy-profiling-data.sh",
);
name = "Copy Profiling Data";
outputFileListPaths = (
@@ -16609,7 +16609,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "if [ \"${ACTION}\" = \"installhdrs\" -o \"${ACTION}\" = \"installapi\" ]; then\n exit 0;\nfi\n\nif [ -z \"${PROFILE_DATA_FLAGS}\" ]; then\n exit 0;\nfi\n\nRELATIVE_PROFILE_DATA_PATH=\"usr/local/include/WebKitAdditions/Profiling/WebKit.profdata.compressed\";\nABSOLUTE_PROFILE_DATA_PATH=\"${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\n\nif [ ! -f \"${ABSOLUTE_PROFILE_DATA_PATH}\" ]; then\n ABSOLUTE_PROFILE_DATA_PATH=\"${SDK_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\nfi\n\nif [ ! -f \"${ABSOLUTE_PROFILE_DATA_PATH}\" ] || [ $(wc -c <${ABSOLUTE_PROFILE_DATA_PATH}) -lt 4096 ]; then\n if [ \"${CONFIGURATION}\" = \"Production\" ]; then\n echo \"Error: production build missing profiling data at both ${ABSOLUTE_PROFILE_DATA_PATH} and ${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH}\";\n exit 1;
\n fi\n echo \"Missing or invalid profiling data at both ${ABSOLUTE_PROFILE_DATA_PATH} and ${BUILT_PRODUCTS_DIR}/${RELATIVE_PROFILE_DATA_PATH} - falling back to empty file\";\n cp ${SRCROOT}/../../Tools/Profiling/Empty.profdata ${BUILT_PRODUCTS_DIR}/DerivedSources/WebKit/WebKit.profdata;\nelse\n echo \"Copying profiling data at ${ABSOLUTE_PROFILE_DATA_PATH}\";\n compression_tool -decode -i ${ABSOLUTE_PROFILE_DATA_PATH} -o ${BUILT_PRODUCTS_DIR}/DerivedSources/WebKit/WebKit.profdata -a lzfse;\nfi\n";
+ shellScript = "if [ \"${ACTION}\" = \"installhdrs\" -o \"${ACTION}\" = \"installapi\" ]; then\n exit 0;\nfi\n${SCRIPT_INPUT_FILE_2}\n";
};
/* End PBXShellScriptBuildPhase section */