Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 508b1bd

Browse files
committed
Incorporate Jan's feedback, SPMI parts, new GUID
1 parent 203a8b4 commit 508b1bd

File tree

10 files changed

+164
-20
lines changed

10 files changed

+164
-20
lines changed

src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,14 @@ BOOL canCast(CORINFO_CLASS_HANDLE child, // subtype (extends parent)
428428
// TRUE if cls1 and cls2 are considered equivalent types.
429429
BOOL areTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
430430

431+
// See if a cast from fromClass to toClass will succeed, fail, or needs
432+
// to be resolved at runtime.
433+
TypeCompareState compareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass);
434+
435+
// See if types represented by cls1 and cls2 compare equal, not
436+
// equal, or the comparison needs to be resolved at runtime.
437+
TypeCompareState compareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
438+
431439
// returns is the intersection of cls1 and cls2.
432440
CORINFO_CLASS_HANDLE mergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
433441

src/ToolBox/superpmi/superpmi-shared/lwmlist.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ LWM(CanInlineTypeCheckWithObjectVTable, DWORDLONG, DWORD)
3131
LWM(CanSkipMethodVerification, DLD, DWORD)
3232
LWM(CanTailCall, Agnostic_CanTailCall, DWORD)
3333
LWM(CheckMethodModifier, Agnostic_CheckMethodModifier, DWORD)
34+
LWM(CompareTypesForCast, DLDL, DWORD)
35+
LWM(CompareTypesForEquality, DLDL, DWORD)
3436
LWM(CompileMethod, DWORD, Agnostic_CompileMethod)
3537
LWM(ConstructStringLiteral, DLD, DLD)
3638
LWM(EmbedClassHandle, DWORDLONG, DLDL)

src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5288,6 +5288,72 @@ BOOL MethodContext::repAreTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLA
52885288
return value;
52895289
}
52905290

5291+
void MethodContext::recCompareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass, TypeCompareState result)
5292+
{
5293+
if (CompareTypesForCast == nullptr)
5294+
CompareTypesForCast = new LightWeightMap<DLDL, DWORD>();
5295+
5296+
DLDL key;
5297+
ZeroMemory(&key, sizeof(DLDL)); // We use the input structs as a key and use memcmp to compare.. so we need to zero
5298+
// out padding too
5299+
5300+
key.A = (DWORDLONG)fromClass;
5301+
key.B = (DWORDLONG)toClass;
5302+
5303+
CompareTypesForCast->Add(key, (DWORD)result);
5304+
}
5305+
void MethodContext::dmpCompareTypesForCast(DLDL key, DWORD value)
5306+
{
5307+
printf("CompareTypesForCast key fromClas=%016llX, toClass=%016llx, result=%d", key.A, key.B, value);
5308+
}
5309+
TypeCompareState MethodContext::repCompareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass)
5310+
{
5311+
DLDL key;
5312+
ZeroMemory(&key, sizeof(DLDL)); // We use the input structs as a key and use memcmp to compare.. so we need to zero
5313+
// out padding too
5314+
5315+
key.A = (DWORDLONG)fromClass;
5316+
key.B = (DWORDLONG)toClass;
5317+
5318+
AssertCodeMsg(CompareTypesForCast->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find %016llX %016llX",
5319+
(DWORDLONG)fromClass, (DWORDLONG)toClass);
5320+
TypeCompareState value = (TypeCompareState)CompareTypesForCast->Get(key);
5321+
return value;
5322+
}
5323+
5324+
void MethodContext::recCompareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2, TypeCompareState result)
5325+
{
5326+
if (CompareTypesForEquality == nullptr)
5327+
CompareTypesForEquality = new LightWeightMap<DLDL, DWORD>();
5328+
5329+
DLDL key;
5330+
ZeroMemory(&key, sizeof(DLDL)); // We use the input structs as a key and use memcmp to compare.. so we need to zero
5331+
// out padding too
5332+
5333+
key.A = (DWORDLONG)cls1;
5334+
key.B = (DWORDLONG)cls2;
5335+
5336+
CompareTypesForEquality->Add(key, (DWORD)result);
5337+
}
5338+
void MethodContext::dmpCompareTypesForEquality(DLDL key, DWORD value)
5339+
{
5340+
printf("CompareTypesForEquality key cls1=%016llX, cls2=%016llx, result=%d", key.A, key.B, value);
5341+
}
5342+
TypeCompareState MethodContext::repCompareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
5343+
{
5344+
DLDL key;
5345+
ZeroMemory(&key, sizeof(DLDL)); // We use the input structs as a key and use memcmp to compare.. so we need to zero
5346+
// out padding too
5347+
5348+
key.A = (DWORDLONG)cls1;
5349+
key.B = (DWORDLONG)cls2;
5350+
5351+
AssertCodeMsg(CompareTypesForEquality->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find %016llX %016llX",
5352+
(DWORDLONG)cls1, (DWORDLONG)cls2);
5353+
TypeCompareState value = (TypeCompareState)CompareTypesForEquality->Get(key);
5354+
return value;
5355+
}
5356+
52915357
void MethodContext::recFindNameOfToken(
52925358
CORINFO_MODULE_HANDLE module, mdToken metaTOK, char* szFQName, size_t FQNameCapacity, size_t result)
52935359
{

src/ToolBox/superpmi/superpmi-shared/methodcontext.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,14 @@ class MethodContext
11761176
void dmpAreTypesEquivalent(DLDL key, DWORD value);
11771177
BOOL repAreTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
11781178

1179+
void recCompareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass, TypeCompareState result);
1180+
void dmpCompareTypesForCast(DLDL key, DWORD value);
1181+
TypeCompareState repCompareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass);
1182+
1183+
void recCompareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2, TypeCompareState result);
1184+
void dmpCompareTypesForEquality(DLDL key, DWORD value);
1185+
TypeCompareState repCompareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
1186+
11791187
void recFindNameOfToken(
11801188
CORINFO_MODULE_HANDLE module, mdToken metaTOK, char* szFQName, size_t FQNameCapacity, size_t result);
11811189
void dmpFindNameOfToken(DLD key, DLD value);
@@ -1257,7 +1265,7 @@ class MethodContext
12571265
};
12581266

