From 6311469038e83a3f24e70c9f99f92a5745a94970 Mon Sep 17 00:00:00 2001 From: Hyeongseok Oh Date: Tue, 8 Nov 2016 11:31:29 +0900 Subject: [PATCH] Support GetHFAType in SuperPMI for ARM32 hardFP --- src/ToolBox/superpmi/superpmi-shared/lwmlist.h | 1 + .../superpmi/superpmi-shared/methodcontext.cpp | 28 ++++++++++++++++++++++ .../superpmi/superpmi-shared/methodcontext.h | 7 +++++- .../superpmi-shim-collector/icorjitinfo.cpp | 4 +++- src/ToolBox/superpmi/superpmi/icorjitinfo.cpp | 5 ++-- src/ToolBox/superpmi/superpmi/superpmi.cpp | 2 ++ src/ToolBox/superpmi/superpmi/superpmi.h | 3 ++- 7 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/ToolBox/superpmi/superpmi-shared/lwmlist.h b/src/ToolBox/superpmi/superpmi-shared/lwmlist.h index 774e732..de0db3a 100644 --- a/src/ToolBox/superpmi/superpmi-shared/lwmlist.h +++ b/src/ToolBox/superpmi/superpmi-shared/lwmlist.h @@ -85,6 +85,7 @@ LWM(GetFunctionFixedEntryPoint, DWORDLONG, Agnostic_CORINFO_CONST_LOOKUP) LWM(GetGSCookie, DWORD, DLDL) LWM(GetHelperFtn, DWORD, DLDL) LWM(GetHelperName, DWORD, DWORD) +LWM(GetHFAType, DWORDLONG, DWORD) LWM(GetInlinedCallFrameVptr, DWORD, DLDL) LWM(GetIntConfigValue, Agnostic_ConfigIntInfo, DWORD) LWM(GetIntrinsicID, DWORDLONG, DD) diff --git a/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp b/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp index acf163e..d523c86 100644 --- a/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp @@ -2842,6 +2842,34 @@ CORINFO_CLASS_HANDLE MethodContext::repGetArgClass(CORINFO_SIG_INFO* sig, CORINF return (CORINFO_CLASS_HANDLE)value.result; } +void MethodContext::recGetHFAType(CORINFO_CLASS_HANDLE clsHnd, CorInfoType result) +{ + if (GetHFAType == nullptr) + GetHFAType = new LightWeightMap(); + + GetHFAType->Add((DWORDLONG)clsHnd, (DWORD)result); + DEBUG_REC(dmpGetHFAType((DWORDLONG)clsHnd, (DWORD)result)); + return; +} + +void MethodContext::dmpGetHFAType(DWORDLONG key, DWORD value) +{ + printf("GetHFATypet key %016llX, value %u ", key, value); + return; +} + +CorInfoType MethodContext::repGetHFAType(CORINFO_CLASS_HANDLE clsHnd) +{ + DWORD value; + + AssertCodeMsg(GetHFAType != nullptr, EXCEPTIONCODE_MC, "Didn't find anything for %016llX", (DWORDLONG)clsHnd); + AssertCodeMsg(GetHFAType->GetIndex((DWORDLONG)clsHnd) != -1, EXCEPTIONCODE_MC, "Didn't find %016llX", (DWORDLONG)clsHnd); + + value = GetHFAType->Get((DWORDLONG)clsHnd); + DEBUG_REP(dmpGetHFAType((DWORDLONG)clsHnd, value)); + return (CorInfoType)value; +} + void MethodContext::recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO *info, bool result, DWORD exceptionCode) { if (GetMethodInfo == nullptr) diff --git a/src/ToolBox/superpmi/superpmi-shared/methodcontext.h b/src/ToolBox/superpmi/superpmi-shared/methodcontext.h index 5885e2b..0d49666 100644 --- a/src/ToolBox/superpmi/superpmi-shared/methodcontext.h +++ b/src/ToolBox/superpmi/superpmi-shared/methodcontext.h @@ -674,6 +674,10 @@ public: void dmpGetArgClass(const Agnostic_GetArgClass& key, const Agnostic_GetArgClass_Value& value); CORINFO_CLASS_HANDLE repGetArgClass(CORINFO_SIG_INFO* sig, CORINFO_ARG_LIST_HANDLE args, DWORD *exceptionCode); + void recGetHFAType(CORINFO_CLASS_HANDLE clsHnd, CorInfoType result); + void dmpGetHFAType(DWORDLONG key, DWORD value); + CorInfoType repGetHFAType(CORINFO_CLASS_HANDLE clsHnd); + void recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO *info, bool result, DWORD exceptionCode); void dmpGetMethodInfo(DWORDLONG key, const Agnostic_GetMethodInfo& value); bool repGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO *info, DWORD *exceptionCode); @@ -1012,7 +1016,7 @@ private: // ********************* Please keep this up-to-date to ease adding more *************** -// Highest packet number: 158 +// Highest packet number: 159 // ************************************************************************************* enum mcPackets { @@ -1055,6 +1059,7 @@ enum mcPackets Packet_GetAddrOfCaptureThreadGlobal = 27, Retired1 = 28, Packet_GetArgClass = 139, //retired as 28 on 2013/07/03 + Packet_GetHFAType = 159, Packet_GetArgNext = 29, Retired2 = 30, Packet_GetArgType = 140, //retired as 30 on 2013/07/03 diff --git a/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 5706b0a..1813ed2 100644 --- a/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -1388,7 +1388,9 @@ CorInfoType interceptor_ICJI::getHFAType ( ) { mc->cr->AddCall("getHFAType"); - return original_ICorJitInfo->getHFAType(hClass); + CorInfoType temp = original_ICorJitInfo->getHFAType(hClass); + this->mc->recGetHFAType(hClass, temp); + return temp; } /***************************************************************************** diff --git a/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp b/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp index b05a284..b746d3f 100644 --- a/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp +++ b/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp @@ -1192,9 +1192,8 @@ CorInfoType MyICJI::getHFAType ( ) { jitInstance->mc->cr->AddCall("getHFAType"); - LogError("Hit unimplemented getHFAType"); - DebugBreakorAV(75); - return (CorInfoType)0; + CorInfoType value = jitInstance->mc->repGetHFAType(hClass); + return value; } /***************************************************************************** diff --git a/src/ToolBox/superpmi/superpmi/superpmi.cpp b/src/ToolBox/superpmi/superpmi/superpmi.cpp index ce35207..980792d 100644 --- a/src/ToolBox/superpmi/superpmi/superpmi.cpp +++ b/src/ToolBox/superpmi/superpmi/superpmi.cpp @@ -45,6 +45,8 @@ void SetSuperPmiTargetArchitecture(const char* targetArchitecture) } #elif defined(_TARGET_X86_) SpmiTargetArchitecture = SPMI_TARGET_ARCHITECTURE_X86; +#elif defined(_TARGET_ARM_) + SpmiTargetArchitecture = SPMI_TARGET_ARCHITECTURE_ARM; #endif } diff --git a/src/ToolBox/superpmi/superpmi/superpmi.h b/src/ToolBox/superpmi/superpmi/superpmi.h index d5b7bda..ce53599 100644 --- a/src/ToolBox/superpmi/superpmi/superpmi.h +++ b/src/ToolBox/superpmi/superpmi/superpmi.h @@ -12,7 +12,8 @@ enum SPMI_TARGET_ARCHITECTURE { SPMI_TARGET_ARCHITECTURE_X86, SPMI_TARGET_ARCHITECTURE_AMD64, - SPMI_TARGET_ARCHITECTURE_ARM64 + SPMI_TARGET_ARCHITECTURE_ARM64, + SPMI_TARGET_ARCHITECTURE_ARM }; extern SPMI_TARGET_ARCHITECTURE SpmiTargetArchitecture; -- 2.7.4