summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorSujin Kim <sjsujin.kim@samsung.com>2017-09-13 09:55:55 +0900
committerJan Kotas <jkotas@microsoft.com>2017-09-12 17:55:55 -0700
commit5f6528fa6ff08c18de880d4c343164c031f89525 (patch)
tree0f9ae00597f5dcbe16b1556ea4ba44beead51136 /src/vm
parent1ac52ef489061d2ed870f6d1380336f079b71295 (diff)
downloadcoreclr-5f6528fa6ff08c18de880d4c343164c031f89525.tar.gz
coreclr-5f6528fa6ff08c18de880d4c343164c031f89525.tar.bz2
coreclr-5f6528fa6ff08c18de880d4c343164c031f89525.zip
[RyuJIT/ARM32] Implement CreateDictionaryLookupHelper only via helper (#13733)
* [RyuJIT/ARM32] Implement CreateDictionaryLookupHelper only via run-time helper Implement CreateDictionaryLookupHelper only via run-time helper * Add assertion for checking CORINFO_USEHELPER
Diffstat (limited to 'src/vm')
-rw-r--r--src/vm/arm/stubs.cpp33
-rw-r--r--src/vm/jitinterface.cpp3
-rw-r--r--src/vm/prestub.cpp4
3 files changed, 32 insertions, 8 deletions
diff --git a/src/vm/arm/stubs.cpp b/src/vm/arm/stubs.cpp
index 9b8d6afb29..4bc1b2c1ea 100644
--- a/src/vm/arm/stubs.cpp
+++ b/src/vm/arm/stubs.cpp
@@ -3604,10 +3604,8 @@ PCODE DynamicHelpers::CreateHelper(LoaderAllocator * pAllocator, TADDR arg, PCOD
END_DYNAMIC_HELPER_EMIT();
}
-PCODE DynamicHelpers::CreateHelperWithArg(LoaderAllocator * pAllocator, TADDR arg, PCODE target)
+void DynamicHelpers::EmitHelperWithArg(BYTE*& p, LoaderAllocator * pAllocator, TADDR arg, PCODE target)
{
- BEGIN_DYNAMIC_HELPER_EMIT(18);
-
// mov r1, arg
MovRegImm(p, 1, arg);
p += 8;
@@ -3619,6 +3617,13 @@ PCODE DynamicHelpers::CreateHelperWithArg(LoaderAllocator * pAllocator, TADDR ar
// bx r12
*(WORD *)p = 0x4760;
p += 2;
+}
+
+PCODE DynamicHelpers::CreateHelperWithArg(LoaderAllocator * pAllocator, TADDR arg, PCODE target)
+{
+ BEGIN_DYNAMIC_HELPER_EMIT(18);
+
+ EmitHelperWithArg(p, pAllocator, arg, target);
END_DYNAMIC_HELPER_EMIT();
}
@@ -3767,8 +3772,26 @@ PCODE DynamicHelpers::CreateDictionaryLookupHelper(LoaderAllocator * pAllocator,
{
STANDARD_VM_CONTRACT;
- // TODO (NYI)
- ThrowHR(E_NOTIMPL);
+ PCODE helperAddress = (pLookup->helper == CORINFO_HELP_RUNTIMEHANDLE_METHOD ?
+ GetEEFuncEntryPoint(JIT_GenericHandleMethodWithSlotAndModule) :
+ GetEEFuncEntryPoint(JIT_GenericHandleClassWithSlotAndModule));
+
+ GenericHandleArgs * pArgs = (GenericHandleArgs *)(void *)pAllocator->GetDynamicHelpersHeap()->AllocAlignedMem(sizeof(GenericHandleArgs), DYNAMIC_HELPER_ALIGNMENT);
+ pArgs->dictionaryIndexAndSlot = dictionaryIndexAndSlot;
+ pArgs->signature = pLookup->signature;
+ pArgs->module = (CORINFO_MODULE_HANDLE)pModule;
+
+ // It's available only via the run-time helper function,
+ // since optimization cases are not yet implemented.
+ assert(pLookup->indirections == CORINFO_USEHELPER);
+
+ BEGIN_DYNAMIC_HELPER_EMIT(18);
+
+ EmitHelperWithArg(p, pAllocator, (TADDR)pArgs, helperAddress);
+
+ END_DYNAMIC_HELPER_EMIT();
+
+ // @TODO : Additional implementation is required for optimization cases.
}
#endif // FEATURE_READYTORUN
diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp
index 4301873df8..aa1365ca3d 100644
--- a/src/vm/jitinterface.cpp
+++ b/src/vm/jitinterface.cpp
@@ -3132,9 +3132,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
#ifdef FEATURE_READYTORUN_COMPILER
if (IsReadyToRunCompilation())
{
-#if defined(_TARGET_ARM_)
- ThrowHR(E_NOTIMPL); /* TODO - NYI */
-#endif
pResultLookup->lookupKind.runtimeLookupArgs = NULL;
switch (entryKind)
diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp
index 0109316a01..f96135008d 100644
--- a/src/vm/prestub.cpp
+++ b/src/vm/prestub.cpp
@@ -2586,6 +2586,9 @@ void ProcessDynamicDictionaryLookup(TransitionBlock * pTransitionBlock
//
// Optimization cases
//
+ // TODO-ARM : If the optimization cases are implemented in CreateDictionaryLookupHelper,
+ // It's ifndef for ARM will be removed.
+#ifndef _TARGET_ARM_
if (signatureKind == ENCODE_TYPE_HANDLE)
{
SigPointer sigptr(pBlob, -1);
@@ -2628,6 +2631,7 @@ void ProcessDynamicDictionaryLookup(TransitionBlock * pTransitionBlock
return;
}
}
+#endif // !_TARGET_ARM_
if (pContextMT != NULL && pContextMT->GetNumDicts() > 0xFFFF)
ThrowHR(COR_E_BADIMAGEFORMAT);