[cmake] Changes to get Windows self-host working with PGO Fixes quoting of profile arguments to work on Windows Suppresses adding profile arguments to linker flags when using lld-link Avoids -fprofile-instr-use being added to rc.exe flags Removes duplicated adding of -fprofile-instr-use to linker flags (since r355541) Move handling LLVM_PROFDATA_FILE to HandleLLVMOptions.cmake Differential Revision: https://reviews.llvm.org/D62063 llvm-svn: 372209 diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index b9a10685b99..73f8664cdcf 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -612,6 +612,9 @@ mark_as_advanced(LLVM_TARGET_TRIPLE_ENV) set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL "Enable per-target runtimes directory") +set(LLVM_PROFDATA_FILE "" CACHE FILEPATH + "Profiling data file to use when compiling in order to improve runtime performance.") + # All options referred to from HandleLLVMOptions have to be specified # BEFORE this include, otherwise options will not be correctly set on # first cmake run @@ -873,17 +876,6 @@ endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) # use export_executable_symbols(target). set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") -set(LLVM_PROFDATA_FILE "" CACHE FILEPATH - "Profiling data file to use when compiling in order to improve runtime performance.") - -if(LLVM_PROFDATA_FILE AND EXISTS ${LLVM_PROFDATA_FILE}) - if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) - add_definitions("-fprofile-instr-use=${LLVM_PROFDATA_FILE}") - else() - message(FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang") - endif() -endif() - include(AddLLVM) include(TableGen) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 4425eb91a5f..2e780d56254 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -846,32 +846,48 @@ string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED) if (LLVM_BUILD_INSTRUMENTED) if (LLVM_ENABLE_IR_PGO OR uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "IR") - append("-fprofile-generate='${LLVM_PROFILE_DATA_DIR}'" + append("-fprofile-generate=\"${LLVM_PROFILE_DATA_DIR}\"" CMAKE_CXX_FLAGS - CMAKE_C_FLAGS - CMAKE_EXE_LINKER_FLAGS - CMAKE_SHARED_LINKER_FLAGS) + CMAKE_C_FLAGS) + if(NOT LINKER_IS_LLD_LINK) + append("-fprofile-generate=\"${LLVM_PROFILE_DATA_DIR}\"" + CMAKE_EXE_LINKER_FLAGS + CMAKE_SHARED_LINKER_FLAGS) + endif() elseif(uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSIR") - append("-fcs-profile-generate='${LLVM_CSPROFILE_DATA_DIR}'" + append("-fcs-profile-generate=\"${LLVM_CSPROFILE_DATA_DIR}\"" CMAKE_CXX_FLAGS - CMAKE_C_FLAGS - CMAKE_EXE_LINKER_FLAGS - CMAKE_SHARED_LINKER_FLAGS) + CMAKE_C_FLAGS) + if(NOT LINKER_IS_LLD_LINK) + append("-fcs-profile-generate=\"${LLVM_CSPROFILE_DATA_DIR}\"" + CMAKE_EXE_LINKER_FLAGS + CMAKE_SHARED_LINKER_FLAGS) + endif() else() - append("-fprofile-instr-generate='${LLVM_PROFILE_FILE_PATTERN}'" + append("-fprofile-instr-generate=\"${LLVM_PROFILE_FILE_PATTERN}\"" CMAKE_CXX_FLAGS - CMAKE_C_FLAGS - CMAKE_EXE_LINKER_FLAGS - CMAKE_SHARED_LINKER_FLAGS) + CMAKE_C_FLAGS) + if(NOT LINKER_IS_LLD_LINK) + append("-fprofile-instr-generate=\"${LLVM_PROFILE_FILE_PATTERN}\"" + CMAKE_EXE_LINKER_FLAGS + CMAKE_SHARED_LINKER_FLAGS) + endif() endif() endif() -# Need to pass -fprofile-instr-use to linker for context-sensitive PGO -# compilation. if(LLVM_PROFDATA_FILE AND EXISTS ${LLVM_PROFDATA_FILE}) - append("-fprofile-instr-use='${LLVM_PROFDATA_FILE}'" - CMAKE_EXE_LINKER_FLAGS - CMAKE_SHARED_LINKER_FLAGS) + if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) + append("-fprofile-instr-use=\"${LLVM_PROFDATA_FILE}\"" + CMAKE_CXX_FLAGS + CMAKE_C_FLAGS) + if(NOT LINKER_IS_LLD_LINK) + append("-fprofile-instr-use=\"${LLVM_PROFDATA_FILE}\"" + CMAKE_EXE_LINKER_FLAGS + CMAKE_SHARED_LINKER_FLAGS) + endif() + else() + message(FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang") + endif() endif() option(LLVM_BUILD_INSTRUMENTED_COVERAGE "Build LLVM and tools with Code Coverage instrumentation" Off)