diff options
author | Tanner Gooding <tagoo@outlook.com> | 2021-04-14 06:03:45 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-14 06:03:45 +0300 |
commit | f24879fb522ae31abd515e71ba2b24ce146c5dbc (patch) | |
tree | 8da0295db3407943cb2fc0319970d3f5419ab228 /src/coreclr/ToolBox | |
parent | b886e4db6b78548cd97371009b8e278274c44449 (diff) |
Expose an eeIsJitIntrinsic method for quickly determining if a method handle represents an intrinsic method (#51124)
* Updating the JIT/EE interface to expose `isJitIntrinsic`
* Update JITEEVersionIdentifier
* Update fgFindJumpTargets to use the much cheaper `eeIsJitIntrinsic`
* Ensure IsJitIntrinsic exists in the LightWeightMap and fix a copy/paste error
* Run ThunkGenerator
* Don't resolve tokens for CEE_CONSTRAINED when making inlining observations
Diffstat (limited to 'src/coreclr/ToolBox')
7 files changed, 61 insertions, 1 deletions
diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h index 7826a25ae00..71f9eca564a 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h @@ -101,6 +101,7 @@ LWM(GetJustMyCodeHandle, DWORDLONG, DLDL) LWM(GetLazyStringLiteralHelper, DWORDLONG, DWORD) LWM(GetLikelyClass, Agnostic_GetLikelyClass, Agnostic_GetLikelyClassResult) LWM(GetLocationOfThisType, DWORDLONG, Agnostic_CORINFO_LOOKUP_KIND) +LWM(IsJitIntrinsic, DWORDLONG, DWORD) LWM(GetMethodAttribs, DWORDLONG, DWORD) LWM(GetClassModule, DWORDLONG, DWORDLONG) LWM(GetModuleAssembly, DWORDLONG, DWORDLONG) diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp index 7c7296b8036..0654207f281 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp @@ -771,6 +771,28 @@ DWORD MethodContext::repGetClassAttribs(CORINFO_CLASS_HANDLE classHandle) return value; } +void MethodContext::recIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn, bool result) +{ + if (IsJitIntrinsic == nullptr) + IsJitIntrinsic = new LightWeightMap<DWORDLONG, DWORD>(); + + IsJitIntrinsic->Add(CastHandle(ftn), (DWORD)result); + DEBUG_REC(dmpIsJitIntrinsic(CastHandle(ftn), (DWORD)result)); +} +void MethodContext::dmpIsJitIntrinsic(DWORDLONG key, DWORD value) +{ + printf("IsJitIntrinsic key ftn-%016llX, value res-%u", key, value); +} +bool MethodContext::repIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn) +{ + AssertCodeMsg((IsJitIntrinsic != nullptr) && (IsJitIntrinsic->GetIndex(CastHandle(ftn)) != -1), EXCEPTIONCODE_MC, + "Didn't find %016llX", CastHandle(ftn)); + + bool result = (BOOL)IsJitIntrinsic->Get(CastHandle(ftn)); + DEBUG_REP(dmpIsJitIntrinsic(CastHandle(ftn), (DWORD)result)); + return result; +} + void MethodContext::recGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle, DWORD attribs) { if (GetMethodAttribs == nullptr) diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h index d71f8d35f3b..69837068f23 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h @@ -119,6 +119,10 @@ public: void dmpGetClassAttribs(DWORDLONG key, DWORD value); DWORD repGetClassAttribs(CORINFO_CLASS_HANDLE classHandle); + void recIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn, bool result); + void dmpIsJitIntrinsic(DWORDLONG key, DWORD value); + bool repIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn); + void recGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle, DWORD attribs); void dmpGetMethodAttribs(DWORDLONG key, DWORD value); DWORD repGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle); @@ -898,7 +902,7 @@ private: }; // ********************* Please keep this up-to-date to ease adding more *************** -// Highest packet number: 191 +// Highest packet number: 192 // ************************************************************************************* enum mcPackets { @@ -1000,6 +1004,7 @@ enum mcPackets Packet_GetJustMyCodeHandle = 68, Packet_GetLikelyClass = 182, // Added 9/27/2020 Packet_GetLocationOfThisType = 69, + Packet_IsJitIntrinsic = 192, Packet_GetMethodAttribs = 70, Packet_GetMethodClass = 71, Packet_GetMethodModule = 181, // Added 11/20/2020 diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 85cca8a129d..281533e4aff 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -17,6 +17,17 @@ // ICorMethodInfo // /**********************************************************************************/ + +// Quick check whether the method is a jit intrinsic. Returns the same value as getMethodAttribs(ftn) & +// CORINFO_FLG_JIT_INTRINSIC, except faster. +bool interceptor_ICJI::isJitIntrinsic(CORINFO_METHOD_HANDLE ftn) +{ + mc->cr->AddCall("isJitIntrinsic"); + bool temp = original_ICorJitInfo->isJitIntrinsic(ftn); + mc->recIsJitIntrinsic(ftn, temp); + return temp; +} + // return flags (defined above, CORINFO_FLG_PUBLIC ...) uint32_t interceptor_ICJI::getMethodAttribs(CORINFO_METHOD_HANDLE ftn /* IN */) { diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp index 674d9f4e1fd..d5ee05be454 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp @@ -12,6 +12,13 @@ #include "spmiutil.h" +bool interceptor_ICJI::isJitIntrinsic( + CORINFO_METHOD_HANDLE ftn) +{ + mcs->AddCall("isJitIntrinsic"); + return original_ICorJitInfo->isJitIntrinsic(ftn); +} + uint32_t interceptor_ICJI::getMethodAttribs( CORINFO_METHOD_HANDLE ftn) { diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp index a276453ba69..3aed50b5b51 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp @@ -12,6 +12,12 @@ #include "spmiutil.h" +bool interceptor_ICJI::isJitIntrinsic( + CORINFO_METHOD_HANDLE ftn) +{ + return original_ICorJitInfo->isJitIntrinsic(ftn); +} + uint32_t interceptor_ICJI::getMethodAttribs( CORINFO_METHOD_HANDLE ftn) { diff --git a/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp index 9d59f4449be..4f86025dfc8 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp @@ -23,6 +23,14 @@ ICorJitInfo* InitICorJitInfo(JitInstance* jitInstance) // /**********************************************************************************/ +// Quick check whether the method is a jit intrinsic. Returns the same value as getMethodAttribs(ftn) & +// CORINFO_FLG_JIT_INTRINSIC, except faster. +bool MyICJI::isJitIntrinsic(CORINFO_METHOD_HANDLE ftn) +{ + jitInstance->mc->cr->AddCall("isJitIntrinsic"); + return jitInstance->mc->repIsJitIntrinsic(ftn); +} + // return flags (defined above, CORINFO_FLG_PUBLIC ...) uint32_t MyICJI::getMethodAttribs(CORINFO_METHOD_HANDLE ftn /* IN */) { |