summaryrefslogtreecommitdiff
path: root/src/zap
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/zap
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/zap')
-rw-r--r--src/zap/zapinfo.cpp184
-rw-r--r--src/zap/zapinfo.h2
2 files changed, 94 insertions, 92 deletions
diff --git a/src/zap/zapinfo.cpp b/src/zap/zapinfo.cpp
index a37531c735..f34e1146d5 100644
--- a/src/zap/zapinfo.cpp
+++ b/src/zap/zapinfo.cpp
@@ -3390,149 +3390,151 @@ unsigned ZapInfo::getClassNumInstanceFields(CORINFO_CLASS_HANDLE cls)
return m_pEEJitInfo->getClassNumInstanceFields(cls);
}
-
-CorInfoHelpFunc ZapInfo::getNewHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_METHOD_HANDLE callerHandle)
+CorInfoHelpFunc ZapInfo::getNewHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, bool * pHasSideEffects)
{
- if (IsReadyToRunCompilation())
- return CORINFO_HELP_NEWFAST;
+ if (!IsReadyToRunCompilation())
+ {
+ classMustBeLoadedBeforeCodeIsRun(pResolvedToken->hClass);
+ }
+
+ CorInfoHelpFunc helper = m_pEEJitInfo->getNewHelper(pResolvedToken, callerHandle, pHasSideEffects);
- classMustBeLoadedBeforeCodeIsRun(pResolvedToken->hClass);
- return m_pEEJitInfo->getNewHelper(pResolvedToken, callerHandle);
+ return IsReadyToRunCompilation() ? CORINFO_HELP_NEWFAST : helper;
}
CorInfoHelpFunc ZapInfo::getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd)
{
- return m_pEEJitInfo->getSharedCCtorHelper(clsHnd);
+ return m_pEEJitInfo->getSharedCCtorHelper(clsHnd);
}
CorInfoHelpFunc ZapInfo::getSecurityPrologHelper(CORINFO_METHOD_HANDLE ftn)
{
- return m_pEEJitInfo->getSecurityPrologHelper(ftn);
+ return m_pEEJitInfo->getSecurityPrologHelper(ftn);
}
CORINFO_CLASS_HANDLE ZapInfo::getTypeForBox(CORINFO_CLASS_HANDLE cls)
{
- return m_pEEJitInfo->getTypeForBox(cls);
+ return m_pEEJitInfo->getTypeForBox(cls);
}
CorInfoHelpFunc ZapInfo::getBoxHelper(CORINFO_CLASS_HANDLE cls)
{
- return m_pEEJitInfo->getBoxHelper(cls);
+ return m_pEEJitInfo->getBoxHelper(cls);
}
CorInfoHelpFunc ZapInfo::getUnBoxHelper(CORINFO_CLASS_HANDLE cls)
{
- return m_pEEJitInfo->getUnBoxHelper(cls);
+ return m_pEEJitInfo->getUnBoxHelper(cls);
}
CorInfoHelpFunc ZapInfo::getCastingHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, bool fThrowing)
{
- if (IsReadyToRunCompilation())
- return (fThrowing ? CORINFO_HELP_CHKCASTANY : CORINFO_HELP_ISINSTANCEOFANY);
+ if (IsReadyToRunCompilation())
+ return (fThrowing ? CORINFO_HELP_CHKCASTANY : CORINFO_HELP_ISINSTANCEOFANY);
- return m_pEEJitInfo->getCastingHelper(pResolvedToken, fThrowing);
+ return m_pEEJitInfo->getCastingHelper(pResolvedToken, fThrowing);
}
CorInfoHelpFunc ZapInfo::getNewArrHelper(CORINFO_CLASS_HANDLE arrayCls)
{
- if (IsReadyToRunCompilation())
- return CORINFO_HELP_NEWARR_1_R2R_DIRECT;
+ if (IsReadyToRunCompilation())
+ return CORINFO_HELP_NEWARR_1_R2R_DIRECT;
- return m_pEEJitInfo->getNewArrHelper(arrayCls);
+ return m_pEEJitInfo->getNewArrHelper(arrayCls);
}
bool ZapInfo::getReadyToRunHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken,
- CORINFO_LOOKUP_KIND * pGenericLookupKind,
- CorInfoHelpFunc id,
- CORINFO_CONST_LOOKUP * pLookup)
+ CORINFO_LOOKUP_KIND * pGenericLookupKind,
+ CorInfoHelpFunc id,
+ CORINFO_CONST_LOOKUP * pLookup)
{
#ifdef FEATURE_READYTORUN_COMPILER
- _ASSERTE(IsReadyToRunCompilation());
+ _ASSERTE(IsReadyToRunCompilation());
- ZapImport * pImport = NULL;
+ ZapImport * pImport = NULL;
- DWORD fAtypicalCallsite = (id & CORINFO_HELP_READYTORUN_ATYPICAL_CALLSITE);
- id = (CorInfoHelpFunc)(id & ~CORINFO_HELP_READYTORUN_ATYPICAL_CALLSITE);
+ DWORD fAtypicalCallsite = (id & CORINFO_HELP_READYTORUN_ATYPICAL_CALLSITE);
+ id = (CorInfoHelpFunc)(id & ~CORINFO_HELP_READYTORUN_ATYPICAL_CALLSITE);
- switch (id)
- {
- case CORINFO_HELP_READYTORUN_NEW:
+ switch (id)
+ {
+ case CORINFO_HELP_READYTORUN_NEW:
// Call CEEInfo::getNewHelper to validate the request (e.g., check for abstract class).
m_pEEJitInfo->getNewHelper(pResolvedToken, m_currentMethodHandle);
- if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
- return false; // Requires runtime lookup.
- pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
- (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_NEW_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
- break;
-
- case CORINFO_HELP_READYTORUN_NEWARR_1:
- if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
- return false; // Requires runtime lookup.
- pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
- (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_NEW_ARRAY_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
- break;
-
- case CORINFO_HELP_READYTORUN_ISINSTANCEOF:
- if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
- return false; // Requires runtime lookup.
- pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
- (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_ISINSTANCEOF_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
- break;
-
- case CORINFO_HELP_READYTORUN_CHKCAST:
- if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
- return false; // Requires runtime lookup.
- pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
- (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_CHKCAST_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
- break;
-
- case CORINFO_HELP_READYTORUN_STATIC_BASE:
- if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
- return false; // Requires runtime lookup.
- if (m_pImage->GetCompileInfo()->IsInCurrentVersionBubble(m_pEEJitInfo->getClassModule(pResolvedToken->hClass)))
- {
- pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
- (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_CCTOR_TRIGGER | fAtypicalCallsite), pResolvedToken->hClass);
- }
- else
- {
- // READYTORUN: FUTURE: Cross-module static cctor triggers
- m_zapper->Warning(W("ReadyToRun: Cross-module static cctor triggers not supported\n"));
- ThrowHR(E_NOTIMPL);
- }
- break;
+ if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
+ return false; // Requires runtime lookup.
+ pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
+ (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_NEW_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
+ break;
- case CORINFO_HELP_READYTORUN_GENERIC_HANDLE:
- _ASSERTE(pGenericLookupKind != NULL && pGenericLookupKind->needsRuntimeLookup);
- if (pGenericLookupKind->runtimeLookupKind == CORINFO_LOOKUP_METHODPARAM)
- {
- pImport = m_pImage->GetImportTable()->GetDictionaryLookupCell(
- (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_DICTIONARY_LOOKUP_METHOD | fAtypicalCallsite), pResolvedToken, pGenericLookupKind);
- }
+ case CORINFO_HELP_READYTORUN_NEWARR_1:
+ if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
+ return false; // Requires runtime lookup.
+ pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
+ (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_NEW_ARRAY_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
+ break;
+
+ case CORINFO_HELP_READYTORUN_ISINSTANCEOF:
+ if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
+ return false; // Requires runtime lookup.
+ pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
+ (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_ISINSTANCEOF_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
+ break;
+
+ case CORINFO_HELP_READYTORUN_CHKCAST:
+ if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
+ return false; // Requires runtime lookup.
+ pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
+ (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_CHKCAST_HELPER | fAtypicalCallsite), pResolvedToken->hClass);
+ break;
+
+ case CORINFO_HELP_READYTORUN_STATIC_BASE:
+ if ((getClassAttribs(pResolvedToken->hClass) & CORINFO_FLG_SHAREDINST) != 0)
+ return false; // Requires runtime lookup.
+ if (m_pImage->GetCompileInfo()->IsInCurrentVersionBubble(m_pEEJitInfo->getClassModule(pResolvedToken->hClass)))
+ {
+ pImport = m_pImage->GetImportTable()->GetDynamicHelperCell(
+ (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_CCTOR_TRIGGER | fAtypicalCallsite), pResolvedToken->hClass);
+ }
+ else
+ {
+ // READYTORUN: FUTURE: Cross-module static cctor triggers
+ m_zapper->Warning(W("ReadyToRun: Cross-module static cctor triggers not supported\n"));
+ ThrowHR(E_NOTIMPL);
+ }
+ break;
+
+ case CORINFO_HELP_READYTORUN_GENERIC_HANDLE:
+ _ASSERTE(pGenericLookupKind != NULL && pGenericLookupKind->needsRuntimeLookup);
+ if (pGenericLookupKind->runtimeLookupKind == CORINFO_LOOKUP_METHODPARAM)
+ {
+ pImport = m_pImage->GetImportTable()->GetDictionaryLookupCell(
+ (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_DICTIONARY_LOOKUP_METHOD | fAtypicalCallsite), pResolvedToken, pGenericLookupKind);
+ }
else if (pGenericLookupKind->runtimeLookupKind == CORINFO_LOOKUP_THISOBJ)
{
pImport = m_pImage->GetImportTable()->GetDictionaryLookupCell(
(CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_DICTIONARY_LOOKUP_THISOBJ | fAtypicalCallsite), pResolvedToken, pGenericLookupKind);
}
- else
- {
- _ASSERTE(pGenericLookupKind->runtimeLookupKind == CORINFO_LOOKUP_CLASSPARAM);
- pImport = m_pImage->GetImportTable()->GetDictionaryLookupCell(
- (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_DICTIONARY_LOOKUP_TYPE | fAtypicalCallsite), pResolvedToken, pGenericLookupKind);
- }
- break;
+ else
+ {
+ _ASSERTE(pGenericLookupKind->runtimeLookupKind == CORINFO_LOOKUP_CLASSPARAM);
+ pImport = m_pImage->GetImportTable()->GetDictionaryLookupCell(
+ (CORCOMPILE_FIXUP_BLOB_KIND)(ENCODE_DICTIONARY_LOOKUP_TYPE | fAtypicalCallsite), pResolvedToken, pGenericLookupKind);
+ }
+ break;
- default:
- _ASSERTE(false);
- ThrowHR(E_NOTIMPL);
- }
+ default:
+ _ASSERTE(false);
+ ThrowHR(E_NOTIMPL);
+ }
- pLookup->accessType = IAT_PVALUE;
- pLookup->addr = pImport;
- return true;
+ pLookup->accessType = IAT_PVALUE;
+ pLookup->addr = pImport;
+ return true;
#else
- return false;
+ return false;
#endif
}
diff --git a/src/zap/zapinfo.h b/src/zap/zapinfo.h
index a79319e7a2..eadefe8555 100644
--- a/src/zap/zapinfo.h
+++ b/src/zap/zapinfo.h
@@ -550,7 +550,7 @@ public:
unsigned getClassNumInstanceFields(CORINFO_CLASS_HANDLE cls);
- CorInfoHelpFunc getNewHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_METHOD_HANDLE callerHandle);
+ CorInfoHelpFunc getNewHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, bool * pHasSideEffects = NULL);
CorInfoHelpFunc getCastingHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, bool fThrowing);
CorInfoHelpFunc getNewArrHelper(CORINFO_CLASS_HANDLE arrayCls);
CorInfoHelpFunc getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd);