diff options
Diffstat (limited to 'src/jit/compiler.cpp')
-rw-r--r-- | src/jit/compiler.cpp | 311 |
1 files changed, 100 insertions, 211 deletions
diff --git a/src/jit/compiler.cpp b/src/jit/compiler.cpp index 8146f3aa2b..9eebae880d 100644 --- a/src/jit/compiler.cpp +++ b/src/jit/compiler.cpp @@ -59,6 +59,7 @@ LONG Compiler::jitNestingLevel = 0; #ifdef ALT_JIT // static +bool Compiler::s_pAltJitExcludeAssembliesListInitialized = false; AssemblyNamesList2* Compiler::s_pAltJitExcludeAssembliesList = nullptr; #endif // ALT_JIT @@ -744,8 +745,7 @@ void Compiler::compShutdown() #if defined(DEBUG) || MEASURE_INLINING #ifdef DEBUG - static ConfigDWORD fJitInlinePrintStats; - if ((unsigned)fJitInlinePrintStats.val(CLRConfig::INTERNAL_JitInlinePrintStats) == 1) + if ((unsigned)JitConfig.JitInlinePrintStats() == 1) #endif // DEBUG { fprintf(fout, "\n"); @@ -1009,8 +1009,7 @@ void Compiler::compShutdown() #if LOOP_HOIST_STATS #ifdef DEBUG // Always display loop stats in retail - static ConfigDWORD fDisplayLoopHoistStats; - if (fDisplayLoopHoistStats.val(CLRConfig::INTERNAL_JitLoopHoistStats) != 0) + if (JitConfig.DisplayLoopHoistStats() != 0) #endif // DEBUG { PrintAggregateLoopHoistStats(stdout); @@ -1511,8 +1510,7 @@ static bool DidComponentUnitTests = false; void Compiler::compDoComponentUnitTestsOnce() { - static ConfigDWORD fRunComponentUnitTests; - if (!fRunComponentUnitTests.val(CLRConfig::INTERNAL_JitComponentUnitTests)) + if (!JitConfig.RunComponentUnitTests()) return; if (!DidComponentUnitTests) @@ -1838,8 +1836,7 @@ void Compiler::compSetProcessor() if (((compileFlags & CORJIT_FLG_PREJIT) == 0) && ((compileFlags & CORJIT_FLG_USE_AVX2) != 0)) { - static ConfigDWORD fEnableAVX; - if (fEnableAVX.val(CLRConfig::EXTERNAL_EnableAVX) != 0) + if (JitConfig.EnableAVX() != 0) { opts.compCanUseAVX = true; if (!compIsForInlining()) @@ -1870,11 +1867,9 @@ void Compiler::compSetProcessor() SSE2_FORCE_INVALID = -1 }; - static ConfigDWORD fJitCanUseSSE2; - - if (fJitCanUseSSE2.val_DontUse_(CLRConfig::INTERNAL_JitCanUseSSE2, (unsigned) SSE2_FORCE_INVALID) == SSE2_FORCE_DISABLE) + if (JitConfig.JitCanUseSSE2() == SSE2_FORCE_DISABLE) opts.compCanUseSSE2 = false; - else if (fJitCanUseSSE2.val_DontUse_(CLRConfig::INTERNAL_JitCanUseSSE2, (unsigned) SSE2_FORCE_INVALID) == SSE2_FORCE_USE) + else if (JitConfig.JitCanUseSSE2() == SSE2_FORCE_USE) opts.compCanUseSSE2 = true; else if (opts.compCanUseSSE2) opts.compCanUseSSE2 = !compStressCompile(STRESS_GENERIC_VARN, 50); @@ -1923,8 +1918,8 @@ bool Compiler::compShouldThrowOnNoway( return !opts.MinOpts() || !compIsFullTrust(); } -// ConfigDWORD does not offer an option for decimal flags. Any numbers are interpreted as hex. -// I could add the decimal option to ConfigDWORD or I could write a function to reinterpret this +// ConfigInteger does not offer an option for decimal flags. Any numbers are interpreted as hex. +// I could add the decimal option to ConfigInteger or I could write a function to reinterpret this // value as the user intended. unsigned ReinterpretHexAsDecimal(unsigned in) { @@ -2043,20 +2038,14 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) #ifdef DEBUG - ConfigMethodSet* pfAltJit; + const JitConfigValues::MethodSet* pfAltJit; if (opts.eeFlags & CORJIT_FLG_PREJIT) { - static ConfigMethodSet fAltJitNgen; - fAltJitNgen.ensureInit(CLRConfig::INTERNAL_AltJitNgen); - - pfAltJit = &fAltJitNgen; + pfAltJit = &JitConfig.AltJitNgen(); } else { - static ConfigMethodSet fAltJit; - fAltJit.ensureInit(CLRConfig::EXTERNAL_AltJit); - - pfAltJit = &fAltJit; + pfAltJit = &JitConfig.AltJit(); } #ifdef ALT_JIT @@ -2065,8 +2054,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) opts.altJit = true; } - static ConfigDWORD fAltJitLimit; - unsigned altJitLimit = ReinterpretHexAsDecimal(fAltJitLimit.val(CLRConfig::INTERNAL_AltJitLimit)); + unsigned altJitLimit = ReinterpretHexAsDecimal(JitConfig.AltJitLimit()); if (altJitLimit > 0 && Compiler::jitTotalMethodCompiled >= altJitLimit) { opts.altJit = false; @@ -2075,16 +2063,14 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) #else // !DEBUG - LPWSTR altJitVal; + const char* altJitVal; if (opts.eeFlags & CORJIT_FLG_PREJIT) { - static ConfigString fAltJitNgen; - altJitVal = fAltJitNgen.val(CLRConfig::INTERNAL_AltJitNgen); + altJitVal = JitConfig.AltJitNgen().list(); } else { - static ConfigString fAltJit; - altJitVal = fAltJit.val(CLRConfig::EXTERNAL_AltJit); + altJitVal = JitConfig.AltJit().list(); } #ifdef ALT_JIT @@ -2092,7 +2078,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) // You don't get to give a regular expression of methods to match. // (Partially, this is because we haven't computed and stored the method and class name except in debug, and it // might be expensive to do so.) - if ((altJitVal != NULL) && (wcscmp(altJitVal, W("*")) == 0)) + if ((altJitVal != nullptr) && (strcmp(altJitVal, "*") == 0)) { opts.altJit = true; } @@ -2105,16 +2091,16 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) if (opts.altJit) { // First, initialize the AltJitExcludeAssemblies list, but only do it once. - static ConfigString fAltJitExcludeAssemblies; - if (!fAltJitExcludeAssemblies.isInitialized()) + if (!s_pAltJitExcludeAssembliesListInitialized) { - LPWSTR wszAltJitExcludeAssemblyList = fAltJitExcludeAssemblies.val(CLRConfig::EXTERNAL_AltJitExcludeAssemblies); + const wchar_t* wszAltJitExcludeAssemblyList = JitConfig.AltJitExcludeAssemblies(); if (wszAltJitExcludeAssemblyList != nullptr) { // NOTE: The Assembly name list is allocated in the process heap, not in the no-release heap, which is reclaimed // for every compilation. This is ok because we only allocate once, due to the static. s_pAltJitExcludeAssembliesList = new (HostAllocator::getHostAllocator()) AssemblyNamesList2(wszAltJitExcludeAssemblyList, HostAllocator::getHostAllocator()); } + s_pAltJitExcludeAssembliesListInitialized = true; } if (s_pAltJitExcludeAssembliesList != nullptr) @@ -2142,9 +2128,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) // if (compIsForImportOnly() && (!altJitConfig || opts.altJit)) { - static ConfigMethodSet fJitImportBreak; - fJitImportBreak.ensureInit(CLRConfig::INTERNAL_JitImportBreak); - if (fJitImportBreak.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitImportBreak().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) assert(!"JitImportBreak reached"); } @@ -2176,63 +2160,41 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) if (opts.eeFlags & CORJIT_FLG_PREJIT) { - static ConfigMethodSet fNgenDump; - fNgenDump.ensureInit(CLRConfig::INTERNAL_NgenDump); - - if (fNgenDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.NgenDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) verboseDump = true; - static ConfigDWORD fNgenHashDump; - unsigned ngenHashDumpVal = (unsigned) fNgenHashDump.val(CLRConfig::INTERNAL_NgenHashDump); + unsigned ngenHashDumpVal = (unsigned) JitConfig.NgenHashDump(); if ((ngenHashDumpVal != (DWORD)-1) && (ngenHashDumpVal == info.compMethodHash())) verboseDump = true; - static ConfigMethodSet fNgenDumpIR; - fNgenDumpIR.ensureInit(CLRConfig::INTERNAL_NgenDumpIR); - - if (fNgenDumpIR.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.NgenDumpIR().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) dumpIR = true; - static ConfigDWORD fNgenHashDumpIR; - unsigned ngenHashDumpIRVal = (unsigned) fNgenHashDumpIR.val(CLRConfig::INTERNAL_NgenHashDumpIR); + unsigned ngenHashDumpIRVal = (unsigned) JitConfig.NgenHashDumpIR(); if ((ngenHashDumpIRVal != (DWORD)-1) && (ngenHashDumpIRVal == info.compMethodHash())) dumpIR = true; - static ConfigString ngenDumpIRFormat; - dumpIRFormat = ngenDumpIRFormat.val(CLRConfig::INTERNAL_NgenDumpIRFormat); - - static ConfigString ngenDumpIRPhase; - dumpIRPhase = ngenDumpIRPhase.val(CLRConfig::INTERNAL_NgenDumpIRPhase); + dumpIRFormat = JitConfig.NgenDumpIRFormat(); + dumpIRPhase = JitConfig.NgenDumpIRPhase(); } else { - static ConfigMethodSet fJitDump; - fJitDump.ensureInit(CLRConfig::INTERNAL_JitDump); - - if (fJitDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) verboseDump = true; - static ConfigDWORD fJitHashDump; - unsigned jitHashDumpVal = (unsigned) fJitHashDump.val(CLRConfig::INTERNAL_JitHashDump); + unsigned jitHashDumpVal = (unsigned) JitConfig.JitHashDump(); if ((jitHashDumpVal != (DWORD)-1) && (jitHashDumpVal == info.compMethodHash())) verboseDump = true; - static ConfigMethodSet fJitDumpIR; - fJitDumpIR.ensureInit(CLRConfig::INTERNAL_JitDumpIR); - - if (fJitDumpIR.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitDumpIR().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) dumpIR = true; - static ConfigDWORD fJitHashDumpIR; - unsigned jitHashDumpIRVal = (unsigned) fJitHashDumpIR.val(CLRConfig::INTERNAL_JitHashDumpIR); + unsigned jitHashDumpIRVal = (unsigned) JitConfig.JitHashDumpIR(); if ((jitHashDumpIRVal != (DWORD)-1) && (jitHashDumpIRVal == info.compMethodHash())) dumpIR = true; - static ConfigString jitDumpIRFormat; - dumpIRFormat = jitDumpIRFormat.val(CLRConfig::INTERNAL_JitDumpIRFormat); - - static ConfigString jitDumpIRPhase; - dumpIRPhase = jitDumpIRPhase.val(CLRConfig::INTERNAL_JitDumpIRPhase); + dumpIRFormat = JitConfig.JitDumpIRFormat(); + dumpIRPhase = JitConfig.JitDumpIRPhase(); } if (dumpIRPhase == nullptr) @@ -2591,83 +2553,60 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) { if (opts.eeFlags & CORJIT_FLG_PREJIT) { - static ConfigDWORD fNgenOrder; - if ((fNgenOrder.val(CLRConfig::INTERNAL_NgenOrder) & 1) == 1) + if ((JitConfig.NgenOrder() & 1) == 1) opts.dspOrder = true; - static ConfigMethodSet fNgenGCDump; - fNgenGCDump.ensureInit(CLRConfig::INTERNAL_NgenGCDump); - if (fNgenGCDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.NgenGCDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.dspGCtbls = true; - static ConfigMethodSet fNgenDisasm; - fNgenDisasm.ensureInit(CLRConfig::INTERNAL_NgenDisasm); - if (fNgenDisasm.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.NgenDisasm().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.disAsm = true; - if (fNgenDisasm.contains("SPILLED", NULL)) + if (JitConfig.NgenDisasm().contains("SPILLED", NULL, NULL)) opts.disAsmSpilled = true; - static ConfigMethodSet fNgenUnwindDump; - fNgenUnwindDump.ensureInit(CLRConfig::INTERNAL_NgenUnwindDump); - if (fNgenUnwindDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.NgenUnwindDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.dspUnwind = true; - static ConfigMethodSet fNgenEHDump; - fNgenEHDump.ensureInit(CLRConfig::INTERNAL_NgenEHDump); - if (fNgenEHDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.NgenEHDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.dspEHTable = true; } else { - static ConfigDWORD fJitOrder; - if ((fJitOrder.val(CLRConfig::INTERNAL_JitOrder) & 1) == 1) + if ((JitConfig.JitOrder() & 1) == 1) opts.dspOrder = true; - static ConfigMethodSet fJitGCDump; - fJitGCDump.ensureInit(CLRConfig::INTERNAL_JitGCDump); - if (fJitGCDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitGCDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.dspGCtbls = true; - static ConfigMethodSet fJitDisasm; - fJitDisasm.ensureInit(CLRConfig::INTERNAL_JitDisasm); - if (fJitDisasm.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitDisasm().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.disAsm = true; - if (fJitDisasm.contains("SPILLED", NULL)) + if (JitConfig.JitDisasm().contains("SPILLED", NULL, NULL)) opts.disAsmSpilled = true; - static ConfigMethodSet fJitUnwindDump; - fJitUnwindDump.ensureInit(CLRConfig::INTERNAL_JitUnwindDump); - if (fJitUnwindDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitUnwindDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.dspUnwind = true; - static ConfigMethodSet fJitEHDump; - fJitEHDump.ensureInit(CLRConfig::INTERNAL_JitEHDump); - if (fJitEHDump.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitEHDump().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.dspEHTable = true; } #ifdef LATE_DISASM - static ConfigMethodSet fJitLateDisasm; - fJitLateDisasm.ensureInit(CLRConfig::INTERNAL_JitLateDisasm); - if (fJitLateDisasm.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitLateDisasm().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.doLateDisasm = true; #endif // LATE_DISASM // This one applies to both Ngen/Jit Disasm output: COMPLUS_JitDiffableDasm=1 - static ConfigDWORD fDiffableDasm; - if (fDiffableDasm.val(CLRConfig::INTERNAL_JitDiffableDasm) != 0) + if (JitConfig.DiffableDasm() != 0) { opts.disDiffable = true; opts.dspDiffable = true; } - static ConfigDWORD fDisplayMemStats; - if (fDisplayMemStats.val(CLRConfig::INTERNAL_JitMemStats) != 0) + if (JitConfig.DisplayMemStats() != 0) s_dspMemStats = true; - static ConfigDWORD fJitLargeBranches; - if (fJitLargeBranches.val(CLRConfig::INTERNAL_JitLargeBranches) != 0) + if (JitConfig.JitLargeBranches() != 0) opts.compLargeBranches = true; } @@ -2684,12 +2623,10 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) codeGen->setVerbose(true); } - static ConfigDWORD fTreesBeforeAfterMorph; - treesBeforeAfterMorph = (fTreesBeforeAfterMorph.val(CLRConfig::INTERNAL_JitDumpBeforeAfterMorph) == 1); + treesBeforeAfterMorph = (JitConfig.TreesBeforeAfterMorph() == 1); morphNum = 0; // Initialize the morphed-trees counting. - static ConfigDWORD fJitExpensiveDebugCheckLevel; - expensiveDebugCheckLevel = fJitExpensiveDebugCheckLevel.val(CLRConfig::INTERNAL_JitExpensiveDebugCheckLevel); + expensiveDebugCheckLevel = JitConfig.JitExpensiveDebugCheckLevel(); if (expensiveDebugCheckLevel == 0) { // If we're in a stress mode that modifies the flowgraph, make 1 the default. @@ -2706,21 +2643,16 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) printf(""); // in our logic this causes a flush } - static ConfigMethodSet fJitBreak; - fJitBreak.ensureInit(CLRConfig::INTERNAL_JitBreak); - if (fJitBreak.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitBreak().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) assert(!"JitBreak reached"); - static ConfigDWORD fJitHashBreak; - unsigned jitHashBreakVal = (unsigned)fJitHashBreak.val(CLRConfig::INTERNAL_JitHashBreak); + unsigned jitHashBreakVal = (unsigned)JitConfig.JitHashBreak(); if ((jitHashBreakVal != (DWORD)-1) && (jitHashBreakVal == info.compMethodHash())) assert(!"JitHashBreak reached"); - static ConfigMethodSet fJitDebugBreak; - fJitDebugBreak.ensureInit(CLRConfig::INTERNAL_JitDebugBreak); if (verbose || - fJitDebugBreak.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args) || - fJitBreak.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + JitConfig.JitDebugBreak().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args) || + JitConfig.JitBreak().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) { compDebugBreak = true; } @@ -2734,8 +2666,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) #ifdef DEBUGGING_SUPPORT #ifdef DEBUG assert(!codeGen->isGCTypeFixed()); - static ConfigDWORD fJitGCChecks; - opts.compGcChecks = (fJitGCChecks.val_DontUse_(CLRConfig::INTERNAL_JitGCChecks) != 0) || + opts.compGcChecks = (JitConfig.JitGCChecks() != 0) || compStressCompile(STRESS_GENERIC_VARN, 5); enum @@ -2745,8 +2676,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) STACK_CHECK_ALL = 0x3, }; - static ConfigDWORD fJitStackChecks; - DWORD dwJitStackChecks = fJitStackChecks.val_DontUse_(CLRConfig::INTERNAL_JitStackChecks); + DWORD dwJitStackChecks = JitConfig.JitStackChecks(); if (compStressCompile(STRESS_GENERIC_VARN, 5)) dwJitStackChecks = STACK_CHECK_ALL; opts.compStackCheckOnRet = (dwJitStackChecks & DWORD(STACK_CHECK_ON_RETURN)) != 0; opts.compStackCheckOnCall = (dwJitStackChecks & DWORD(STACK_CHECK_ON_CALL)) != 0; @@ -2777,8 +2707,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) // Honour complus_JitELTHookEnabled only if VM has not asked us to generate profiler // hooks in the first place. That is, Override VM only if it hasn't asked for a // profiler callback for this method. - static ConfigDWORD fJitELTHookEnabled; - if (!compProfilerHookNeeded && (fJitELTHookEnabled.val(CLRConfig::INTERNAL_JitELTHookEnabled) != 0)) + if (!compProfilerHookNeeded && (JitConfig.JitELTHookEnabled() != 0)) { opts.compJitELTHookEnabled = true; } @@ -2794,14 +2723,13 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) #endif // PROFILING_SUPPORTED #if FEATURE_TAILCALL_OPT - static ConfigString fTailCallOpt; - LPWSTR strTailCallOpt = fTailCallOpt.val(CLRConfig::EXTERNAL_TailCallOpt); + const wchar_t* strTailCallOpt = JitConfig.TailCallOpt(); if (strTailCallOpt != nullptr) { opts.compTailCallOpt = (UINT)_wtoi(strTailCallOpt) != 0; } - static ConfigDWORD fTailCallLoopOpt; - if (fTailCallLoopOpt.val(CLRConfig::EXTERNAL_TailCallLoopOpt) == 0) + + if (JitConfig.TailCallLoopOpt() == 0) { opts.compTailCallLoopOpt = false; } @@ -2825,8 +2753,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) #ifdef DEBUG #if defined(_TARGET_XARCH_) && !defined(LEGACY_BACKEND) // Whether encoding of absolute addr as PC-rel offset is enabled in RyuJIT - static ConfigDWORD fEnablePCRelAddr; - opts.compEnablePCRelAddr = (fEnablePCRelAddr.val(CLRConfig::INTERNAL_JitEnablePCRelAddr) != 0); + opts.compEnablePCRelAddr = (JitConfig.EnablePCRelAddr() != 0); #endif #endif //DEBUG @@ -2850,21 +2777,15 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) // JitForceProcedureSplitting is used to force procedure splitting on checked assemblies. // This is useful for debugging on a checked build. Note that we still only do procedure // splitting in the zapper. - static ConfigMethodSet fJitForceProcedureSplitting; - fJitForceProcedureSplitting.ensureInit(CLRConfig::INTERNAL_JitForceProcedureSplitting); - if (fJitForceProcedureSplitting.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitForceProcedureSplitting().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.compProcedureSplitting = true; // JitNoProcedureSplitting will always disable procedure splitting. - static ConfigMethodSet fJitNoProcedureSplitting; - fJitNoProcedureSplitting.ensureInit(CLRConfig::INTERNAL_JitNoProcedureSplitting); - if (fJitNoProcedureSplitting.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitNoProcedureSplitting().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.compProcedureSplitting = false; // // JitNoProcedureSplittingEH will disable procedure splitting in functions with EH. - static ConfigMethodSet fJitNoProcedureSplittingEH; - fJitNoProcedureSplittingEH.ensureInit(CLRConfig::INTERNAL_JitNoProcedureSplittingEH); - if (fJitNoProcedureSplittingEH.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitNoProcedureSplittingEH().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) opts.compProcedureSplittingEH = false; #endif } @@ -2910,8 +2831,7 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) opts.compNeedStackProbes = false; #ifdef DEBUG - static ConfigDWORD fStackProbesOverride; - if (fStackProbesOverride.val_DontUse_(CLRConfig::INTERNAL_JitStackProbes) != 0 || + if (JitConfig.StackProbesOverride() != 0 || compStressCompile(STRESS_GENERIC_VARN, 5)) { opts.compNeedStackProbes = true; @@ -2922,9 +2842,8 @@ void Compiler::compInitOptions(CORJIT_FLAGS* jitFlags) // Now, set compMaxUncheckedOffsetForNullObject for STRESS_NULL_OBJECT_CHECK if (compStressCompile(STRESS_NULL_OBJECT_CHECK, 30)) { - static ConfigDWORD fJitMaxUncheckedOffset; compMaxUncheckedOffsetForNullObject = - (unsigned) fJitMaxUncheckedOffset.val(CLRConfig::INTERNAL_JitMaxUncheckedOffset); + (unsigned) JitConfig.JitMaxUncheckedOffset(); if (verbose) { printf("STRESS_NULL_OBJECT_CHECK: compMaxUncheckedOffsetForNullObject=0x%X\n", compMaxUncheckedOffsetForNullObject); } @@ -2988,17 +2907,14 @@ bool Compiler::compJitHaltMethod() /* This method returns true when we use an INS_BREAKPOINT to allow us to step into the generated native code */ /* Note that this these two "Jit" environment variables also work for ngen images */ - static ConfigMethodSet fJitHalt; - fJitHalt.ensureInit(CLRConfig::INTERNAL_JitHalt); - if (fJitHalt.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitHalt().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) { return true; } /* Use this Hash variant when there are a lot of method with the same name and different signatures */ - static ConfigDWORD fJitHashHalt; - unsigned fJitHashHaltVal = (unsigned)fJitHashHalt.val(CLRConfig::INTERNAL_JitHashHalt); + unsigned fJitHashHaltVal = (unsigned)JitConfig.JitHashHalt(); if ((fJitHashHaltVal != (unsigned)-1) && (fJitHashHaltVal == info.compMethodHash())) { return true; @@ -3033,21 +2949,17 @@ bool Compiler::compStressCompile(compStressArea stressArea, return false; } - static ConfigMethodSet fJitStressOnly; - fJitStressOnly.ensureInit(CLRConfig::INTERNAL_JitStressOnly); - if (!fJitStressOnly.isEmpty() && - !fJitStressOnly.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (!JitConfig.JitStressOnly().isEmpty() && + !JitConfig.JitStressOnly().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) { return false; } bool doStress = false; - static ConfigString fJitStressModeNames; - LPWSTR strStressModeNames; + const wchar_t* strStressModeNames; // Does user explicitly prevent using this STRESS_MODE through the command line? - static ConfigString fJitStressModeNamesNot; - LPWSTR strStressModeNamesNot = fJitStressModeNamesNot.val(CLRConfig::INTERNAL_JitStressModeNamesNot); + const wchar_t* strStressModeNamesNot = JitConfig.JitStressModeNamesNot(); if ((strStressModeNamesNot != NULL) && (wcsstr(strStressModeNamesNot, s_compStressModeNames[stressArea]) != NULL)) { @@ -3060,7 +2972,7 @@ bool Compiler::compStressCompile(compStressArea stressArea, } // Does user explicitly set this STRESS_MODE through the command line? - strStressModeNames = fJitStressModeNames.val(CLRConfig::INTERNAL_JitStressModeNames); + strStressModeNames = JitConfig.JitStressModeNames(); if ((strStressModeNames != NULL) && (wcsstr(strStressModeNames, s_compStressModeNames[stressArea]) != NULL)) { @@ -3235,9 +3147,7 @@ void Compiler::compSetOptimizationLevel() } #ifdef DEBUG - static ConfigDWORD fJitMinOpts; - - jitMinOpts = fJitMinOpts.val_DontUse_(CLRConfig::UNSUPPORTED_JITMinOpts, 0); + jitMinOpts = JitConfig.JitMinOpts(); if (!theMinOptsValue && (jitMinOpts > 0)) { @@ -3301,10 +3211,7 @@ void Compiler::compSetOptimizationLevel() if (!theMinOptsValue) { - static ConfigMethodSet jitMinOptsName; - jitMinOptsName.ensureInit(CLRConfig::INTERNAL_JITMinOptsName); - - if (jitMinOptsName.contains(info.compMethodName, info.compClassName, info.compMethodInfo->args.pSig)) + if (JitConfig.JitMinOptsName().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) theMinOptsValue = true; } @@ -3316,34 +3223,27 @@ void Compiler::compSetOptimizationLevel() // unless unless CLFLG_MINOPT is set else if (!(compileFlags & CORJIT_FLG_PREJIT)) { - static ConfigDWORD fJitMinOptsCodeSize; - static ConfigDWORD fJitMinOptsInstrCount; - static ConfigDWORD fJitMinOptsBbCount; - static ConfigDWORD fJitMinOptsLvNumCount; - static ConfigDWORD fJitMinOptsLvRefCount; - static ConfigDWORD fJitBreakOnMinOpts; - - if (fJitMinOptsCodeSize.val_DontUse_(CLRConfig::INTERNAL_JITMinOptsCodeSize, DEFAULT_MIN_OPTS_CODE_SIZE) < info.compILCodeSize) + if ((unsigned)JitConfig.JitMinOptsCodeSize() < info.compILCodeSize) { JITLOG((LL_INFO10, "IL Code Size exceeded, using MinOpts for method %s\n", info.compFullName)); theMinOptsValue = true; } - else if (fJitMinOptsInstrCount.val_DontUse_(CLRConfig::INTERNAL_JITMinOptsInstrCount, DEFAULT_MIN_OPTS_INSTR_COUNT) < opts.instrCount) + else if ((unsigned)JitConfig.JitMinOptsInstrCount() < opts.instrCount) { JITLOG((LL_INFO10, "IL instruction count exceeded, using MinOpts for method %s\n", info.compFullName)); theMinOptsValue = true; } - else if (fJitMinOptsBbCount.val_DontUse_(CLRConfig::INTERNAL_JITMinOptsBbCount, DEFAULT_MIN_OPTS_BB_COUNT) < fgBBcount) + else if ((unsigned)JitConfig.JitMinOptsBbCount() < fgBBcount) { JITLOG((LL_INFO10, "Basic Block count exceeded, using MinOpts for method %s\n", info.compFullName)); theMinOptsValue = true; } - else if (fJitMinOptsLvNumCount.val_DontUse_(CLRConfig::INTERNAL_JITMinOptsLvNumcount, DEFAULT_MIN_OPTS_LV_NUM_COUNT) < lvaCount) + else if ((unsigned)JitConfig.JitMinOptsLvNumCount() < lvaCount) { JITLOG((LL_INFO10, "Local Variable Num count exceeded, using MinOpts for method %s\n", info.compFullName)); theMinOptsValue = true; } - else if (fJitMinOptsLvRefCount.val_DontUse_(CLRConfig::INTERNAL_JITMinOptsLvRefcount, DEFAULT_MIN_OPTS_LV_REF_COUNT) < opts.lvRefCount) + else if ((unsigned)JitConfig.JitMinOptsLvRefCount() < opts.lvRefCount) { JITLOG((LL_INFO10, "Local Variable Ref count exceeded, using MinOpts for method %s\n", info.compFullName)); theMinOptsValue = true; @@ -3352,7 +3252,7 @@ void Compiler::compSetOptimizationLevel() { JITLOG((LL_INFO10000, "IL Code Size,Instr %4d,%4d, Basic Block count %3d, Local Variable Num,Ref count %3d,%3d for method %s\n", info.compILCodeSize, opts.instrCount, fgBBcount, lvaCount, opts.lvRefCount, info.compFullName)); - if (fJitBreakOnMinOpts.val_DontUse_(CLRConfig::INTERNAL_JITBreakOnMinOpts, 0) != 0) + if (JitConfig.JitBreakOnMinOpts() != 0) { assert(!"MinOpts enabled"); } @@ -3601,7 +3501,7 @@ void Compiler::compCompile(void * * methodCodePtr, EndPhase(PHASE_PRE_IMPORT); #ifdef DEBUG - bool funcTrace = (CLRConfig::GetConfigValue(CLRConfig::INTERNAL_JitFunctionTrace) != 0); + bool funcTrace = JitConfig.JitFunctionTrace() != 0; if (!compIsForInlining()) { @@ -3841,14 +3741,13 @@ void Compiler::compCompile(void * * methodCodePtr, bool doRangeAnalysis = true; #ifdef DEBUG - static ConfigDWORD fJitDoOptConfig[7]; - doSsa = (fJitDoOptConfig[0].val(CLRConfig::INTERNAL_JitDoSsa) != 0); - doEarlyProp = doSsa && (fJitDoOptConfig[1].val(CLRConfig::INTERNAL_JitDoEarlyProp) != 0); - doValueNum = doSsa && (fJitDoOptConfig[2].val(CLRConfig::INTERNAL_JitDoValueNumber) != 0); - doLoopHoisting = doValueNum && (fJitDoOptConfig[3].val(CLRConfig::INTERNAL_JitDoLoopHoisting) != 0); - doCopyProp = doValueNum && (fJitDoOptConfig[4].val(CLRConfig::INTERNAL_JitDoCopyProp) != 0); - doAssertionProp = doValueNum && (fJitDoOptConfig[5].val(CLRConfig::INTERNAL_JitDoAssertionProp) != 0); - doRangeAnalysis = doAssertionProp && (fJitDoOptConfig[6].val(CLRConfig::INTERNAL_JitDoRangeAnalysis) != 0); + doSsa = (JitConfig.JitDoSsa() != 0); + doEarlyProp = doSsa && (JitConfig.JitDoEarlyProp() != 0); + doValueNum = doSsa && (JitConfig.JitDoValueNumber() != 0); + doLoopHoisting = doValueNum && (JitConfig.JitDoLoopHoisting() != 0); + doCopyProp = doValueNum && (JitConfig.JitDoCopyProp() != 0); + doAssertionProp = doValueNum && (JitConfig.JitDoAssertionProp() != 0); + doRangeAnalysis = doAssertionProp && (JitConfig.JitDoRangeAnalysis() != 0); #endif if (doSsa) @@ -4176,18 +4075,14 @@ void* forceFrameJIT; // used to force to frame &useful for fastchecked deb bool Compiler::skipMethod() { static ConfigMethodRange fJitRange; - fJitRange.ensureInit(CLRConfig::INTERNAL_JitRange); + fJitRange.ensureInit(JitConfig.JitRange()); if (!fJitRange.contains(info.compCompHnd, info.compMethodHnd)) return true; - static ConfigMethodSet fJitExclude; - fJitExclude.ensureInit(CLRConfig::INTERNAL_JitExclude); - if (fJitExclude.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (JitConfig.JitExclude().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) return true; - static ConfigMethodSet fJitInclude; - fJitInclude.ensureInit(CLRConfig::INTERNAL_JitInclude); - if (!fJitInclude.isEmpty() && !fJitInclude.contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) + if (!JitConfig.JitInclude().isEmpty() && !JitConfig.JitInclude().contains(info.compMethodName, info.compClassName, &info.compMethodInfo->args)) return true; return false; @@ -4262,8 +4157,7 @@ int Compiler::compCompile(CORINFO_METHOD_HANDLE methodHnd, #endif #if FUNC_INFO_LOGGING - static ConfigString jitFuncInfoFile; - LPCWSTR tmpJitFuncInfoFilename = jitFuncInfoFile.val(CLRConfig::INTERNAL_JitFuncInfoLogFile); + LPCWSTR tmpJitFuncInfoFilename = JitConfig.JitFuncInfoFile(); if (tmpJitFuncInfoFilename != NULL) { @@ -4345,7 +4239,7 @@ int Compiler::compCompile(CORINFO_METHOD_HANDLE methodHnd, } static ConfigMethodRange fJitStressRange; - fJitStressRange.ensureInit(CLRConfig::INTERNAL_JitStressRange); + fJitStressRange.ensureInit(JitConfig.JitStressRange()); if (fJitStressRange.contains(info.compCompHnd, info.compMethodHnd)) { bRangeAllowStress = true; @@ -4807,8 +4701,7 @@ int Compiler::compCompileHelper (CORINFO_MODULE_HANDLE clas #endif // Check for COMPLUS_AgressiveInlining - static ConfigDWORD fJitAggressiveInlining; - if (fJitAggressiveInlining.val(CLRConfig::INTERNAL_JitAggressiveInlining)) + if (JitConfig.JitAggressiveInlining()) { compDoAggressiveInlining = true; } @@ -4834,8 +4727,7 @@ int Compiler::compCompileHelper (CORINFO_MODULE_HANDLE clas } // Force verification if asked to do so - static ConfigDWORD fJitForceVer; - if (fJitForceVer.val(CLRConfig::INTERNAL_JitForceVer)) + if (JitConfig.JitForceVer()) tiVerificationNeeded = (instVerInfo == INSTVER_NOT_INSTANTIATION); if (tiVerificationNeeded) @@ -5073,8 +4965,7 @@ int Compiler::compCompileHelper (CORINFO_MODULE_HANDLE clas } #ifdef DEBUG - static ConfigDWORD fDumpJittedMethods; - if (fDumpJittedMethods.val(CLRConfig::INTERNAL_DumpJittedMethods) == 1 && !compIsForInlining()) + if (JitConfig.DumpJittedMethods() == 1 && !compIsForInlining()) { printf("Compiling %4d %s::%s, IL size = %u, hsh=0x%x\n", Compiler::jitTotalMethodCompiled, @@ -5121,8 +5012,7 @@ _Next: #ifdef ALT_JIT #ifdef DEBUG - static ConfigDWORD fRunAltJitCode; - if (fRunAltJitCode.val(CLRConfig::INTERNAL_RunAltJitCode) == 0) + if (JitConfig.RunAltJitCode() == 0) { return CORJIT_SKIPPED; } @@ -6684,8 +6574,7 @@ CritSecObject JitTimer::s_csvLock; LPCWSTR Compiler::JitTimeLogCsv() { - static ConfigString jitConfigTimeLogCsv; - LPCWSTR jitTimeLogCsv = jitConfigTimeLogCsv.val(CLRConfig::INTERNAL_JitTimeLogCsv); + LPCWSTR jitTimeLogCsv = JitConfig.JitTimeLogCsv(); return jitTimeLogCsv; } |