1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | // See the LICENSE file in the project root for more information. |
4 | // |
5 | // switches.h switch configuration of common runtime features |
6 | // |
7 | |
8 | |
9 | #ifndef CROSSGEN_COMPILE |
10 | #define STRESS_HEAP |
11 | #endif |
12 | |
13 | |
14 | #define VERIFY_HEAP |
15 | |
16 | #define GC_CONFIG_DRIVEN |
17 | |
18 | // define this to test data safety for the DAC. See code:DataTest::TestDataSafety. |
19 | #define TEST_DATA_CONSISTENCY |
20 | |
21 | #if !defined(STRESS_LOG) && !defined(FEATURE_UTILCODE_NO_DEPENDENCIES) |
22 | #define STRESS_LOG |
23 | #endif |
24 | |
25 | #if defined(_DEBUG) && !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) |
26 | #define USE_CHECKED_OBJECTREFS |
27 | #endif |
28 | |
29 | #define FAT_DISPATCH_TOKENS |
30 | |
31 | #define FEATURE_SHARE_GENERIC_CODE |
32 | |
33 | #if defined(_DEBUG) && !defined(DACCESS_COMPILE) |
34 | #define LOGGING |
35 | #endif |
36 | |
37 | #if !defined(_TARGET_X86_) || defined(FEATURE_PAL) |
38 | #define WIN64EXCEPTIONS |
39 | #endif |
40 | |
41 | #if !defined(FEATURE_UTILCODE_NO_DEPENDENCIES) |
42 | // Failpoint support |
43 | #if defined(_DEBUG) && !defined(DACCESS_COMPILE) && !defined(FEATURE_PAL) |
44 | #define FAILPOINTS_ENABLED |
45 | #endif |
46 | #endif //!defined(FEATURE_UTILCODE_NO_DEPENDENCIES) |
47 | |
48 | #if 0 |
49 | #define APPDOMAIN_STATE |
50 | #define BREAK_ON_UNLOAD |
51 | #define AD_LOG_MEMORY |
52 | #define AD_NO_UNLOAD |
53 | #define AD_SNAPSHOT |
54 | #define BREAK_META_ACCESS |
55 | #define AD_BREAK_ON_CANNOT_UNLOAD |
56 | #define BREAK_ON_CLSLOAD |
57 | |
58 | // Enable to track details of EESuspension |
59 | #define TIME_SUSPEND |
60 | #endif // 0 |
61 | |
62 | #ifndef DACCESS_COMPILE |
63 | // Enabled to track GC statistics |
64 | #define GC_STATS |
65 | #endif |
66 | |
67 | #if defined(_TARGET_X86_) || defined(_TARGET_ARM_) |
68 | #define USE_UPPER_ADDRESS 0 |
69 | |
70 | #elif defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_) |
71 | #define UPPER_ADDRESS_MAPPING_FACTOR 2 |
72 | #define CLR_UPPER_ADDRESS_MIN 0x64400000000 |
73 | #define CODEHEAP_START_ADDRESS 0x64480000000 |
74 | #define CLR_UPPER_ADDRESS_MAX 0x644FC000000 |
75 | |
76 | #if !defined(FEATURE_PAL) |
77 | #define USE_UPPER_ADDRESS 1 |
78 | #else |
79 | #define USE_UPPER_ADDRESS 0 |
80 | #endif // !FEATURE_PAL |
81 | |
82 | #else |
83 | #error Please add a new #elif clause and define all portability macros for the new platform |
84 | #endif |
85 | |
86 | #if defined(_WIN64) |
87 | #define JIT_IS_ALIGNED |
88 | #endif |
89 | |
90 | // ALLOW_SXS_JIT enables AltJit support for JIT-ing, via COMPlus_AltJit / COMPlus_AltJitName. |
91 | // ALLOW_SXS_JIT_NGEN enables AltJit support for NGEN, via COMPlus_AltJitNgen / COMPlus_AltJitName. |
92 | // Note that if ALLOW_SXS_JIT_NGEN is defined, then ALLOW_SXS_JIT must be defined. |
93 | #define ALLOW_SXS_JIT |
94 | #define ALLOW_SXS_JIT_NGEN |
95 | |
96 | //master switch for gc suspension not based on hijacking |
97 | #define FEATURE_ENABLE_GCPOLL |
98 | |
99 | #if defined(_TARGET_X86_) |
100 | //this enables a fast version of the GC Poll helper instead of the default portable one. |
101 | #define ENABLE_FAST_GCPOLL_HELPER |
102 | #endif // defined(FEATURE_ENABLE_GCPOLL) && defined(_TARGET_X86_) |
103 | |
104 | #if !defined(FEATURE_PAL) |
105 | // PLATFORM_SUPPORTS_THREADSUSPEND is defined for platforms where it is safe to call |
106 | // SuspendThread. This API is dangerous on non-Windows platforms, as it can lead to |
107 | // deadlocks, due to low level OS resources that the PAL is not aware of, or due to |
108 | // the fact that PAL-unaware code in the process may hold onto some OS resources. |
109 | #define PLATFORM_SUPPORTS_SAFE_THREADSUSPEND |
110 | #endif // !FEATURE_PAL |
111 | |
112 | |
113 | #if defined(STRESS_HEAP) && defined(_DEBUG) && defined(FEATURE_HIJACK) |
114 | #define HAVE_GCCOVER |
115 | #endif |
116 | |
117 | // Some platforms may see spurious AVs when GcCoverage is enabled because of races. |
118 | // Enable further processing to see if they recur. |
119 | #if defined(HAVE_GCCOVER) && (defined(_TARGET_X86_) || defined(_TARGET_AMD64_)) && !defined(FEATURE_PAL) |
120 | #define GCCOVER_TOLERATE_SPURIOUS_AV |
121 | #endif |
122 | |
123 | //Turns on a startup delay to allow simulation of slower and faster startup times. |
124 | #define ENABLE_STARTUP_DELAY |
125 | |
126 | |
127 | #ifdef _DEBUG |
128 | |
129 | //hurray DAC makes everything more fun - you can't have defines that control whether |
130 | //or not data members are visible which differ between DAC and non-DAC builds. |
131 | //All of the _DATA defines match DAC and non-DAC, the other defines here are off in the DAC. |
132 | #if defined(PROFILING_SUPPORTED_DATA) || defined(PROFILING_SUPPORTED) |
133 | // See code:ProfControlBlock#TestOnlyELT. |
134 | #define PROF_TEST_ONLY_FORCE_ELT_DATA |
135 | // See code:ProfControlBlock#TestOnlyObjectAllocated. |
136 | #define PROF_TEST_ONLY_FORCE_OBJECT_ALLOCATED_DATA |
137 | #endif // PROFILING_SUPPORTED_DATA || PROFILING_SUPPORTED |
138 | |
139 | #if defined(PROFILING_SUPPORTED) |
140 | // See code:ProfControlBlock#TestOnlyELT. |
141 | #define PROF_TEST_ONLY_FORCE_ELT |
142 | // See code:ProfControlBlock#TestOnlyObjectAllocated. |
143 | #define PROF_TEST_ONLY_FORCE_OBJECT_ALLOCATED |
144 | #endif // PROFILING_SUPPORTED |
145 | |
146 | #endif // _DEBUG |
147 | |
148 | // MUST NEVER CHECK IN WITH THIS ENABLED. |
149 | // This is just for convenience in doing performance investigations in a checked-out enlistment. |
150 | // #define FEATURE_ENABLE_NO_RANGE_CHECKS |
151 | |
152 | // This controls whether a compilation-timing feature that relies on Windows APIs, if available, else direct |
153 | // hardware instructions (rdtsc), for accessing high-resolution hardware timers is enabled. This is disabled |
154 | // in Silverlight (just to avoid thinking about whether the extra code space is worthwhile). |
155 | #define FEATURE_JIT_TIMER |
156 | |
157 | // This feature in RyuJIT supersedes the FEATURE_JIT_TIMER. In addition to supporting the time log file, this |
158 | // feature also supports using COMPlus_JitTimeLogCsv=a.csv, which will dump method-level and phase-level timing |
159 | // statistics. Also see comments on FEATURE_JIT_TIMER. |
160 | #define FEATURE_JIT_METHOD_PERF |
161 | |
162 | |
163 | #ifndef FEATURE_USE_ASM_GC_WRITE_BARRIERS |
164 | // If we're not using assembly write barriers, then this turns on a performance measurement |
165 | // mode that gathers and prints statistics about # of GC write barriers invokes. |
166 | // #define FEATURE_COUNT_GC_WRITE_BARRIERS |
167 | #endif |
168 | |
169 | // Enables a mode in which GC is completely conservative in stacks and registers: all stack slots and registers |
170 | // are treated as potential pinned interior pointers. When enabled, the runtime flag COMPLUS_GCCONSERVATIVE |
171 | // determines dynamically whether GC is conservative. Note that appdomain unload, LCG and unloadable assemblies |
172 | // do not work reliably with conservative GC. |
173 | #define FEATURE_CONSERVATIVE_GC 1 |
174 | |
175 | #if (defined(_TARGET_ARM_) && !defined(ARM_SOFTFP)) || defined(_TARGET_ARM64_) |
176 | #define FEATURE_HFA |
177 | #endif |
178 | |
179 | // ARM requires that 64-bit primitive types are aligned at 64-bit boundaries for interlocked-like operations. |
180 | // Additionally the platform ABI requires these types and composite type containing them to be similarly |
181 | // aligned when passed as arguments. |
182 | #ifdef _TARGET_ARM_ |
183 | #define FEATURE_64BIT_ALIGNMENT |
184 | #endif |
185 | |
186 | // Prefer double alignment for structs and arrays with doubles. Put arrays of doubles more agressively |
187 | // into large object heap for performance because large object heap is 8 byte aligned |
188 | #if !defined(FEATURE_64BIT_ALIGNMENT) && !defined(_WIN64) |
189 | #define FEATURE_DOUBLE_ALIGNMENT_HINT |
190 | #endif |
191 | |
192 | #if defined(FEATURE_CORESYSTEM) |
193 | #define FEATURE_MINIMETADATA_IN_TRIAGEDUMPS |
194 | #endif // defined(FEATURE_CORESYSTEM) |
195 | |
196 | // If defined, support interpretation. |
197 | #if !defined(CROSSGEN_COMPILE) |
198 | |
199 | #if !defined(FEATURE_PAL) |
200 | #define FEATURE_STACK_SAMPLING |
201 | #endif // defined (ALLOW_SXS_JIT) |
202 | |
203 | #endif // !defined(CROSSGEN_COMPILE) |
204 | |
205 | #if defined(FEATURE_INTERPRETER) && defined(CROSSGEN_COMPILE) |
206 | #undef FEATURE_INTERPRETER |
207 | #endif |
208 | |