summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ToolBox/superpmi/superpmi/jitinstance.cpp69
-rw-r--r--src/ToolBox/superpmi/superpmi/jitinstance.h2
2 files changed, 60 insertions, 11 deletions
diff --git a/src/ToolBox/superpmi/superpmi/jitinstance.cpp b/src/ToolBox/superpmi/superpmi/jitinstance.cpp
index 52f2b90d22..ee589f12ea 100644
--- a/src/ToolBox/superpmi/superpmi/jitinstance.cpp
+++ b/src/ToolBox/superpmi/superpmi/jitinstance.cpp
@@ -190,7 +190,11 @@ HRESULT JitInstance::StartUp(char* PathToJit,
{
mc = firstContext;
jitHost = new JitHost(*this);
- pnjitStartup(jitHost);
+ if (!callJitStartup(jitHost))
+ {
+ LogError("jitStartup failed");
+ return -1;
+ }
}
pJitInstance = pngetJit();
@@ -256,7 +260,11 @@ bool JitInstance::reLoad(MethodContext* firstContext)
{
mc = firstContext;
jitHost = new JitHost(*this);
- pnjitStartup(jitHost);
+ if (!callJitStartup(jitHost))
+ {
+ LogError("jitStartup failed");
+ return false;
+ }
}
pJitInstance = pngetJit();
@@ -465,17 +473,56 @@ void JitInstance::freeLongLivedArray(void* array)
HeapFree(ourHeap, 0, array);
}
+// Helper for calling pnjitStartup. Needed to allow SEH here.
+bool JitInstance::callJitStartup(ICorJitHost* jithost)
+{
+ // Calling into the collection, which could fail, especially
+ // for altjits. So protect the call.
+
+ struct Param : FilterSuperPMIExceptionsParam_CaptureException
+ {
+ JitInstance* pThis;
+ ICorJitHost* jithost;
+ bool result;
+ } param;
+ param.pThis = this;
+ param.jithost = jithost;
+ param.result = false;
+
+ PAL_TRY(Param*, pParam, &param)
+ {
+ pParam->pThis->pnjitStartup(pParam->jithost);
+ pParam->result = true;
+ }
+ PAL_EXCEPT_FILTER(FilterSuperPMIExceptions_CaptureExceptionAndStop)
+ {
+ SpmiException e(&param.exceptionPointers);
+
+ LogError("failed to call jitStartup.");
+ e.ShowAndDeleteMessage();
+ }
+ PAL_ENDTRY
+
+ return param.result;
+}
+
// Reset JitConfig, that stores Enviroment variables.
bool JitInstance::resetConfig(MethodContext* firstContext)
{
- if (pnjitStartup != nullptr)
+ if (pnjitStartup == nullptr)
+ {
+ return false;
+ }
+
+ mc = firstContext;
+ ICorJitHost* newHost = new JitHost(*this);
+
+ if (!callJitStartup(newHost))
{
- mc = firstContext;
- ICorJitHost* newHost = new JitHost(*this);
- pnjitStartup(newHost);
- delete static_cast<JitHost*>(jitHost);
- jitHost = newHost;
- return true;
+ return false;
}
- return false;
-}
+
+ delete static_cast<JitHost*>(jitHost);
+ jitHost = newHost;
+ return true;
+} \ No newline at end of file
diff --git a/src/ToolBox/superpmi/superpmi/jitinstance.h b/src/ToolBox/superpmi/superpmi/jitinstance.h
index eeb2ff7081..e7b5fdb034 100644
--- a/src/ToolBox/superpmi/superpmi/jitinstance.h
+++ b/src/ToolBox/superpmi/superpmi/jitinstance.h
@@ -54,6 +54,8 @@ public:
HRESULT StartUp(char* PathToJit, bool copyJit, bool breakOnDebugBreakorAV, MethodContext* firstContext);
bool reLoad(MethodContext* firstContext);
+ bool callJitStartup(ICorJitHost* newHost);
+
bool resetConfig(MethodContext* firstContext);
Result CompileMethod(MethodContext* MethodToCompile, int mcIndex, bool collectThroughput);