12591267
// ********************* Please keep this up-to-date to ease adding more ***************
1260-
// Highest packet number: 162
1268+
// Highest packet number: 164
12611269
// *************************************************************************************
12621270
enum mcPackets
12631271
{
@@ -1279,6 +1287,8 @@ enum mcPackets
12791287
Packet_CheckMethodModifier = 142, // retired as 13 on 2013/07/04
12801288
Retired3 = 14,
12811289
Retired5 = 141, // retired as 14 on 2013/07/03
1290+
Packet_CompareTypesForCast = 163, // Added 10/4/17
1291+
Packet_CompareTypesForEquality = 164, // Added 10/4/17
12821292
Packet_CompileMethod = 143, // retired as 141 on 2013/07/09
12831293
Packet_ConstructStringLiteral = 15,
12841294
Packet_EmbedClassHandle = 16,

src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,26 @@ BOOL interceptor_ICJI::areTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLA
889889
return temp;
890890
}
891891

892+
// See if a cast from fromClass to toClass will succeed, fail, or needs
893+
// to be resolved at runtime.
894+
TypeCompareState interceptor_ICJI::compareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass)
895+
{
896+
mc->cr->AddCall("compareTypesForCast");
897+
TypeCompareState temp = original_ICorJitInfo->compareTypesForCast(fromClass, toClass);
898+
mc->recCompareTypesForCast(fromClass, toClass, temp);
899+
return temp;
900+
}
901+
902+
// See if types represented by cls1 and cls2 compare equal, not
903+
// equal, or the comparison needs to be resolved at runtime.
904+
TypeCompareState interceptor_ICJI::compareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
905+
{
906+
mc->cr->AddCall("compareTypesForEquality");
907+
TypeCompareState temp = original_ICorJitInfo->compareTypesForEquality(cls1, cls2);
908+
mc->recCompareTypesForEquality(cls1, cls2, temp);
909+
return temp;
910+
}
911+
892912
// returns is the intersection of cls1 and cls2.
893913
CORINFO_CLASS_HANDLE interceptor_ICJI::mergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
894914
{

src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,22 @@ BOOL interceptor_ICJI::areTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLA
703703
return original_ICorJitInfo->areTypesEquivalent(cls1, cls2);
704704
}
705705

706+
// See if a cast from fromClass to toClass will succeed, fail, or needs
707+
// to be resolved at runtime.
708+
TypeCompareState interceptor_ICJI::compareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass)
709+
{
710+
mcs->AddCall("compareTypesForCast");
711+
return original_ICorJitInfo->compareTypesForCast(fromClass, toClass);
712+
}
713+
714+
// See if types represented by cls1 and cls2 compare equal, not
715+
// equal, or the comparison needs to be resolved at runtime.
716+
TypeCompareState interceptor_ICJI::compareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
717+
{
718+
mcs->AddCall("compareTypesForEquality");
719+
return original_ICorJitInfo->compareTypesForEquality(cls1, cls2);
720+
}
721+
706722
// returns is the intersection of cls1 and cls2.
707723
CORINFO_CLASS_HANDLE interceptor_ICJI::mergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
708724
{

src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,20 @@ BOOL interceptor_ICJI::areTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLA
629629
return original_ICorJitInfo->areTypesEquivalent(cls1, cls2);
630630
}
631631

