Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanner Gooding <tagoo@outlook.com>2021-04-14 06:03:45 +0300
committerGitHub <noreply@github.com>2021-04-14 06:03:45 +0300
commitf24879fb522ae31abd515e71ba2b24ce146c5dbc (patch)
tree8da0295db3407943cb2fc0319970d3f5419ab228 /src/coreclr/ToolBox
parentb886e4db6b78548cd97371009b8e278274c44449 (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')
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h1
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp22
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h7
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp11
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp7
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp6
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp8
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 */)
{