1 include(CheckCXXSourceCompiles)
2 include(CheckCXXCompilerFlag)
4 # VC++ guarantees support for LTCG (LTO's equivalent)
6 # Function required to give CMAKE_REQUIRED_* local scope
7 function(check_have_lto)
8 set(CMAKE_REQUIRED_FLAGS -flto)
9 set(CMAKE_REQUIRED_LIBRARIES -flto -fuse-ld=gold)
10 check_cxx_source_compiles("int main() { return 0; }" HAVE_LTO)
11 endfunction(check_have_lto)
14 check_cxx_compiler_flag(-faligned-new COMPILER_SUPPORTS_F_ALIGNED_NEW)
17 # Adds Profile Guided Optimization (PGO) flags to the current target
18 function(add_pgo TargetName)
19 if(CLR_CMAKE_PGO_INSTRUMENT)
20 if(CLR_CMAKE_HOST_WIN32)
21 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS_RELEASE " /LTCG /GENPROFILE")
22 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO " /LTCG /GENPROFILE")
23 else(CLR_CMAKE_HOST_WIN32)
24 if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO)
25 target_compile_options(${TargetName} PRIVATE -flto -fprofile-instr-generate)
26 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fprofile-instr-generate")
28 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=gold")
30 endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO)
31 endif(CLR_CMAKE_HOST_WIN32)
32 elseif(CLR_CMAKE_PGO_OPTIMIZE)
33 if(CLR_CMAKE_HOST_WIN32)
34 set(ProfileFileName "${TargetName}.pgd")
35 else(CLR_CMAKE_HOST_WIN32)
36 set(ProfileFileName "coreclr.profdata")
37 endif(CLR_CMAKE_HOST_WIN32)
40 "${CLR_CMAKE_OPTDATA_PATH}/data/${ProfileFileName}"
44 # If we don't have profile data availble, gracefully fall back to a non-PGO opt build
45 if(NOT EXISTS ${ProfilePath})
46 message("PGO data file NOT found: ${ProfilePath}")
47 elseif(CMAKE_GENERATOR MATCHES "Visual Studio")
48 # MSVC is sensitive to exactly the options passed during PGO optimization and Ninja and
49 # MSBuild differ slightly (but not meaningfully for runtime behavior)
50 message("Cannot use PGO optimization built with Ninja from MSBuild. Re-run build with Ninja to apply PGO information")
51 else(NOT EXISTS ${ProfilePath})
52 if(CLR_CMAKE_HOST_WIN32)
53 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS_RELEASE " /LTCG /USEPROFILE:PGD=\"${ProfilePath}\"")
54 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO " /LTCG /USEPROFILE:PGD=\"${ProfilePath}\"")
55 else(CLR_CMAKE_HOST_WIN32)
56 if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO)
57 if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6))
59 target_compile_options(${TargetName} PRIVATE -flto -fprofile-instr-use=${ProfilePath} -Wno-profile-instr-out-of-date -Wno-profile-instr-unprofiled)
60 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fprofile-instr-use=${ProfilePath}")
62 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=gold")
65 message(WARNING "LTO is not supported, skipping profile guided optimizations")
67 else((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6))
68 message(WARNING "PGO is not supported; Clang 3.6 or later is required for profile guided optimizations")
69 endif((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6))
70 endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO)
71 endif(CLR_CMAKE_HOST_WIN32)
72 endif(NOT EXISTS ${ProfilePath})
73 endif(CLR_CMAKE_PGO_INSTRUMENT)