[Tizen] fix for dotnet specific arguments in corerun
[platform/upstream/dotnet/runtime.git] / src / coreclr / pgosupport.cmake
1 include(CheckCXXSourceCompiles)
2 include(CheckCXXCompilerFlag)
3
4 # VC++ guarantees support for LTCG (LTO's equivalent)
5 if(NOT WIN32)
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)
12   check_have_lto()
13
14   check_cxx_compiler_flag(-faligned-new COMPILER_SUPPORTS_F_ALIGNED_NEW)
15 endif(NOT WIN32)
16
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")
27                 if(NOT LD_LLVM)
28                     set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=gold")
29                 endif()
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)
38
39         file(TO_NATIVE_PATH
40             "${CLR_CMAKE_OPTDATA_PATH}/data/${ProfileFileName}"
41             ProfilePath
42         )
43
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))
58                         if(HAVE_LTO)
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}")
61                             if(NOT LD_LLVM)
62                                 set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=gold")
63                             endif()
64                         else(HAVE_LTO)
65                             message(WARNING "LTO is not supported, skipping profile guided optimizations")
66                         endif(HAVE_LTO)
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)
74 endfunction(add_pgo)