632+
// See if a cast from fromClass to toClass will succeed, fail, or needs
633+
// to be resolved at runtime.
634+
TypeCompareState interceptor_ICJI::compareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass)
635+
{
636+
return original_ICorJitInfo->compareTypesForCast(fromClass, toClass);
637+
}
638+
639+
// See if types represented by cls1 and cls2 compare equal, not
640+
// equal, or the comparison needs to be resolved at runtime.
641+
TypeCompareState interceptor_ICJI::compareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
642+
{
643+
return original_ICorJitInfo->compareTypesForEquality(cls1, cls2);
644+
}
645+
632646
// returns is the intersection of cls1 and cls2.
633647
CORINFO_CLASS_HANDLE interceptor_ICJI::mergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
634648
{

src/ToolBox/superpmi/superpmi/icorjitinfo.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,22 @@ BOOL MyICJI::areTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE
760760
return jitInstance->mc->repAreTypesEquivalent(cls1, cls2);
761761
}
762762

763+
// See if a cast from fromClass to toClass will succeed, fail, or needs
764+
// to be resolved at runtime.
765+
TypeCompareState MyICJI::compareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass)
766+
{
767+
jitInstance->mc->cr->AddCall("compareTypesForCast");
768+
return jitInstance->mc->repCompareTypesForCast(fromClass, toClass);
769+
}
770+
771+
// See if types represented by cls1 and cls2 compare equal, not
772+
// equal, or the comparison needs to be resolved at runtime.
773+
TypeCompareState MyICJI::compareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
774+
{
775+
jitInstance->mc->cr->AddCall("compareTypesForEquality");
776+
return jitInstance->mc->repCompareTypesForEquality(cls1, cls2);
777+
}
778+
763779
// returns is the intersection of cls1 and cls2.
764780
CORINFO_CLASS_HANDLE MyICJI::mergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
765781
{

src/inc/corinfo.h

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,11 @@ TODO: Talk about initializing strutures before use
213213
#define SELECTANY extern __declspec(selectany)
214214
#endif
215215

216-
// {CFEC7B89-D5FF-4A67-823A-EF99FE0286F4}
217-
SELECTANY const GUID JITEEVersionIdentifier = {
218-
0xcfec7b89,
219-
0xd5ff,
220-
0x4a67,
221-
{ 0x82, 0x3a, 0xef, 0x99, 0xfe, 0x2, 0x86, 0xf4 }
216+
SELECTANY const GUID JITEEVersionIdentifier = { /* 8f51c68e-d515-425c-9e04-97e4a8148b07 */
217+
0x8f51c68e,
218+
0xd515,
219+
0x425c,
220+
{0x9e, 0x04, 0x97, 0xe4, 0xa8, 0x14, 0x8b, 0x07}
222221
};
223222

224223
//////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2505,22 +2504,14 @@ class ICorStaticInfo
25052504
virtual TypeCompareState compareTypesForCast(
25062505
CORINFO_CLASS_HANDLE fromClass,
25072506
CORINFO_CLASS_HANDLE toClass
2508-
)
2509-
{
2510-
// stub for bringup
2511-
return TypeCompareState::May;
2512-
}
2507+
) = 0;
25132508

25142509
// See if types represented by cls1 and cls2 compare equal, not
25152510
// equal, or the comparison needs to be resolved at runtime.
25162511
virtual TypeCompareState compareTypesForEquality(
25172512
CORINFO_CLASS_HANDLE cls1,
25182513
CORINFO_CLASS_HANDLE cls2
2519-
)
2520-
{
2521-
// stub for bringup
2522-
return TypeCompareState::May;
2523-
}
2514+
) = 0;
25242515

25252516
// returns is the intersection of cls1 and cls2.
25262517
virtual CORINFO_CLASS_HANDLE mergeClasses(

src/vm/jitinterface.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4624,9 +4624,10 @@ TypeCompareState CEEInfo::compareTypesForEquality(
46244624
// If either or both types are canonical subtypes, we can sometimes prove inequality.
46254625
else
46264626
{
4627-
// If either is a value type then the types cannot
4628-
// be equal unless the type defs are the same
4629-
if (hnd1.IsValueType() || hnd2.IsValueType())
4627+
// If either is a value type (but not a native value type),
4628+
// then the types cannot be equal unless the type defs are the same
4629+
if ((hnd1.IsValueType() && !hnd1.IsNativeValueType())
4630+
|| (hnd2.IsValueType() && !hnd2.IsNativeValueType()))
46304631
{
46314632
if (!hnd1.AsMethodTable()->HasSameTypeDefAs(hnd2.AsMethodTable()))
46324633
{

0 commit comments

Comments
 (0)