fix: Clang PGO Linux Filepath Naming

Signed-off-by: Collecting <collecting@noreply.localhost>
This commit is contained in:
Collecting
2025-12-26 18:29:48 +00:00
parent 01c0420481
commit 273e9b18e7

View File

@@ -102,24 +102,16 @@ function(citron_configure_pgo target_name)
if(MSVC) if(MSVC)
if(CITRON_ENABLE_PGO_GENERATE) if(CITRON_ENABLE_PGO_GENERATE)
message(STATUS " [${target_name}] MSVC PGO: GENERATE stage") message(STATUS " [${target_name}] MSVC PGO: GENERATE stage")
# Use FASTGENPROFILE for faster profiling with similar accuracy
# GENPROFILE provides more detailed profiling but is slower
# You can change FASTGENPROFILE to GENPROFILE for more accuracy but slower profiling
target_compile_options(${target_name} PRIVATE /GL) target_compile_options(${target_name} PRIVATE /GL)
target_link_options(${target_name} PRIVATE target_link_options(${target_name} PRIVATE
/LTCG /LTCG
/FASTGENPROFILE /FASTGENPROFILE
/PGD:"${CITRON_PGO_PROFILE_DIR}/${target_name}.pgd" /PGD:"${CITRON_PGO_PROFILE_DIR}/${target_name}.pgd"
) )
# Copy PGO runtime DLLs to output directory
citron_copy_pgo_runtime_dlls(${target_name}) citron_copy_pgo_runtime_dlls(${target_name})
elseif(CITRON_ENABLE_PGO_USE) elseif(CITRON_ENABLE_PGO_USE)
message(STATUS " [${target_name}] MSVC PGO: USE stage") message(STATUS " [${target_name}] MSVC PGO: USE stage")
# Check if profile data exists in pgo-profiles directory
set(PGD_FILE "${CITRON_PGO_PROFILE_DIR}/${target_name}.pgd") set(PGD_FILE "${CITRON_PGO_PROFILE_DIR}/${target_name}.pgd")
# Also check in the output directory (where MSVC creates them during GENERATE)
get_target_property(TARGET_OUTPUT_DIR ${target_name} RUNTIME_OUTPUT_DIRECTORY) get_target_property(TARGET_OUTPUT_DIR ${target_name} RUNTIME_OUTPUT_DIRECTORY)
if(NOT TARGET_OUTPUT_DIR) if(NOT TARGET_OUTPUT_DIR)
set(TARGET_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin") set(TARGET_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin")
@@ -128,7 +120,6 @@ function(citron_configure_pgo target_name)
if(EXISTS "${PGD_FILE}") if(EXISTS "${PGD_FILE}")
target_compile_options(${target_name} PRIVATE /GL) target_compile_options(${target_name} PRIVATE /GL)
# Use the profile directory path
file(TO_NATIVE_PATH "${PGD_FILE}" PGD_FILE_NATIVE) file(TO_NATIVE_PATH "${PGD_FILE}" PGD_FILE_NATIVE)
target_link_options(${target_name} PRIVATE target_link_options(${target_name} PRIVATE
/LTCG /LTCG
@@ -137,7 +128,6 @@ function(citron_configure_pgo target_name)
message(STATUS " [${target_name}] Using profile data: ${PGD_FILE}") message(STATUS " [${target_name}] Using profile data: ${PGD_FILE}")
elseif(EXISTS "${PGD_FILE_OUTPUT}") elseif(EXISTS "${PGD_FILE_OUTPUT}")
target_compile_options(${target_name} PRIVATE /GL) target_compile_options(${target_name} PRIVATE /GL)
# Use the output directory path
file(TO_NATIVE_PATH "${PGD_FILE_OUTPUT}" PGD_FILE_NATIVE) file(TO_NATIVE_PATH "${PGD_FILE_OUTPUT}" PGD_FILE_NATIVE)
target_link_options(${target_name} PRIVATE target_link_options(${target_name} PRIVATE
/LTCG /LTCG
@@ -156,24 +146,14 @@ function(citron_configure_pgo target_name)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(CITRON_ENABLE_PGO_GENERATE) if(CITRON_ENABLE_PGO_GENERATE)
message(STATUS " [${target_name}] GCC PGO: GENERATE stage") message(STATUS " [${target_name}] GCC PGO: GENERATE stage")
target_compile_options(${target_name} PRIVATE target_compile_options(${target_name} PRIVATE -fprofile-generate -fprofile-dir=${CITRON_PGO_PROFILE_DIR})
-fprofile-generate="${CITRON_PGO_PROFILE_DIR}" target_link_options(${target_name} PRIVATE -fprofile-generate -fprofile-dir=${CITRON_PGO_PROFILE_DIR})
)
target_link_options(${target_name} PRIVATE
-fprofile-generate="${CITRON_PGO_PROFILE_DIR}"
)
elseif(CITRON_ENABLE_PGO_USE) elseif(CITRON_ENABLE_PGO_USE)
message(STATUS " [${target_name}] GCC PGO: USE stage") message(STATUS " [${target_name}] GCC PGO: USE stage")
# Check if profile data exists
file(GLOB profile_files "${CITRON_PGO_PROFILE_DIR}/*.gcda") file(GLOB profile_files "${CITRON_PGO_PROFILE_DIR}/*.gcda")
if(profile_files) if(profile_files)
target_compile_options(${target_name} PRIVATE target_compile_options(${target_name} PRIVATE -fprofile-use -fprofile-correction -fprofile-dir=${CITRON_PGO_PROFILE_DIR})
-fprofile-use="${CITRON_PGO_PROFILE_DIR}" target_link_options(${target_name} PRIVATE -fprofile-use -fprofile-dir=${CITRON_PGO_PROFILE_DIR})
-fprofile-correction # Handle inconsistencies in profile data
)
target_link_options(${target_name} PRIVATE
-fprofile-use="${CITRON_PGO_PROFILE_DIR}"
)
message(STATUS " [${target_name}] Using profile data from: ${CITRON_PGO_PROFILE_DIR}") message(STATUS " [${target_name}] Using profile data from: ${CITRON_PGO_PROFILE_DIR}")
else() else()
message(WARNING "No profile data found for ${target_name} in ${CITRON_PGO_PROFILE_DIR}. PGO USE stage will be skipped.") message(WARNING "No profile data found for ${target_name} in ${CITRON_PGO_PROFILE_DIR}. PGO USE stage will be skipped.")
@@ -184,19 +164,12 @@ function(citron_configure_pgo target_name)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
if(CITRON_ENABLE_PGO_GENERATE) if(CITRON_ENABLE_PGO_GENERATE)
message(STATUS " [${target_name}] Clang PGO: GENERATE stage") message(STATUS " [${target_name}] Clang PGO: GENERATE stage")
target_compile_options(${target_name} PRIVATE target_compile_options(${target_name} PRIVATE -fprofile-instr-generate)
-fprofile-generate="${CITRON_PGO_PROFILE_DIR}" target_link_options(${target_name} PRIVATE -fprofile-instr-generate)
)
target_link_options(${target_name} PRIVATE
-fprofile-generate="${CITRON_PGO_PROFILE_DIR}"
)
elseif(CITRON_ENABLE_PGO_USE) elseif(CITRON_ENABLE_PGO_USE)
message(STATUS " [${target_name}] Clang PGO: USE stage") message(STATUS " [${target_name}] Clang PGO: USE stage")
# For Clang, we need to merge .profraw files into .profdata first
set(PROFDATA_FILE "${CITRON_PGO_PROFILE_DIR}/default.profdata") set(PROFDATA_FILE "${CITRON_PGO_PROFILE_DIR}/default.profdata")
# Check if merged profile data exists, if not try to create it
if(NOT EXISTS "${PROFDATA_FILE}") if(NOT EXISTS "${PROFDATA_FILE}")
file(GLOB profraw_files "${CITRON_PGO_PROFILE_DIR}/*.profraw") file(GLOB profraw_files "${CITRON_PGO_PROFILE_DIR}/*.profraw")
if(profraw_files) if(profraw_files)
@@ -215,7 +188,6 @@ function(citron_configure_pgo target_name)
endif() endif()
else() else()
message(WARNING "llvm-profdata not found. Cannot merge profile data. PGO USE stage will be skipped.") message(WARNING "llvm-profdata not found. Cannot merge profile data. PGO USE stage will be skipped.")
message(STATUS " Please run: llvm-profdata merge -output=${PROFDATA_FILE} ${CITRON_PGO_PROFILE_DIR}/*.profraw")
return() return()
endif() endif()
else() else()
@@ -225,12 +197,8 @@ function(citron_configure_pgo target_name)
endif() endif()
if(EXISTS "${PROFDATA_FILE}") if(EXISTS "${PROFDATA_FILE}")
target_compile_options(${target_name} PRIVATE target_compile_options(${target_name} PRIVATE -fprofile-instr-use=${PROFDATA_FILE})
-fprofile-use="${PROFDATA_FILE}" target_link_options(${target_name} PRIVATE -fprofile-instr-use=${PROFDATA_FILE})
)
target_link_options(${target_name} PRIVATE
-fprofile-use="${PROFDATA_FILE}"
)
message(STATUS " [${target_name}] Using profile data: ${PROFDATA_FILE}") message(STATUS " [${target_name}] Using profile data: ${PROFDATA_FILE}")
endif() endif()
endif() endif()
@@ -249,15 +217,19 @@ function(citron_print_pgo_instructions)
message(STATUS "Citron has been built with profiling instrumentation.") message(STATUS "Citron has been built with profiling instrumentation.")
message(STATUS "") message(STATUS "")
message(STATUS "Next steps:") message(STATUS "Next steps:")
message(STATUS " 1. Run the built citron executable") message(STATUS " 1. Run the built citron executable from its directory (e.g., ./build)")
message(STATUS " 2. Play games/perform typical operations to generate profile data") message(STATUS " 2. Play games/perform typical operations to generate profile data")
message(STATUS " 3. Exit citron") message(STATUS " 3. Exit citron cleanly (use Ctrl+Q or File -> Exit)")
message(STATUS " 4. Profile data will be saved to: ${CITRON_PGO_PROFILE_DIR}")
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(STATUS " 5. For Clang: Merge profile data with:") message(STATUS " 4. For Clang: Profile data (*.profraw) will be in the directory you ran citron from.")
message(STATUS " MOVE these files to the profile directory with:")
message(STATUS " mv default*.profraw ${CITRON_PGO_PROFILE_DIR}/")
message(STATUS " 5. Merge the profile data with:")
message(STATUS " llvm-profdata merge -output=${CITRON_PGO_PROFILE_DIR}/default.profdata ${CITRON_PGO_PROFILE_DIR}/*.profraw") message(STATUS " llvm-profdata merge -output=${CITRON_PGO_PROFILE_DIR}/default.profdata ${CITRON_PGO_PROFILE_DIR}/*.profraw")
else()
message(STATUS " 4. Profile data will be saved to: ${CITRON_PGO_PROFILE_DIR}")
endif() endif()
message(STATUS " 6. Rebuild with: cmake -DCITRON_ENABLE_PGO_GENERATE=OFF -DCITRON_ENABLE_PGO_USE=ON") message(STATUS " 6. Rebuild with: cmake -DCITRON_ENABLE_PGO_GENERATE=OFF -DCITRON_ENABLE_PGO_USE=ON .")
message(STATUS "=================================================================") message(STATUS "=================================================================")
message(STATUS "") message(STATUS "")
elseif(CITRON_ENABLE_PGO_USE) elseif(CITRON_ENABLE_PGO_USE)
@@ -271,4 +243,3 @@ function(citron_print_pgo_instructions)
message(STATUS "") message(STATUS "")
endif() endif()
endfunction() endfunction()