Skip to content

Commit

Permalink
SPMI: Fix recording/replay of getExactClasses (#90926)
Browse files Browse the repository at this point in the history
  • Loading branch information
jakobbotsch committed Aug 26, 2023
1 parent 93552a3 commit 976c2ab
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 18 deletions.
10 changes: 5 additions & 5 deletions src/coreclr/inc/jiteeversionguid.h
Original file line number Diff line number Diff line change
Expand Up @@ -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}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down
6 changes: 6 additions & 0 deletions src/coreclr/tools/superpmi/superpmi-shared/agnostic.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
38 changes: 27 additions & 11 deletions src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<DLD, DLD>();
GetExactClasses = new LightWeightMap<DLD, Agnostic_GetExactClassesResult>();

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)
{
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 976c2ab

Please sign in to comment.