diff options
Diffstat (limited to 'src/inc/switches.h')
-rw-r--r-- | src/inc/switches.h | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/src/inc/switches.h b/src/inc/switches.h new file mode 100644 index 0000000000..f52f24bc67 --- /dev/null +++ b/src/inc/switches.h @@ -0,0 +1,268 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +// +// switches.h switch configuration of common runtime features +// + + +#ifndef CROSSGEN_COMPILE +#define STRESS_HEAP +#endif + +#if !defined(CROSSGEN_COMPILE) && !defined(FEATURE_CORECLR) +#define STRESS_THREAD +#endif + +#define VERIFY_HEAP + +#define GC_CONFIG_DRIVEN + +// define this to test data safety for the DAC. See code:DataTest::TestDataSafety. +#define TEST_DATA_CONSISTENCY + +#if !defined(STRESS_LOG) && !defined(FEATURE_UTILCODE_NO_DEPENDENCIES) +#define STRESS_LOG +#endif + +#if defined(_DEBUG) && !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) +#define USE_CHECKED_OBJECTREFS +#endif + +#define FAT_DISPATCH_TOKENS + +#define FEATURE_SHARE_GENERIC_CODE + +#if defined(_DEBUG) && !defined(DACCESS_COMPILE) + #define LOGGING +#endif + +#if !defined(_TARGET_X86_) +#define WIN64EXCEPTIONS +#endif + +#if !defined(FEATURE_UTILCODE_NO_DEPENDENCIES) +// Failpoint support +#if defined(_DEBUG) && !defined(DACCESS_COMPILE) && !defined(FEATURE_PAL) +#define FAILPOINTS_ENABLED +#endif +#endif //!defined(FEATURE_UTILCODE_NO_DEPENDENCIES) + +#if 0 + #define APPDOMAIN_STATE + #define BREAK_ON_UNLOAD + #define AD_LOG_MEMORY + #define AD_NO_UNLOAD + #define AD_SNAPSHOT + #define BREAK_META_ACCESS + #define AD_BREAK_ON_CANNOT_UNLOAD + #define BREAK_ON_CLSLOAD + + // Enable to track details of EESuspension + #define TIME_SUSPEND +#endif // 0 + +#ifndef DACCESS_COMPILE +// Enabled to track GC statistics +#define GC_STATS +#endif + +#if !defined(FEATURE_CORECLR) +#define EMIT_FIXUPS +#endif + +#if defined(_DEBUG) && !defined(DACCESS_COMPILE) && (defined(_TARGET_X86_) || defined(_TARGET_AMD64_)) +// On x86/x64 Windows debug builds, respect the COMPlus_EnforceEEThreadNotRequiredContracts +// runtime switch. See code:InitThreadManager and code:GetThreadGenericFullCheck +#define ENABLE_GET_THREAD_GENERIC_FULL_CHECK +#endif + +#if defined(_TARGET_X86_) || defined(_TARGET_ARM_) + #define PAGE_SIZE 0x1000 + #define USE_UPPER_ADDRESS 0 + +#elif defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_) + #define PAGE_SIZE 0x1000 + #define UPPER_ADDRESS_MAPPING_FACTOR 2 + #define CLR_UPPER_ADDRESS_MIN 0x64400000000 + #define CODEHEAP_START_ADDRESS 0x64480000000 + #define CLR_UPPER_ADDRESS_MAX 0x644FC000000 + +#if !defined(FEATURE_PAL) + #define USE_UPPER_ADDRESS 1 +#else + #define USE_UPPER_ADDRESS 0 +#endif // !FEATURE_PAL + +#else + #error Please add a new #elif clause and define all portability macros for the new platform +#endif + +#ifndef OS_PAGE_SIZE +#define OS_PAGE_SIZE PAGE_SIZE +#endif + +#if defined(_WIN64) +#define JIT_IS_ALIGNED +#endif + +// ALLOW_SXS_JIT enables AltJit support for JIT-ing, via COMPlus_AltJit / COMPlus_AltJitName. +// ALLOW_SXS_JIT_NGEN enables AltJit support for NGEN, via COMPlus_AltJitNgen / COMPlus_AltJitName. +// Note that if ALLOW_SXS_JIT_NGEN is defined, then ALLOW_SXS_JIT must be defined. +#define ALLOW_SXS_JIT +#if defined(ALLOW_SXS_JIT) +#define ALLOW_SXS_JIT_NGEN +#endif // ALLOW_SXS_JIT + +#if defined(FEATURE_CORECLR) +//master switch for gc suspension not based on hijacking +#define FEATURE_ENABLE_GCPOLL +#endif //FEATURE_CORECLR + +#if defined(FEATURE_ENABLE_GCPOLL) && defined(_TARGET_X86_) +//this enables a fast version of the GC Poll helper instead of the default portable one. +#define ENABLE_FAST_GCPOLL_HELPER +#endif // defined(FEATURE_ENABLE_GCPOLL) && defined(_TARGET_X86_) + +#if !defined(FEATURE_PAL) +// PLATFORM_SUPPORTS_THREADSUSPEND is defined for platforms where it is safe to call +// SuspendThread. This API is dangerous on non-Windows platforms, as it can lead to +// deadlocks, due to low level OS resources that the PAL is not aware of, or due to +// the fact that PAL-unaware code in the process may hold onto some OS resources. +#define PLATFORM_SUPPORTS_SAFE_THREADSUSPEND +#endif // !FEATURE_PAL + +#if !defined(PLATFORM_SUPPORTS_SAFE_THREADSUSPEND) && !defined(FEATURE_ENABLE_GCPOLL) +#error "Platform must support either safe thread suspension or GC polling" +#endif + +#if defined(STRESS_HEAP) && defined(_DEBUG) && defined(FEATURE_HIJACK) +#define HAVE_GCCOVER +#endif + +#ifdef FEATURE_CORECLR +//Turns on a startup delay to allow simulation of slower and faster startup times. +#define ENABLE_STARTUP_DELAY +#endif + + +#ifndef ALLOW_LOCAL_WORKER +#define ALLOW_LOCAL_WORKER +#endif + + +#ifdef _DEBUG + +//hurray DAC makes everything more fun - you can't have defines that control whether +//or not data members are visible which differ between DAC and non-DAC builds. +//All of the _DATA defines match DAC and non-DAC, the other defines here are off in the DAC. +#if defined(PROFILING_SUPPORTED_DATA) || defined(PROFILING_SUPPORTED) +// See code:ProfControlBlock#TestOnlyELT. +#define PROF_TEST_ONLY_FORCE_ELT_DATA +// See code:ProfControlBlock#TestOnlyObjectAllocated. +#define PROF_TEST_ONLY_FORCE_OBJECT_ALLOCATED_DATA +#endif // PROFILING_SUPPORTED_DATA || PROFILING_SUPPORTED + +#if defined(PROFILING_SUPPORTED) +// See code:ProfControlBlock#TestOnlyELT. +#define PROF_TEST_ONLY_FORCE_ELT +// See code:ProfControlBlock#TestOnlyObjectAllocated. +#define PROF_TEST_ONLY_FORCE_OBJECT_ALLOCATED +#endif // PROFILING_SUPPORTED + +#endif // _DEBUG + + + +#if defined(PROFILING_SUPPORTED) +// On desktop CLR builds, the profiling API uses the event log for end-user-friendly +// diagnostic messages. CoreCLR on Windows ouputs debug strings for diagnostic messages. +// Rotor builds have no access to event log message resources, though, so they simply +// display popup dialogs for now. +#define FEATURE_PROFAPI_EVENT_LOGGING +#endif // defined(PROFILING_SUPPORTED) + +// Windows desktop supports the profiling API attach / detach feature. +// This will eventually be supported on coreclr as well. +#if defined(PROFILING_SUPPORTED) && !defined(FEATURE_CORECLR) +#define FEATURE_PROFAPI_ATTACH_DETACH +#endif + +// Windows desktop DAC builds need to see some of the data used in the profiling API +// attach / detach feature, particularly Thread::m_dwProfilerEvacuationCounter +#if defined(PROFILING_SUPPORTED_DATA) && !defined(FEATURE_CORECLR) +#define DATA_PROFAPI_ATTACH_DETACH +#endif + +// MUST NEVER CHECK IN WITH THIS ENABLED. +// This is just for convenience in doing performance investigations in a checked-out enlistment. +// #define FEATURE_ENABLE_NO_RANGE_CHECKS + +#ifndef FEATURE_CORECLR +// This controls whether a compilation-timing feature that relies on Windows APIs, if available, else direct +// hardware instructions (rdtsc), for accessing high-resolution hardware timers is enabled. This is disabled +// in Silverlight (just to avoid thinking about whether the extra code space is worthwhile). +#define FEATURE_JIT_TIMER +#endif // FEATURE_CORECLR + +// This feature in RyuJIT supersedes the FEATURE_JIT_TIMER. In addition to supporting the time log file, this +// feature also supports using COMPlus_JitTimeLogCsv=a.csv, which will dump method-level and phase-level timing +// statistics. Also see comments on FEATURE_JIT_TIMER. +#define FEATURE_JIT_METHOD_PERF + + +#ifndef FEATURE_USE_ASM_GC_WRITE_BARRIERS +// If we're not using assembly write barriers, then this turns on a performance measurement +// mode that gathers and prints statistics about # of GC write barriers invokes. +// #define FEATURE_COUNT_GC_WRITE_BARRIERS +#endif + +// Enables a mode in which GC is completely conservative in stacks and registers: all stack slots and registers +// are treated as potential pinned interior pointers. When enabled, the runtime flag COMPLUS_GCCONSERVATIVE +// determines dynamically whether GC is conservative. Note that appdomain unload, LCG and unloadable assemblies +// do not work reliably with conservative GC. +#ifdef FEATURE_CORECLR +#define FEATURE_CONSERVATIVE_GC 1 +#endif + +#if (defined(_TARGET_ARM_) && !defined(ARM_SOFTFP)) || defined(_TARGET_ARM64_) +#define FEATURE_HFA +#endif + +// ARM requires that 64-bit primitive types are aligned at 64-bit boundaries for interlocked-like operations. +// Additionally the platform ABI requires these types and composite type containing them to be similarly +// aligned when passed as arguments. +#ifdef _TARGET_ARM_ +#define FEATURE_64BIT_ALIGNMENT +#endif + +// Prefer double alignment for structs and arrays with doubles. Put arrays of doubles more agressively +// into large object heap for performance because large object heap is 8 byte aligned +#if !defined(FEATURE_64BIT_ALIGNMENT) && !defined(_WIN64) +#define FEATURE_DOUBLE_ALIGNMENT_HINT +#endif + +#if defined(FEATURE_CORESYSTEM) +#define FEATURE_MINIMETADATA_IN_TRIAGEDUMPS +#endif // defined(FEATURE_CORESYSTEM) + +#if defined(FEATURE_PREJIT) && defined(FEATURE_CORECLR) && defined(FEATURE_CORESYSTEM) +// Desktop CLR allows profilers and debuggers to opt out of loading NGENd images, and to +// JIT everything instead. "FEATURE_TREAT_NI_AS_MSIL_DURING_DIAGNOSTICS" is roughly the +// equivalent for Apollo, where MSIL images may not be available at all. +// FEATURE_TREAT_NI_AS_MSIL_DURING_DIAGNOSTICS allows profilers or debuggers to state +// they don't want to use pregenerated code, and to instead load the NGENd image but +// treat it as if it were MSIL by ignoring the prejitted code and prebaked structures, +// and instead to JIT and load types at run-time. +#define FEATURE_TREAT_NI_AS_MSIL_DURING_DIAGNOSTICS +#endif + +// If defined, support interpretation. +#if !defined(CROSSGEN_COMPILE) + +#if defined(ALLOW_SXS_JIT) && !defined(FEATURE_PAL) +#define FEATURE_STACK_SAMPLING +#endif // defined (ALLOW_SXS_JIT) + +#endif // !defined(CROSSGEN_COMPILE) + |