From 976c2ab862494ef05e2b61535a3d08e26f131145 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Sat, 26 Aug 2023 21:53:22 +0200 Subject: [PATCH] SPMI: Fix recording/replay of getExactClasses (#90926) --- src/coreclr/inc/jiteeversionguid.h | 10 ++--- .../tools/superpmi/superpmi-shared/agnostic.h | 6 +++ .../tools/superpmi/superpmi-shared/lwmlist.h | 2 +- .../superpmi-shared/methodcontext.cpp | 38 +++++++++++++------ .../superpmi/superpmi-shared/methodcontext.h | 2 +- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/coreclr/inc/jiteeversionguid.h b/src/coreclr/inc/jiteeversionguid.h index 54ee605f0aed5..d5d27b4b457f3 100644 --- a/src/coreclr/inc/jiteeversionguid.h +++ b/src/coreclr/inc/jiteeversionguid.h @@ -43,11 +43,11 @@ typedef const GUID *LPCGUID; #define GUID_DEFINED #endif // !GUID_DEFINED -constexpr GUID JITEEVersionIdentifier = { /* 4bceb905-d550-4a5d-b1eb-276fff68d183 */ - 0x4bceb905, - 0xd550, - 0x4a5d, - {0xb1, 0xeb, 0x27, 0x6f, 0xff, 0x68, 0xd1, 0x83} +constexpr GUID JITEEVersionIdentifier = { /* 5bf301d6-d08e-4c74-ab9b-1d9c1975950f */ + 0x5bf301d6, + 0xd08e, + 0x4c74, + {0xab, 0x9b, 0x1d, 0x9c, 0x19, 0x75, 0x95, 0x0f} }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h index 2155d6a1003ae..82bcb14d3a169 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h @@ -567,6 +567,12 @@ struct Agnostic_GetArgType_Value DWORD exceptionCode; }; +struct Agnostic_GetExactClassesResult +{ + int numClasses; + DWORD classes; +}; + // Agnostic_ConfigIntInfo combines as a single key the name // and defaultValue of a integer config query. // Note: nameIndex is treated as a DWORD index to the name string. diff --git a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h index 57bad5441147a..c09cd84b059e4 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h @@ -48,7 +48,7 @@ LWM(GetAddrOfCaptureThreadGlobal, DWORD, DLDL) LWM(GetArgClass, Agnostic_GetArgClass_Key, Agnostic_GetArgClass_Value) LWM(GetArgNext, DWORDLONG, DWORDLONG) LWM(GetArgType, Agnostic_GetArgType_Key, Agnostic_GetArgType_Value) -LWM(GetExactClasses, DLD, DLD) +LWM(GetExactClasses, DLD, Agnostic_GetExactClassesResult) LWM(GetArrayInitializationData, DLD, DWORDLONG) LWM(GetArrayRank, DWORDLONG, DWORD) LWM(GetArrayIntrinsicID, DWORDLONG, DWORD) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index fa13ac1f4c0fc..a7c6d9b9d3fab 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -2747,24 +2747,31 @@ CorInfoTypeWithMod MethodContext::repGetArgType(CORINFO_SIG_INFO* sig, void MethodContext::recGetExactClasses(CORINFO_CLASS_HANDLE baseType, int maxExactClasses, CORINFO_CLASS_HANDLE* exactClsRet, int result) { if (GetExactClasses == nullptr) - GetExactClasses = new LightWeightMap(); + GetExactClasses = new LightWeightMap(); DLD key; ZeroMemory(&key, sizeof(key)); key.A = CastHandle(baseType); key.B = maxExactClasses; - DLD value; - ZeroMemory(&value, sizeof(value)); - value.A = CastHandle(*exactClsRet); - value.B = result; + Assert(result >= 0); + + DWORDLONG* exactClassesAgnostic = new DWORDLONG[result]; + for (int i = 0; i < result; i++) + exactClassesAgnostic[i] = CastHandle(exactClsRet[i]); + + Agnostic_GetExactClassesResult value; + value.numClasses = result; + value.classes = GetExactClasses->AddBuffer((unsigned char*)exactClassesAgnostic, (unsigned int)(result * sizeof(DWORDLONG))); + + delete[] exactClassesAgnostic; GetExactClasses->Add(key, value); } -void MethodContext::dmpGetExactClasses(DLD key, DLD value) +void MethodContext::dmpGetExactClasses(DLD key, const Agnostic_GetExactClassesResult& value) { - printf("GetExactClasses key baseType-%016" PRIX64 ", key maxExactCls %u, value exactCls %016" PRIX64 ", value exactClsCount %u", - key.A, key.B, value.A, value.B); + printf("GetExactClasses key baseType-%016" PRIX64 ", maxExactCls-%u, value numClasses-%d", + key.A, key.B, value.numClasses); } int MethodContext::repGetExactClasses(CORINFO_CLASS_HANDLE baseType, int maxExactClasses, CORINFO_CLASS_HANDLE* exactClsRet) { @@ -2773,10 +2780,19 @@ int MethodContext::repGetExactClasses(CORINFO_CLASS_HANDLE baseType, int maxExac key.A = CastHandle(baseType); key.B = maxExactClasses; - DLD value = LookupByKeyOrMiss(GetExactClasses, key, ": key %016" PRIX64 " %08X", key.A, key.B); + Agnostic_GetExactClassesResult value = LookupByKeyOrMiss(GetExactClasses, key, ": key %016" PRIX64 " %08X", key.A, key.B); - *exactClsRet = (CORINFO_CLASS_HANDLE)value.A; - return value.B; + Assert(maxExactClasses >= value.numClasses); + + unsigned char* buffer = GetExactClasses->GetBuffer(value.classes); + for (int i = 0; i < value.numClasses; i++) + { + DWORDLONG handle; + memcpy(&handle, &buffer[i * sizeof(DWORDLONG)], sizeof(handle)); + exactClsRet[i] = (CORINFO_CLASS_HANDLE)handle; + } + + return value.numClasses; } void MethodContext::recGetArgNext(CORINFO_ARG_LIST_HANDLE args, CORINFO_ARG_LIST_HANDLE result) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h index fd132c6cafa8a..2af725f63f7ae 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h @@ -378,7 +378,7 @@ class MethodContext int maxExactClasses, CORINFO_CLASS_HANDLE* exactClsRet, int result); - void dmpGetExactClasses(DLD key, DLD value); + void dmpGetExactClasses(DLD key, const Agnostic_GetExactClassesResult& value); int repGetExactClasses(CORINFO_CLASS_HANDLE baseType, int maxExactClasses, CORINFO_CLASS_HANDLE* exactClsRet);