[Linux/x86] Fix tests in case of 4-byte alignment for 64-bit types (#17829)
[platform/upstream/coreclr.git] / compileoptions.cmake
1 if (CLR_CMAKE_PLATFORM_UNIX)
2   # Disable frame pointer optimizations so profilers can get better call stacks
3   add_compile_options(-fno-omit-frame-pointer)
4
5   # The -fms-extensions enable the stuff like __if_exists, __declspec(uuid()), etc.
6   add_compile_options(-fms-extensions )
7   #-fms-compatibility      Enable full Microsoft Visual C++ compatibility
8   #-fms-extensions         Accept some non-standard constructs supported by the Microsoft compiler
9
10   # Make signed arithmetic overflow of addition, subtraction, and multiplication wrap around
11   # using twos-complement representation (this is normally undefined according to the C++ spec).
12   add_compile_options(-fwrapv)
13
14   if(CLR_CMAKE_PLATFORM_DARWIN)
15     # We cannot enable "stack-protector-strong" on OS X due to a bug in clang compiler (current version 7.0.2)
16     add_compile_options(-fstack-protector)
17   else()
18     add_compile_options(-fstack-protector-strong)
19   endif(CLR_CMAKE_PLATFORM_DARWIN)
20
21   add_definitions(-DDISABLE_CONTRACTS)
22   # The -ferror-limit is helpful during the porting, it makes sure the compiler doesn't stop
23   # after hitting just about 20 errors.
24   add_compile_options(-ferror-limit=4096)
25
26   if (CLR_CMAKE_WARNINGS_ARE_ERRORS)
27     # All warnings that are not explicitly disabled are reported as errors
28     add_compile_options(-Werror)
29   endif(CLR_CMAKE_WARNINGS_ARE_ERRORS)
30
31   # Disabled warnings
32   add_compile_options(-Wno-unused-private-field)
33   add_compile_options(-Wno-unused-variable)
34   # Explicit constructor calls are not supported by clang (this->ClassName::ClassName())
35   add_compile_options(-Wno-microsoft)
36   # This warning is caused by comparing 'this' to NULL
37   add_compile_options(-Wno-tautological-compare)
38   # There are constants of type BOOL used in a condition. But BOOL is defined as int
39   # and so the compiler thinks that there is a mistake.
40   add_compile_options(-Wno-constant-logical-operand)
41   # We use pshpack1/2/4/8.h and poppack.h headers to set and restore packing. However
42   # clang 6.0 complains when the packing change lifetime is not contained within 
43   # a header file.
44   add_compile_options(-Wno-pragma-pack)
45
46   add_compile_options(-Wno-unknown-warning-option)
47
48   #These seem to indicate real issues
49   add_compile_options(-Wno-invalid-offsetof)
50   # The following warning indicates that an attribute __attribute__((__ms_struct__)) was applied
51   # to a struct or a class that has virtual members or a base class. In that case, clang
52   # may not generate the same object layout as MSVC.
53   add_compile_options(-Wno-incompatible-ms-struct)
54
55   # Some architectures (e.g., ARM) assume char type is unsigned while CoreCLR assumes char is signed
56   # as x64 does. It has been causing issues in ARM (https://github.com/dotnet/coreclr/issues/4746)
57   add_compile_options(-fsigned-char)
58 endif(CLR_CMAKE_PLATFORM_UNIX)
59
60 if(CLR_CMAKE_PLATFORM_UNIX_ARM)
61    # Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang
62    # we have to set the triple by adding a compiler argument
63    add_compile_options(-mthumb)
64    add_compile_options(-mfpu=vfpv3)
65    if(ARM_SOFTFP)
66      add_definitions(-DARM_SOFTFP)
67      add_compile_options(-mfloat-abi=softfp)
68      if("$ENV{__HostDistroRid}" MATCHES "tizen.*")
69        add_compile_options(-target armv7l-tizen-linux-gnueabi)
70      else()
71      add_compile_options(-target armv7-linux-gnueabi)
72      endif()
73    else()
74      add_compile_options(-target armv7-linux-gnueabihf)
75    endif(ARM_SOFTFP)
76 endif(CLR_CMAKE_PLATFORM_UNIX_ARM)
77
78 if (WIN32)
79   # Compile options for targeting windows
80
81   # The following options are set by the razzle build
82   add_compile_options(/TP) # compile all files as C++
83   add_compile_options(/d2Zi+) # make optimized builds debugging easier
84   add_compile_options(/nologo) # Suppress Startup Banner
85   add_compile_options(/W3) # set warning level to 3
86   add_compile_options(/WX) # treat warnings as errors
87   add_compile_options(/Oi) # enable intrinsics
88   add_compile_options(/Oy-) # disable suppressing of the creation of frame pointers on the call stack for quicker function calls
89   add_compile_options(/U_MT) # undefine the predefined _MT macro
90   add_compile_options(/GF) # enable read-only string pooling
91   add_compile_options(/Gm-) # disable minimal rebuild
92   add_compile_options(/EHa) # enable C++ EH (w/ SEH exceptions)
93   add_compile_options(/Zp8) # pack structs on 8-byte boundary
94   add_compile_options(/Gy) # separate functions for linker
95   add_compile_options(/Zc:wchar_t-) # C++ language conformance: wchar_t is NOT the native type, but a typedef
96   add_compile_options(/Zc:forScope) # C++ language conformance: enforce Standard C++ for scoping rules
97   add_compile_options(/GR-) # disable C++ RTTI
98   add_compile_options(/FC) # use full pathnames in diagnostics
99   add_compile_options(/MP) # Build with Multiple Processes (number of processes equal to the number of processors)
100   add_compile_options(/GS) # Buffer Security Check
101   add_compile_options(/Zm200) # Specify Precompiled Header Memory Allocation Limit of 150MB
102   add_compile_options(/wd4960 /wd4961 /wd4603 /wd4627 /wd4838 /wd4456 /wd4457 /wd4458 /wd4459 /wd4091 /we4640)
103   add_compile_options(/Zi) # enable debugging information
104   add_compile_options(/ZH:SHA_256) # use SHA256 for generating hashes of compiler processed source files.
105   add_compile_options(/source-charset:utf-8) # Force MSVC to compile source as UTF-8.
106
107   if (CLR_CMAKE_PLATFORM_ARCH_I386)
108     add_compile_options(/Gz)
109   endif (CLR_CMAKE_PLATFORM_ARCH_I386)
110
111   add_compile_options($<$<OR:$<CONFIG:Release>,$<CONFIG:Relwithdebinfo>>:/GL>)
112   add_compile_options($<$<OR:$<OR:$<CONFIG:Release>,$<CONFIG:Relwithdebinfo>>,$<CONFIG:Checked>>:/O1>)
113
114   if (CLR_CMAKE_PLATFORM_ARCH_AMD64)
115   # The generator expression in the following command means that the /homeparams option is added only for debug builds
116   add_compile_options($<$<CONFIG:Debug>:/homeparams>) # Force parameters passed in registers to be written to the stack
117   endif (CLR_CMAKE_PLATFORM_ARCH_AMD64)
118
119   # enable control-flow-guard support for native components for non-Arm64 builds
120   add_compile_options(/guard:cf) 
121
122   # Statically linked CRT (libcmt[d].lib, libvcruntime[d].lib and libucrt[d].lib) by default. This is done to avoid  
123   # linking in VCRUNTIME140.DLL for a simplified xcopy experience by reducing the dependency on VC REDIST.  
124   #  
125   # For Release builds, we shall dynamically link into uCRT [ucrtbase.dll] (which is pushed down as a Windows Update on downlevel OS) but  
126   # wont do the same for debug/checked builds since ucrtbased.dll is not redistributable and Debug/Checked builds are not  
127   # production-time scenarios.  
128   add_compile_options($<$<OR:$<CONFIG:Release>,$<CONFIG:Relwithdebinfo>>:/MT>)  
129   add_compile_options($<$<OR:$<CONFIG:Debug>,$<CONFIG:Checked>>:/MTd>)  
130
131   set(CMAKE_ASM_MASM_FLAGS "${CMAKE_ASM_MASM_FLAGS} /ZH:SHA_256")
132   
133 endif (WIN32)
134
135 if(CLR_CMAKE_ENABLE_CODE_COVERAGE)
136
137   if(CLR_CMAKE_PLATFORM_UNIX)
138     string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE)
139     if(NOT UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG)
140       message( WARNING "Code coverage results with an optimised (non-Debug) build may be misleading" )
141     endif(NOT UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG)
142
143     add_compile_options(-fprofile-arcs)
144     add_compile_options(-ftest-coverage)
145     set(CLANG_COVERAGE_LINK_FLAGS  "--coverage")
146     set(CMAKE_SHARED_LINKER_FLAGS  "${CMAKE_SHARED_LINKER_FLAGS} ${CLANG_COVERAGE_LINK_FLAGS}")
147     set(CMAKE_EXE_LINKER_FLAGS     "${CMAKE_EXE_LINKER_FLAGS} ${CLANG_COVERAGE_LINK_FLAGS}")
148   else()
149     message(FATAL_ERROR "Code coverage builds not supported on current platform")
150   endif(CLR_CMAKE_PLATFORM_UNIX)
151
152 endif(CLR_CMAKE_ENABLE_CODE_COVERAGE)