diff options
author | Jan Kotas <jkotas@microsoft.com> | 2018-12-10 07:52:15 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-10 07:52:15 -0800 |
commit | 32d8dfb65f2403c1cb628495ee944a9f35a0eb3a (patch) | |
tree | 5679964c2d10f3702a0a14bf64cce64e391d6da6 /src | |
parent | c1c74f6ff2a12bd33240ea514dca76fc100125b9 (diff) | |
download | coreclr-32d8dfb65f2403c1cb628495ee944a9f35a0eb3a.tar.gz coreclr-32d8dfb65f2403c1cb628495ee944a9f35a0eb3a.tar.bz2 coreclr-32d8dfb65f2403c1cb628495ee944a9f35a0eb3a.zip |
Add support for RVA fields to crossgen/R2R (#21463)
* Add support for RVA fields to crossgen/R2R
RVA fields are became more common with pre-inititialized ReadOnlySpan<byte>. Fix crossgen to deal with them for R2R.
* Fix tests, map new JIT helper for R2R
Diffstat (limited to 'src')
-rw-r--r-- | src/vm/jitinterface.cpp | 30 | ||||
-rw-r--r-- | src/zap/zapinfo.cpp | 19 |
2 files changed, 45 insertions, 4 deletions
diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 63b407c488..7fcdd62d05 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -13964,11 +13964,35 @@ InfoAccessType CEEInfo::emptyStringLiteral(void ** ppValue) void* CEEInfo::getFieldAddress(CORINFO_FIELD_HANDLE fieldHnd, void **ppIndirection) { - LIMITED_METHOD_CONTRACT; - _ASSERTE(isVerifyOnly()); + CONTRACTL{ + SO_TOLERANT; + THROWS; + GC_TRIGGERS; + MODE_PREEMPTIVE; + } CONTRACTL_END; + + void *result = NULL; + if (ppIndirection != NULL) *ppIndirection = NULL; - return (void *)0x10; + + // Do not bother with initialization if we are only verifying the method. + if (isVerifyOnly()) + { + return (void *)0x10; + } + + JIT_TO_EE_TRANSITION(); + + FieldDesc* field = (FieldDesc*)fieldHnd; + + _ASSERTE(field->IsRVA()); + + result = field->GetStaticAddressHandle(NULL); + + EE_TO_JIT_TRANSITION(); + + return result; } CORINFO_CLASS_HANDLE CEEInfo::getStaticFieldCurrentClass(CORINFO_FIELD_HANDLE fieldHnd, diff --git a/src/zap/zapinfo.cpp b/src/zap/zapinfo.cpp index 7c0200b9c1..a37531c735 100644 --- a/src/zap/zapinfo.cpp +++ b/src/zap/zapinfo.cpp @@ -1715,6 +1715,9 @@ ReadyToRunHelper MapReadyToRunHelper(CorInfoHelpFunc func, bool * pfOptimizeForS case corInfoHelpFunc: flags return readyToRunHelper; #include "readytorunhelpers.h" + case CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPEHANDLE: + return READYTORUN_HELPER_GetRuntimeTypeHandle; + case CORINFO_HELP_STRCNS_CURRENT_MODULE: *pfOptimizeForSize = true; return READYTORUN_HELPER_GetString; @@ -2319,6 +2322,13 @@ unsigned ZapInfo::getClassDomainID (CORINFO_CLASS_HANDLE cls, void **ppIndirecti void * ZapInfo::getFieldAddress(CORINFO_FIELD_HANDLE field, void **ppIndirection) { + if (IsReadyToRunCompilation()) + { + void * pAddress = m_pEEJitInfo->getFieldAddress(field, ppIndirection); + + return m_pImage->m_pILMetaData->GetRVAField(pAddress); + } + _ASSERTE(ppIndirection != NULL); CORINFO_CLASS_HANDLE hClass = m_pEEJitInfo->getFieldClass(field); @@ -3005,8 +3015,15 @@ void ZapInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, } break; - case CORINFO_FIELD_STATIC_ADDRESS: // field at given address case CORINFO_FIELD_STATIC_RVA_ADDRESS: // RVA field at given address + if (m_pEEJitInfo->getClassModule(pResolvedToken->hClass) != m_pImage->m_hModule) + { + m_zapper->Warning(W("ReadyToRun: Cross-module RVA static fields not supported\n")); + ThrowHR(E_NOTIMPL); + } + break; + + case CORINFO_FIELD_STATIC_ADDRESS: // field at given address case CORINFO_FIELD_STATIC_ADDR_HELPER: // static field accessed using address-of helper (argument is FieldDesc *) case CORINFO_FIELD_STATIC_TLS: m_zapper->Warning(W("ReadyToRun: Rare kinds of static fields not supported\n")); |