diff options
author | Rahul Kumar <rahku@microsoft.com> | 2017-04-12 22:33:40 -0700 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-04-12 22:33:40 -0700 |
commit | 4a2298203489a9b77ebe8e5c9116de35eb62c3ca (patch) | |
tree | 1a3c488930739410b2c8d50396bc953b1ed186bf /src/vm | |
parent | 402cea75d76b210e7f061d0587d46daa27062e01 (diff) | |
download | coreclr-4a2298203489a9b77ebe8e5c9116de35eb62c3ca.tar.gz coreclr-4a2298203489a9b77ebe8e5c9116de35eb62c3ca.tar.bz2 coreclr-4a2298203489a9b77ebe8e5c9116de35eb62c3ca.zip |
Add platform (x64 & arm64) specific optimized jit helpers for statics access (#10912)
Diffstat (limited to 'src/vm')
-rw-r--r-- | src/vm/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/vm/amd64/JitHelpers_SingleAppDomain.asm | 64 | ||||
-rw-r--r-- | src/vm/amd64/jithelpers_singleappdomain.S | 49 | ||||
-rw-r--r-- | src/vm/arm64/asmconstants.h | 6 | ||||
-rw-r--r-- | src/vm/arm64/asmhelpers.S | 57 | ||||
-rw-r--r-- | src/vm/arm64/asmhelpers.asm | 60 | ||||
-rw-r--r-- | src/vm/arm64/stubs.cpp | 15 | ||||
-rw-r--r-- | src/vm/jitinterfacegen.cpp | 15 |
8 files changed, 267 insertions, 1 deletions
diff --git a/src/vm/CMakeLists.txt b/src/vm/CMakeLists.txt index 26fcacf4af..da1aa8fe62 100644 --- a/src/vm/CMakeLists.txt +++ b/src/vm/CMakeLists.txt @@ -317,6 +317,7 @@ if(CLR_CMAKE_TARGET_ARCH_AMD64) ${ARCH_SOURCES_DIR}/JitHelpers_FastWriteBarriers.asm ${ARCH_SOURCES_DIR}/JitHelpers_InlineGetAppDomain.asm ${ARCH_SOURCES_DIR}/JitHelpers_InlineGetThread.asm + ${ARCH_SOURCES_DIR}/JitHelpers_SingleAppDomain.asm ${ARCH_SOURCES_DIR}/JitHelpers_Slow.asm ${ARCH_SOURCES_DIR}/PInvokeStubs.asm ${ARCH_SOURCES_DIR}/RedirectedHandledJITCase.asm @@ -363,6 +364,7 @@ else(WIN32) ${ARCH_SOURCES_DIR}/getstate.S ${ARCH_SOURCES_DIR}/jithelpers_fast.S ${ARCH_SOURCES_DIR}/jithelpers_fastwritebarriers.S + ${ARCH_SOURCES_DIR}/jithelpers_singleappdomain.S ${ARCH_SOURCES_DIR}/jithelpers_slow.S ${ARCH_SOURCES_DIR}/pinvokestubs.S ${ARCH_SOURCES_DIR}/theprestubamd64.S diff --git a/src/vm/amd64/JitHelpers_SingleAppDomain.asm b/src/vm/amd64/JitHelpers_SingleAppDomain.asm new file mode 100644 index 0000000000..f1b267435a --- /dev/null +++ b/src/vm/amd64/JitHelpers_SingleAppDomain.asm @@ -0,0 +1,64 @@ +; Licensed to the .NET Foundation under one or more agreements. +; The .NET Foundation licenses this file to you under the MIT license. +; See the LICENSE file in the project root for more information. + +; ==++== +; + +; +; ==--== +; *********************************************************************** +; File: JitHelpers_SingleAppDomain.asm +; +; Notes: JIT Static access helpers when coreclr host specifies single +; appdomain flag +; *********************************************************************** + +include AsmMacros.inc +include asmconstants.inc + +; Min amount of stack space that a nested function should allocate. +MIN_SIZE equ 28h + +extern JIT_GetSharedNonGCStaticBase_Helper:proc +extern JIT_GetSharedGCStaticBase_Helper:proc + +LEAF_ENTRY JIT_GetSharedNonGCStaticBase_SingleAppDomain, _TEXT + ; If class is not initialized, bail to C++ helper + test byte ptr [rcx + OFFSETOF__DomainLocalModule__m_pDataBlob + rdx], 1 + jz CallHelper + mov rax, rcx + REPRET + + align 16 + CallHelper: + ; Tail call JIT_GetSharedNonGCStaticBase_Helper + jmp JIT_GetSharedNonGCStaticBase_Helper +LEAF_END JIT_GetSharedNonGCStaticBase_SingleAppDomain, _TEXT + +LEAF_ENTRY JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain, _TEXT + mov rax, rcx + ret +LEAF_END JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain, _TEXT + +LEAF_ENTRY JIT_GetSharedGCStaticBase_SingleAppDomain, _TEXT + ; If class is not initialized, bail to C++ helper + test byte ptr [rcx + OFFSETOF__DomainLocalModule__m_pDataBlob + rdx], 1 + jz CallHelper + + mov rax, [rcx + OFFSETOF__DomainLocalModule__m_pGCStatics] + REPRET + + align 16 + CallHelper: + ; Tail call Jit_GetSharedGCStaticBase_Helper + jmp JIT_GetSharedGCStaticBase_Helper +LEAF_END JIT_GetSharedGCStaticBase_SingleAppDomain, _TEXT + +LEAF_ENTRY JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain, _TEXT + mov rax, [rcx + OFFSETOF__DomainLocalModule__m_pGCStatics] + ret +LEAF_END JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain, _TEXT + + end + diff --git a/src/vm/amd64/jithelpers_singleappdomain.S b/src/vm/amd64/jithelpers_singleappdomain.S new file mode 100644 index 0000000000..307d86b7fe --- /dev/null +++ b/src/vm/amd64/jithelpers_singleappdomain.S @@ -0,0 +1,49 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +.intel_syntax noprefix +#include "unixasmmacros.inc" +#include "asmconstants.h" + +// +// JIT Static access helpers when coreclr host specifies single +// appdomain flag +// + +LEAF_ENTRY JIT_GetSharedNonGCStaticBase_SingleAppDomain, _TEXT + // If class is not initialized, bail to C++ helper + test byte ptr [rdi + OFFSETOF__DomainLocalModule__m_pDataBlob + rsi], 1 + jz CallHelper + mov rax, rdi + rep ret + +.balign 16 +CallHelper: + // Tail call JIT_GetSharedNonGCStaticBase_Helper + jmp C_FUNC(JIT_GetSharedNonGCStaticBase_Helper) +LEAF_END_MARKED JIT_GetSharedNonGCStaticBase_SingleAppDomain, _TEXT + +LEAF_ENTRY JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain, _TEXT + mov rax, rdi + ret +LEAF_END JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain, _TEXT + +LEAF_ENTRY JIT_GetSharedGCStaticBase_SingleAppDomain, _TEXT + // If class is not initialized, bail to C++ helper + test byte ptr [rdi + OFFSETOF__DomainLocalModule__m_pDataBlob + rsi], 1 + jz CallHelper1 + + mov rax, [rdi + OFFSETOF__DomainLocalModule__m_pGCStatics] + rep ret + +.balign 16 +CallHelper1: + // Tail call Jit_GetSharedGCStaticBase_Helper + jmp C_FUNC(JIT_GetSharedGCStaticBase_Helper) +LEAF_END JIT_GetSharedGCStaticBase_SingleAppDomain, _TEXT + +LEAF_ENTRY JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain, _TEXT + mov rax, [rdi + OFFSETOF__DomainLocalModule__m_pGCStatics] + ret +LEAF_END JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain, _TEXT diff --git a/src/vm/arm64/asmconstants.h b/src/vm/arm64/asmconstants.h index b0300ca324..12b72f9249 100644 --- a/src/vm/arm64/asmconstants.h +++ b/src/vm/arm64/asmconstants.h @@ -167,5 +167,11 @@ ASMCONSTANTS_C_ASSERT(ResolveCacheElem__target == offsetof(ResolveCacheElem, tar ASMCONSTANTS_C_ASSERT(ResolveCacheElem__pNext == offsetof(ResolveCacheElem, pNext)); #endif // CROSSGEN_COMPILE +#define DomainLocalModule__m_pDataBlob 0x30 +#define DomainLocalModule__m_pGCStatics 0x20 +ASMCONSTANTS_C_ASSERT(DomainLocalModule__m_pDataBlob == offsetof(DomainLocalModule, m_pDataBlob)); +ASMCONSTANTS_C_ASSERT(DomainLocalModule__m_pGCStatics == offsetof(DomainLocalModule, m_pGCStatics)); + + #undef ASMCONSTANTS_RUNTIME_ASSERT #undef ASMCONSTANTS_C_ASSERT diff --git a/src/vm/arm64/asmhelpers.S b/src/vm/arm64/asmhelpers.S index ef6b5cfffe..5bf6b5dc96 100644 --- a/src/vm/arm64/asmhelpers.S +++ b/src/vm/arm64/asmhelpers.S @@ -1212,3 +1212,60 @@ NESTED_END StubDispatchFixupStub, _TEXT fmov d0, x1 LEAF_END #endif + +// +// JIT Static access helpers when coreclr host specifies single appdomain flag +// + +// ------------------------------------------------------------------ +// void* JIT_GetSharedNonGCStaticBase(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedNonGCStaticBase_SingleAppDomain + // If class is not initialized, bail to C++ helper + add x2, x0, #DomainLocalModule__m_pDataBlob + ldrb w2, [x2, w1] + tst w2, #1 + beq LOCAL_LABEL(CallHelper) + + ret lr + +LOCAL_LABEL(CallHelper): + // Tail call JIT_GetSharedNonGCStaticBase_Helper + b C_FUNC(JIT_GetSharedNonGCStaticBase_Helper) + LEAF_END + + +// ------------------------------------------------------------------ +// void* JIT_GetSharedNonGCStaticBaseNoCtor(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain + ret lr + LEAF_END + + +// ------------------------------------------------------------------ +// void* JIT_GetSharedGCStaticBase(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedGCStaticBase_SingleAppDomain + // If class is not initialized, bail to C++ helper + add x2, x0, #DomainLocalModule__m_pDataBlob + ldrb w2, [x2, w1] + tst w2, #1 + beq LOCAL_LABEL(CallHelper) + + ldr x0, [x0, #DomainLocalModule__m_pGCStatics] + ret lr + +LOCAL_LABEL(CallHelper): + // Tail call Jit_GetSharedGCStaticBase_Helper + b C_FUNC(JIT_GetSharedGCStaticBase_Helper) + LEAF_END + + +// ------------------------------------------------------------------ +// void* JIT_GetSharedGCStaticBaseNoCtor(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain + ldr x0, [x0, #DomainLocalModule__m_pGCStatics] + ret lr + LEAF_END diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm index e8b16ded6a..24b26eb1c9 100644 --- a/src/vm/arm64/asmhelpers.asm +++ b/src/vm/arm64/asmhelpers.asm @@ -52,6 +52,9 @@ IMPORT $g_GCShadowEnd #endif // WRITE_BARRIER_CHECK + IMPORT JIT_GetSharedNonGCStaticBase_Helper + IMPORT JIT_GetSharedGCStaticBase_Helper + TEXTAREA ;; LPVOID __stdcall GetCurrentIP(void); @@ -1326,5 +1329,62 @@ Fail LEAF_END #endif +; +; JIT Static access helpers when coreclr host specifies single appdomain flag +; + +; ------------------------------------------------------------------ +; void* JIT_GetSharedNonGCStaticBase(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedNonGCStaticBase_SingleAppDomain + ; If class is not initialized, bail to C++ helper + add x2, x0, #DomainLocalModule__m_pDataBlob + ldrb w2, [x2, w1] + tst w2, #1 + beq CallHelper1 + + ret lr + +CallHelper1 + ; Tail call JIT_GetSharedNonGCStaticBase_Helper + b JIT_GetSharedNonGCStaticBase_Helper + LEAF_END + + +; ------------------------------------------------------------------ +; void* JIT_GetSharedNonGCStaticBaseNoCtor(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain + ret lr + LEAF_END + + +; ------------------------------------------------------------------ +; void* JIT_GetSharedGCStaticBase(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedGCStaticBase_SingleAppDomain + ; If class is not initialized, bail to C++ helper + add x2, x0, #DomainLocalModule__m_pDataBlob + ldrb w2, [x2, w1] + tst w2, #1 + beq CallHelper2 + + ldr x0, [x0, #DomainLocalModule__m_pGCStatics] + ret lr + +CallHelper2 + ; Tail call Jit_GetSharedGCStaticBase_Helper + b JIT_GetSharedGCStaticBase_Helper + LEAF_END + + +; ------------------------------------------------------------------ +; void* JIT_GetSharedGCStaticBaseNoCtor(SIZE_T moduleDomainID, DWORD dwClassDomainID) + + LEAF_ENTRY JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain + ldr x0, [x0, #DomainLocalModule__m_pGCStatics] + ret lr + LEAF_END + ; Must be at very end of file END diff --git a/src/vm/arm64/stubs.cpp b/src/vm/arm64/stubs.cpp index f56f6ab625..0c7eb4dfba 100644 --- a/src/vm/arm64/stubs.cpp +++ b/src/vm/arm64/stubs.cpp @@ -15,6 +15,11 @@ #include "virtualcallstub.h" #include "jitinterface.h" +EXTERN_C void JIT_GetSharedNonGCStaticBase_SingleAppDomain(); +EXTERN_C void JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain(); +EXTERN_C void JIT_GetSharedGCStaticBase_SingleAppDomain(); +EXTERN_C void JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain(); + #ifndef DACCESS_COMPILE //----------------------------------------------------------------------- // InstructionFormat for B.cond @@ -1078,10 +1083,18 @@ void JIT_TailCall() _ASSERTE(!"ARM64:NYI"); } +#if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) void InitJITHelpers1() { - return; + if(IsSingleAppDomain()) + { + SetJitHelperFunction(CORINFO_HELP_GETSHARED_GCSTATIC_BASE, JIT_GetSharedGCStaticBase_SingleAppDomain); + SetJitHelperFunction(CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE, JIT_GetSharedNonGCStaticBase_SingleAppDomain); + SetJitHelperFunction(CORINFO_HELP_GETSHARED_GCSTATIC_BASE_NOCTOR, JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain); + SetJitHelperFunction(CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR,JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain); + } } +#endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) EXTERN_C void __stdcall ProfileEnterNaked(UINT_PTR clientData) { diff --git a/src/vm/jitinterfacegen.cpp b/src/vm/jitinterfacegen.cpp index ce4c1e90e3..8d1c8cdf67 100644 --- a/src/vm/jitinterfacegen.cpp +++ b/src/vm/jitinterfacegen.cpp @@ -61,6 +61,11 @@ extern "C" void* JIT_GetSharedNonGCStaticBaseNoCtor_Slow(SIZE_T moduleDomainID, extern "C" void* JIT_GetSharedGCStaticBase_Slow(SIZE_T moduleDomainID, DWORD dwModuleClassID); extern "C" void* JIT_GetSharedGCStaticBaseNoCtor_Slow(SIZE_T moduleDomainID, DWORD dwModuleClassID); +extern "C" void* JIT_GetSharedNonGCStaticBase_SingleAppDomain(SIZE_T moduleDomainID, DWORD dwModuleClassID); +extern "C" void* JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain(SIZE_T moduleDomainID, DWORD dwModuleClassID); +extern "C" void* JIT_GetSharedGCStaticBase_SingleAppDomain(SIZE_T moduleDomainID, DWORD dwModuleClassID); +extern "C" void* JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain(SIZE_T moduleDomainID, DWORD dwModuleClassID); + #ifdef _TARGET_AMD64_ extern WriteBarrierManager g_WriteBarrierManager; #endif // _TARGET_AMD64_ @@ -283,7 +288,17 @@ void InitJITHelpers1() SetJitHelperFunction(CORINFO_HELP_MON_ENTER_STATIC, JIT_MonEnterStatic_Slow); SetJitHelperFunction(CORINFO_HELP_MON_EXIT_STATIC, JIT_MonExitStatic_Slow); } +#endif + if(IsSingleAppDomain()) + { + SetJitHelperFunction(CORINFO_HELP_GETSHARED_GCSTATIC_BASE, JIT_GetSharedGCStaticBase_SingleAppDomain); + SetJitHelperFunction(CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE, JIT_GetSharedNonGCStaticBase_SingleAppDomain); + SetJitHelperFunction(CORINFO_HELP_GETSHARED_GCSTATIC_BASE_NOCTOR, JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain); + SetJitHelperFunction(CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR,JIT_GetSharedNonGCStaticBaseNoCtor_SingleAppDomain); + } +#ifndef FEATURE_IMPLICIT_TLS + else if (gAppDomainTLSIndex >= TLS_MINIMUM_AVAILABLE) { SetJitHelperFunction(CORINFO_HELP_GETSHARED_GCSTATIC_BASE, JIT_GetSharedGCStaticBase_Slow); |