summaryrefslogtreecommitdiff
path: root/src/ToolBox
diff options
context:
space:
mode:
authorEugene Rozenfeld <erozen@microsoft.com>2018-12-16 12:07:42 -0800
committerEugene Rozenfeld <erozen@microsoft.com>2018-12-21 22:38:52 -0800
commiteea057675de7914af12c6168db0f3bebea35be5b (patch)
tree7b3134b62a2707e32fbf00d4c0138a39099d3a75 /src/ToolBox
parent0a1374f4f7c2141bf6d8ad74a68dd329afdbee78 (diff)
downloadcoreclr-eea057675de7914af12c6168db0f3bebea35be5b.tar.gz
coreclr-eea057675de7914af12c6168db0f3bebea35be5b.tar.bz2
coreclr-eea057675de7914af12c6168db0f3bebea35be5b.zip
Improve removal of dead calls to allocator helpers.
This change improves detection of allocators with side effects. Allocators can cause side effects if the allocated object may have a finalizer. This change adds a pHasSideEffects parameter to getNewHelper JitEE interface method. It's used by the jit to check for allocator side effects instead of guessing from helper ids. Fixes #21530.
Diffstat (limited to 'src/ToolBox')
-rw-r--r--src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h2
-rw-r--r--src/ToolBox/superpmi/superpmi-shared/lwmlist.h2
-rw-r--r--src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp30
-rw-r--r--src/ToolBox/superpmi/superpmi-shared/methodcontext.h5
-rw-r--r--src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp7
-rw-r--r--src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp5
-rw-r--r--src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp5
-rw-r--r--src/ToolBox/superpmi/superpmi/icorjitinfo.cpp4
8 files changed, 39 insertions, 21 deletions
diff --git a/src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h b/src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h
index b6a66a3e06..223e1d89c7 100644
--- a/src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h
+++ b/src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h
@@ -360,7 +360,7 @@ CORINFO_FIELD_HANDLE getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num);
BOOL checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier, BOOL fOptional);
// returns the "NEW" helper optimized for "newCls."
-CorInfoHelpFunc getNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle);
+CorInfoHelpFunc getNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, bool* pHasSideEffects = NULL /* OUT */);
// returns the newArr (1-Dim array) helper optimized for "arrayCls."
CorInfoHelpFunc getNewArrHelper(CORINFO_CLASS_HANDLE arrayCls);
diff --git a/src/ToolBox/superpmi/superpmi-shared/lwmlist.h b/src/ToolBox/superpmi/superpmi-shared/lwmlist.h
index 137fbe111d..d034bdcd8f 100644
--- a/src/ToolBox/superpmi/superpmi-shared/lwmlist.h
+++ b/src/ToolBox/superpmi/superpmi-shared/lwmlist.h
@@ -114,7 +114,7 @@ LWM(GetMethodSig, DLDL, Agnostic_CORINFO_SIG_INFO)
LWM(GetMethodSync, DWORDLONG, DLDL)
LWM(GetMethodVTableOffset, DWORDLONG, DDD)
LWM(GetNewArrHelper, DWORDLONG, DWORD)
-LWM(GetNewHelper, Agnostic_GetNewHelper, DWORD)
+LWM(GetNewHelper, Agnostic_GetNewHelper, DD)
LWM(GetParentType, DWORDLONG, DWORDLONG)
LWM(GetPInvokeUnmanagedTarget, DWORDLONG, DLDL)
LWM(GetProfilingHandle, DWORD, Agnostic_GetProfilingHandle)
diff --git a/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp b/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp
index 4883dd4f38..5f4861d544 100644
--- a/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp
+++ b/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp
@@ -2900,10 +2900,11 @@ bool MethodContext::repGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_I
void MethodContext::recGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
CORINFO_METHOD_HANDLE callerHandle,
+ bool* pHasSideEffects,
CorInfoHelpFunc result)
{
if (GetNewHelper == nullptr)
- GetNewHelper = new LightWeightMap<Agnostic_GetNewHelper, DWORD>();
+ GetNewHelper = new LightWeightMap<Agnostic_GetNewHelper, DD>();
Agnostic_GetNewHelper key;
ZeroMemory(&key, sizeof(Agnostic_GetNewHelper)); // We use the input structs as a key and use memcmp to compare.. so
@@ -2911,15 +2912,20 @@ void MethodContext::recGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
key.hClass = (DWORDLONG)pResolvedToken->hClass;
key.callerHandle = (DWORDLONG)callerHandle;
- GetNewHelper->Add(key, (DWORD)result);
- DEBUG_REC(dmpGetNewHelper(key, (DWORD)result));
+ DD value;
+ value.A = (pHasSideEffects != nullptr) ? (DWORD)(*pHasSideEffects ? 1 : 0) : (DWORD)0;
+ value.B = (DWORD)result;
+
+ GetNewHelper->Add(key, value);
+ DEBUG_REC(dmpGetNewHelper(key, value));
}
-void MethodContext::dmpGetNewHelper(const Agnostic_GetNewHelper& key, DWORD value)
+void MethodContext::dmpGetNewHelper(const Agnostic_GetNewHelper& key, DD value)
{
- printf("GetNewHelper key cls-%016llX chan-%016llX, value res-%u", key.hClass, key.callerHandle, value);
+ printf("GetNewHelper key cls-%016llX chan-%016llX, hasSideEffects-%u, value res-%u", key.hClass, key.callerHandle, value.A, value.B);
}
CorInfoHelpFunc MethodContext::repGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
- CORINFO_METHOD_HANDLE callerHandle)
+ CORINFO_METHOD_HANDLE callerHandle,
+ bool* pHasSideEffects)
{
Agnostic_GetNewHelper key;
ZeroMemory(&key, sizeof(Agnostic_GetNewHelper)); // We use the input structs as a key and use memcmp to compare.. so
@@ -2929,9 +2935,17 @@ CorInfoHelpFunc MethodContext::repGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolved
AssertCodeMsg(GetNewHelper != nullptr, EXCEPTIONCODE_MC, "Didn't find anything for %016llX", (DWORDLONG)key.hClass);
AssertCodeMsg(GetNewHelper->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find %016llX", (DWORDLONG)key.hClass);
- CorInfoHelpFunc value = (CorInfoHelpFunc)GetNewHelper->Get(key);
+
+ DD value;
+ value = GetNewHelper->Get(key);
+ if (pHasSideEffects != nullptr)
+ {
+ *pHasSideEffects = (value.A == 0) ? false : true;
+ }
+ CorInfoHelpFunc result = (CorInfoHelpFunc)value.B;
+
DEBUG_REP(dmpGetNewHelper(key, value));
- return value;
+ return result;
}
void MethodContext::recEmbedGenericHandle(CORINFO_RESOLVED_TOKEN* pResolvedToken,
diff --git a/src/ToolBox/superpmi/superpmi-shared/methodcontext.h b/src/ToolBox/superpmi/superpmi-shared/methodcontext.h
index 115cd4182d..7e20c2bc1a 100644
--- a/src/ToolBox/superpmi/superpmi-shared/methodcontext.h
+++ b/src/ToolBox/superpmi/superpmi-shared/methodcontext.h
@@ -878,9 +878,10 @@ public:
void recGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
CORINFO_METHOD_HANDLE callerHandle,
+ bool* pHasSideEffects,
CorInfoHelpFunc result);
- void dmpGetNewHelper(const Agnostic_GetNewHelper& key, DWORD value);
- CorInfoHelpFunc repGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle);
+ void dmpGetNewHelper(const Agnostic_GetNewHelper& key, DD value);
+ CorInfoHelpFunc repGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, bool * pHasSideEffects);
void recEmbedGenericHandle(CORINFO_RESOLVED_TOKEN* pResolvedToken,
BOOL fEmbedParent,
diff --git a/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp
index 898f8241cb..44b08dfe71 100644
--- a/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp
+++ b/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp
@@ -768,11 +768,12 @@ BOOL interceptor_ICJI::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR
// returns the "NEW" helper optimized for "newCls."
CorInfoHelpFunc interceptor_ICJI::getNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
- CORINFO_METHOD_HANDLE callerHandle)
+ CORINFO_METHOD_HANDLE callerHandle,
+ bool* pHasSideEffects)
{
mc->cr->AddCall("getNewHelper");
- CorInfoHelpFunc temp = original_ICorJitInfo->getNewHelper(pResolvedToken, callerHandle);
- mc->recGetNewHelper(pResolvedToken, callerHandle, temp);
+ CorInfoHelpFunc temp = original_ICorJitInfo->getNewHelper(pResolvedToken, callerHandle, pHasSideEffects);
+ mc->recGetNewHelper(pResolvedToken, callerHandle, pHasSideEffects, temp);
return temp;
}
diff --git a/src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp b/src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp
index 3348479a85..5fe6bc367b 100644
--- a/src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp
+++ b/src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp
@@ -587,10 +587,11 @@ BOOL interceptor_ICJI::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR
// returns the "NEW" helper optimized for "newCls."
CorInfoHelpFunc interceptor_ICJI::getNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
- CORINFO_METHOD_HANDLE callerHandle)
+ CORINFO_METHOD_HANDLE callerHandle,
+ bool* pHasSideEffects)
{
mcs->AddCall("getNewHelper");
- return original_ICorJitInfo->getNewHelper(pResolvedToken, callerHandle);
+ return original_ICorJitInfo->getNewHelper(pResolvedToken, callerHandle, pHasSideEffects);
}
// returns the newArr (1-Dim array) helper optimized for "arrayCls."
diff --git a/src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp b/src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp
index b5a18f855c..0455503658 100644
--- a/src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp
+++ b/src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp
@@ -524,9 +524,10 @@ BOOL interceptor_ICJI::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR
// returns the "NEW" helper optimized for "newCls."
CorInfoHelpFunc interceptor_ICJI::getNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
- CORINFO_METHOD_HANDLE callerHandle)
+ CORINFO_METHOD_HANDLE callerHandle,
+ bool* pHasSideEffects)
{
- return original_ICorJitInfo->getNewHelper(pResolvedToken, callerHandle);
+ return original_ICorJitInfo->getNewHelper(pResolvedToken, callerHandle, pHasSideEffects);
}
// returns the newArr (1-Dim array) helper optimized for "arrayCls."
diff --git a/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp b/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp
index bf60a9a0bd..bca4cb04fa 100644
--- a/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp
+++ b/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp
@@ -644,10 +644,10 @@ BOOL MyICJI::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier,
}
// returns the "NEW" helper optimized for "newCls."
-CorInfoHelpFunc MyICJI::getNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle)
+CorInfoHelpFunc MyICJI::getNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, bool * pHasSideEffects)
{
jitInstance->mc->cr->AddCall("getNewHelper");
- return jitInstance->mc->repGetNewHelper(pResolvedToken, callerHandle);
+ return jitInstance->mc->repGetNewHelper(pResolvedToken, callerHandle, pHasSideEffects);
}
// returns the newArr (1-Dim array) helper optimized for "arrayCls."