diff options
author | Eugene Rozenfeld <erozen@microsoft.com> | 2018-12-16 12:07:42 -0800 |
---|---|---|
committer | Eugene Rozenfeld <erozen@microsoft.com> | 2018-12-21 22:38:52 -0800 |
commit | eea057675de7914af12c6168db0f3bebea35be5b (patch) | |
tree | 7b3134b62a2707e32fbf00d4c0138a39099d3a75 /src/ToolBox | |
parent | 0a1374f4f7c2141bf6d8ad74a68dd329afdbee78 (diff) | |
download | coreclr-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')
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." |