From 6a31da59055f9149e632df351e09ab8c0de9adb7 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Fri, 7 Mar 2025 20:23:23 +1000 Subject: [PATCH] cmake: Add Profile-Guided Optimization (PGO) support Adds support for Profile-Guided Optimization builds on both Windows (MSVC) and Linux (GCC/Clang) platforms. This allows for performance optimizations based on real usage patterns. For MSVC: - Adds /GL and /LTCG:PGINSTRUMENT flags for instrumentation - Adds /GL and /LTCG:PGOPTIMIZE flags for optimization For GCC: - Adds -fprofile-generate flags for instrumentation - Adds -fprofile-use flags for optimization For Clang: - Adds -fprofile-instr-generate flags for instrumentation - Adds -fprofile-instr-use flags for optimization Controlled by two new CMake options: - CITRON_ENABLE_PGO_INSTRUMENT: Enable instrumentation build - CITRON_ENABLE_PGO_OPTIMIZE: Enable optimization build Updated submodules: - Vulkan-Headers to 0f0cfd8 - Vulkan-Utility-Libraries to 50563f4 - vcpkg to cd1099f --- CMakeLists.txt | 39 ++++++++++++++++++++++++++++++ externals/Vulkan-Headers | 2 +- externals/Vulkan-Utility-Libraries | 2 +- externals/vcpkg | 2 +- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 542fce810..90388bf09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -684,3 +684,42 @@ if(ENABLE_QT AND UNIX AND NOT APPLE) install(FILES "dist/org.citron_emu.citron.metainfo.xml" DESTINATION "share/metainfo") endif() + +# PGO Configuration +option(CITRON_ENABLE_PGO_INSTRUMENT "Enable Profile-Guided Optimization instrumentation build" OFF) +option(CITRON_ENABLE_PGO_OPTIMIZE "Enable Profile-Guided Optimization optimization build" OFF) + +if(MSVC) + if(CITRON_ENABLE_PGO_INSTRUMENT) + string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL /LTCG:PGINSTRUMENT") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /LTCG:PGINSTRUMENT") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /LTCG:PGINSTRUMENT") + elseif(CITRON_ENABLE_PGO_OPTIMIZE) + string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL /LTCG:PGOPTIMIZE") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /LTCG:PGOPTIMIZE") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /LTCG:PGOPTIMIZE") + endif() +else() + # GCC and Clang PGO flags + if(CITRON_ENABLE_PGO_INSTRUMENT) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-instr-generate") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-instr-generate") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-instr-generate") + else() # GCC + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-generate") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-generate") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-generate") + endif() + elseif(CITRON_ENABLE_PGO_OPTIMIZE) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-instr-use=default.profdata") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-instr-use=default.profdata") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-instr-use=default.profdata") + else() # GCC + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-use") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-use") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-use") + endif() + endif() +endif() diff --git a/externals/Vulkan-Headers b/externals/Vulkan-Headers index 952f776f6..0f0cfd88d 160000 --- a/externals/Vulkan-Headers +++ b/externals/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 952f776f6573aafbb62ea717d871cd1d6816c387 +Subproject commit 0f0cfd88d7e6ece3ca6456df692f0055bde94be7 diff --git a/externals/Vulkan-Utility-Libraries b/externals/Vulkan-Utility-Libraries index 5f41f2a9b..50563f483 160000 --- a/externals/Vulkan-Utility-Libraries +++ b/externals/Vulkan-Utility-Libraries @@ -1 +1 @@ -Subproject commit 5f41f2a9bf3589dc5d1791d42ff46f1abe873f2b +Subproject commit 50563f48368d75281bc2fb1c3407dc531ce28910 diff --git a/externals/vcpkg b/externals/vcpkg index efb1e7436..cd1099f42 160000 --- a/externals/vcpkg +++ b/externals/vcpkg @@ -1 +1 @@ -Subproject commit efb1e7436979a30c4d3e5ab2375fd8e2e461d541 +Subproject commit cd1099f42a3c2ee28dc68e3db3f6f88658982736