summaryrefslogtreecommitdiff
path: root/src/zap
diff options
context:
space:
mode:
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>2018-11-19 09:23:22 +0100
committerGitHub <noreply@github.com>2018-11-19 09:23:22 +0100
commit497419bf8f19c649d821295da7e225e55581cce9 (patch)
tree5f2813fefef41417a102627277db2fb01b76d7d3 /src/zap
parentd76d97ffc9ba23e6eec30536c6f07756e08151f2 (diff)
downloadcoreclr-497419bf8f19c649d821295da7e225e55581cce9.tar.gz
coreclr-497419bf8f19c649d821295da7e225e55581cce9.tar.bz2
coreclr-497419bf8f19c649d821295da7e225e55581cce9.zip
Make type comparisons more general purpose (#20940)
This has two parts: ## Part 1 CoreRT represents native type handles differently from CoreCLR - on CoreCLR, `RuntimeTypeHandle` is a wrapper over `RuntimeType` and RyuJIT is aware of that. On CoreRT, `RuntimeTypeHandle` wraps the native type handle, not a `RuntimeType`. The knowledge is hardcoded in importer when importing the sequence "ldtoken foo / call Type.GetTypeFromHandle" - importer just removes the call and bashes the result of ldtoken to be a reference type. CoreRT had to avoid reporting `Type.GetTypeFromHandle` as an intrinsic because of that. I'm adding another helper that lets RyuJIT avoid hardcoding that knowledge. Instead of just bashing the return type, we swap the helper call. ## Part 2 Native type handle equality checks need to go through a helper, unless the EE side says it's okay to compare native type handles directly.
Diffstat (limited to 'src/zap')
-rw-r--r--src/zap/zapinfo.cpp5
-rw-r--r--src/zap/zapinfo.h1
2 files changed, 6 insertions, 0 deletions
diff --git a/src/zap/zapinfo.cpp b/src/zap/zapinfo.cpp
index e0acd819c9..b94809f45e 100644
--- a/src/zap/zapinfo.cpp
+++ b/src/zap/zapinfo.cpp
@@ -3073,6 +3073,11 @@ BOOL ZapInfo::isValueClass(CORINFO_CLASS_HANDLE cls)
return m_pEEJitInfo->isValueClass(cls);
}
+CorInfoInlineTypeCheck ZapInfo::canInlineTypeCheck (CORINFO_CLASS_HANDLE cls, CorInfoInlineTypeCheckSource source)
+{
+ return m_pEEJitInfo->canInlineTypeCheck(cls, source);
+}
+
BOOL ZapInfo::canInlineTypeCheckWithObjectVTable (CORINFO_CLASS_HANDLE cls)
{
return m_pEEJitInfo->canInlineTypeCheckWithObjectVTable(cls);
diff --git a/src/zap/zapinfo.h b/src/zap/zapinfo.h
index ded4d53923..0e4a84eb4c 100644
--- a/src/zap/zapinfo.h
+++ b/src/zap/zapinfo.h
@@ -521,6 +521,7 @@ public:
BOOL fFullInst,
BOOL fAssembly);
BOOL isValueClass(CORINFO_CLASS_HANDLE clsHnd);
+ CorInfoInlineTypeCheck canInlineTypeCheck(CORINFO_CLASS_HANDLE cls, CorInfoInlineTypeCheckSource source);
BOOL canInlineTypeCheckWithObjectVTable(CORINFO_CLASS_HANDLE clsHnd);
DWORD getClassAttribs(CORINFO_CLASS_HANDLE cls);
BOOL isStructRequiringStackAllocRetBuf(CORINFO_CLASS_HANDLE cls);