From 962cc86b5626776fd19e8b878ff3cbd6357d192c Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Thu, 12 Nov 2020 17:08:31 -0800 Subject: [PATCH] Fix SuperPMI for new altjit jit flag --- .../ToolBox/superpmi/superpmi/icorjitinfo.cpp | 11 ++++++- .../ToolBox/superpmi/superpmi/jitinstance.cpp | 31 ++++++++++++++++++- .../ToolBox/superpmi/superpmi/jitinstance.h | 4 +++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp index 6b8f4540a52285..789dfae1fd9400 100644 --- a/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp @@ -1566,7 +1566,16 @@ void MyICJI::notifyInstructionSetUsage(CORINFO_InstructionSet instructionSet, bo DWORD MyICJI::getJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes) { jitInstance->mc->cr->AddCall("getJitFlags"); - return jitInstance->mc->repGetJitFlags(jitFlags, sizeInBytes); + DWORD ret = jitInstance->mc->repGetJitFlags(jitFlags, sizeInBytes); + if (jitInstance->forceClearAltJitFlag) + { + jitFlags->Clear(CORJIT_FLAGS::CORJIT_FLAG_ALT_JIT); + } + else if (jitInstance->forceSetAltJitFlag) + { + jitFlags->Set(CORJIT_FLAGS::CORJIT_FLAG_ALT_JIT); + } + return ret; } // Runs the given function with the given parameter under an error trap diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.cpp index 5050f248fa479a..2379c467281d44 100644 --- a/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.cpp +++ b/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.cpp @@ -26,9 +26,38 @@ JitInstance* JitInstance::InitJit(char* nameOfJit, } jit->forceOptions = forceOptions; - jit->options = options; + // The flag to cause the JIT to be invoked as an altjit is stored in the jit flags, not in + // the environment. If the user uses the "-jitoption force" flag to force AltJit off (it was + // probably on during collection), or to force it on, then propagate that to the jit flags. + jit->forceClearAltJitFlag = false; + jit->forceSetAltJitFlag = false; + const WCHAR* altJitFlag = jit->getForceOption(W("AltJit")); + if (altJitFlag != nullptr) + { + if (wcscmp(altJitFlag, W("")) == 0) + { + jit->forceClearAltJitFlag = true; + } + else + { + jit->forceSetAltJitFlag = true; + } + } + const WCHAR* altJitNgenFlag = jit->getForceOption(W("AltJitNgen")); + if (altJitNgenFlag != nullptr) + { + if (wcscmp(altJitNgenFlag, W("")) == 0) + { + jit->forceClearAltJitFlag = true; + } + else + { + jit->forceSetAltJitFlag = true; + } + } + jit->environment.getIntConfigValue = nullptr; jit->environment.getStingConfigValue = nullptr; diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.h b/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.h index 1acec90792e3fc..d8755635d936b4 100644 --- a/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.h +++ b/src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.h @@ -32,6 +32,10 @@ class JitInstance void timeResult(CORINFO_METHOD_INFO info, unsigned flags); public: + + bool forceClearAltJitFlag; + bool forceSetAltJitFlag; + enum Result { RESULT_ERROR,