diff options
author | Andy Ayers <andya@microsoft.com> | 2017-09-07 14:28:07 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-07 14:28:07 -0700 |
commit | b7cce5a59f7c6bd5a33b88f2af252693bbbd7373 (patch) | |
tree | 81d3ed8966aaa3df80e4b20d05ad0cedfbf14616 /src/vm | |
parent | f3dfbf546396db24f5fbc690213e89beaebd5f35 (diff) | |
download | coreclr-b7cce5a59f7c6bd5a33b88f2af252693bbbd7373.tar.gz coreclr-b7cce5a59f7c6bd5a33b88f2af252693bbbd7373.tar.bz2 coreclr-b7cce5a59f7c6bd5a33b88f2af252693bbbd7373.zip |
New jit intrinsic support (#13815)
Support for new-style intrinsics where corelib methods can have both IL
implementations and optional jit-supplied implementations.
Mark such methods with the [Intrinsic] attribute, then recognize the
intrinsic methods by name in the jit.
Jit currently has a placeholder for the Enum.HasFlag method.
Diffstat (limited to 'src/vm')
-rw-r--r-- | src/vm/classnames.h | 1 | ||||
-rw-r--r-- | src/vm/jitinterface.cpp | 44 | ||||
-rw-r--r-- | src/vm/jitinterface.h | 1 | ||||
-rw-r--r-- | src/vm/method.hpp | 16 | ||||
-rw-r--r-- | src/vm/methodtablebuilder.cpp | 14 |
5 files changed, 74 insertions, 2 deletions
diff --git a/src/vm/classnames.h b/src/vm/classnames.h index 0c24914a56..fc087372c8 100644 --- a/src/vm/classnames.h +++ b/src/vm/classnames.h @@ -145,6 +145,7 @@ #define g_CompilerServicesFixedAddressValueTypeAttribute "System.Runtime.CompilerServices.FixedAddressValueTypeAttribute" #define g_CompilerServicesUnsafeValueTypeAttribute "System.Runtime.CompilerServices.UnsafeValueTypeAttribute" +#define g_CompilerServicesIntrinsicAttribute "System.Runtime.CompilerServices.IntrinsicAttribute" #define g_UnmanagedFunctionPointerAttribute "System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute" #define g_DefaultDllImportSearchPathsAttribute "System.Runtime.InteropServices.DefaultDllImportSearchPathsAttribute" #define g_NativeCallableAttribute "System.Runtime.InteropServices.NativeCallableAttribute" diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 71af406d04..4301873df8 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -6460,6 +6460,48 @@ const char* CEEInfo::getMethodName (CORINFO_METHOD_HANDLE ftnHnd, const char** s return result; } +const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName) +{ + CONTRACTL { + SO_TOLERANT; + THROWS; + GC_TRIGGERS; + MODE_PREEMPTIVE; + } CONTRACTL_END; + + const char* result = NULL; + const char* classResult = NULL; + const char* namespaceResult = NULL; + + JIT_TO_EE_TRANSITION(); + + MethodDesc *ftn = GetMethod(ftnHnd); + mdMethodDef token = ftn->GetMemberDef(); + + if (!IsNilToken(token)) + { + if (!FAILED(ftn->GetMDImport()->GetNameOfMethodDef(token, &result))) + { + MethodTable* pMT = ftn->GetMethodTable(); + classResult = pMT->GetFullyQualifiedNameInfo(&namespaceResult); + } + } + + if (className != NULL) + { + *className = classResult; + } + + if (namespaceName != NULL) + { + *namespaceName = namespaceResult; + } + + EE_TO_JIT_TRANSITION(); + + return result; +} + /*********************************************************************/ DWORD CEEInfo::getMethodAttribs (CORINFO_METHOD_HANDLE ftn) { @@ -6514,6 +6556,8 @@ DWORD CEEInfo::getMethodAttribsInternal (CORINFO_METHOD_HANDLE ftn) result |= CORINFO_FLG_SYNCH; if (pMD->IsFCallOrIntrinsic()) result |= CORINFO_FLG_NOGCCHECK | CORINFO_FLG_INTRINSIC; + if (pMD->IsJitIntrinsic()) + result |= CORINFO_FLG_JIT_INTRINSIC; if (IsMdVirtual(attribs)) result |= CORINFO_FLG_VIRTUAL; if (IsMdAbstract(attribs)) diff --git a/src/vm/jitinterface.h b/src/vm/jitinterface.h index 141c812280..8ba65c3964 100644 --- a/src/vm/jitinterface.h +++ b/src/vm/jitinterface.h @@ -649,6 +649,7 @@ public: // ICorMethodInfo stuff const char* getMethodName (CORINFO_METHOD_HANDLE ftnHnd, const char** scopeName); + const char* getMethodNameFromMetadata (CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName); unsigned getMethodHash (CORINFO_METHOD_HANDLE ftnHnd); DWORD getMethodAttribs (CORINFO_METHOD_HANDLE ftnHnd); diff --git a/src/vm/method.hpp b/src/vm/method.hpp index 671fd82b7f..9a20af2212 100644 --- a/src/vm/method.hpp +++ b/src/vm/method.hpp @@ -704,7 +704,6 @@ public: InterlockedUpdateFlags(mdcNotInline, set); } - BOOL IsIntrospectionOnly(); #ifndef DACCESS_COMPILE VOID EnsureActive(); @@ -1690,7 +1689,8 @@ protected: enum_flag2_IsUnboxingStub = 0x04, enum_flag2_HasNativeCodeSlot = 0x08, // Has slot for native code - // unused = 0x10, + enum_flag2_IsJitIntrinsic = 0x10, // Jit may expand method as an intrinsic + // unused = 0x20, // unused = 0x40, // unused = 0x80, @@ -1743,6 +1743,18 @@ public: m_bFlags2 |= enum_flag2_HasNativeCodeSlot; } + inline BOOL IsJitIntrinsic() + { + LIMITED_METHOD_DAC_CONTRACT; + return (m_bFlags2 & enum_flag2_IsJitIntrinsic) != 0; + } + + inline void SetIsJitIntrinsic() + { + LIMITED_METHOD_CONTRACT; + m_bFlags2 |= enum_flag2_IsJitIntrinsic; + } + static const SIZE_T s_ClassificationSizeTable[]; static SIZE_T GetBaseSize(DWORD classification) diff --git a/src/vm/methodtablebuilder.cpp b/src/vm/methodtablebuilder.cpp index 4768807652..cdee2d8667 100644 --- a/src/vm/methodtablebuilder.cpp +++ b/src/vm/methodtablebuilder.cpp @@ -5082,6 +5082,20 @@ MethodTableBuilder::InitNewMethodDesc( pNewMD->SetNotInline(true); } + // Check for methods marked as [Intrinsic] + if (GetModule()->IsSystem()) + { + HRESULT hr = GetMDImport()->GetCustomAttributeByName(pMethod->GetMethodSignature().GetToken(), + g_CompilerServicesIntrinsicAttribute, + NULL, + NULL); + + if (hr == S_OK) + { + pNewMD->SetIsJitIntrinsic(); + } + } + pNewMD->SetSlot(pMethod->GetSlotIndex()); } |