summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorAndy Ayers <andya@microsoft.com>2017-09-07 14:28:07 -0700
committerGitHub <noreply@github.com>2017-09-07 14:28:07 -0700
commitb7cce5a59f7c6bd5a33b88f2af252693bbbd7373 (patch)
tree81d3ed8966aaa3df80e4b20d05ad0cedfbf14616 /src/vm
parentf3dfbf546396db24f5fbc690213e89beaebd5f35 (diff)
downloadcoreclr-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.h1
-rw-r--r--src/vm/jitinterface.cpp44
-rw-r--r--src/vm/jitinterface.h1
-rw-r--r--src/vm/method.hpp16
-rw-r--r--src/vm/methodtablebuilder.cpp14
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());
}