Fix JitEECallTimingInfo bit rot (#868)
authorBruce Forstall <brucefo@microsoft.com>
Sat, 14 Dec 2019 06:17:13 +0000 (22:17 -0800)
committerGitHub <noreply@github.com>
Sat, 14 Dec 2019 06:17:13 +0000 (22:17 -0800)
Added new JIT/EE interface functions. Moved some around so
the order of functions is exactly the same order as in the
corinfo.h header file.

This functionality can be enabled by:
1. Changing the definition of `MEASURE_CLRAPI_CALLS` in jit.h
from `0` to `1`.
2. Building Release on x86 or x64 (arm32 and arm64 are currently unsupported)
3. Set environment variables:
```
set COMPlus_JitTimeLogFile=time.txt
set COMPlus_JitEECallTimingInfo=1
```
4. Run a program.

The `time.txt` file will contain a JIT phase time line item "CLR API calls"
for the sum total of all JIT-EE function call cost, plus a per-API breakdown
for each called API with number of calls, total/max/average time, and percentage
of total ABI call cost.

src/coreclr/src/jit/ICorJitInfo_API_names.h
src/coreclr/src/jit/ICorJitInfo_API_wrapper.hpp

index 7a587f8..2e57834 100644 (file)
@@ -14,6 +14,10 @@ DEF_CLR_API(getEHinfo)
 DEF_CLR_API(getMethodClass)
 DEF_CLR_API(getMethodModule)
 DEF_CLR_API(getMethodVTableOffset)
+DEF_CLR_API(resolveVirtualMethod)
+DEF_CLR_API(getUnboxedEntry)
+DEF_CLR_API(getDefaultEqualityComparerClass)
+DEF_CLR_API(expandRawHandleIntrinsic)
 DEF_CLR_API(getIntrinsicID)
 DEF_CLR_API(isIntrinsicType)
 DEF_CLR_API(getUnmanagedCallConv)
@@ -77,7 +81,10 @@ DEF_CLR_API(getTypeForPrimitiveValueClass)
 DEF_CLR_API(getTypeForPrimitiveNumericClass)
 DEF_CLR_API(canCast)
 DEF_CLR_API(areTypesEquivalent)
+DEF_CLR_API(compareTypesForCast)
+DEF_CLR_API(compareTypesForEquality)
 DEF_CLR_API(mergeClasses)
+DEF_CLR_API(isMoreSpecificType)
 DEF_CLR_API(getParentType)
 DEF_CLR_API(getChildType)
 DEF_CLR_API(satisfiesClassConstraints)
@@ -108,6 +115,7 @@ DEF_CLR_API(FilterException)
 DEF_CLR_API(HandleException)
 DEF_CLR_API(ThrowExceptionForJitResult)
 DEF_CLR_API(ThrowExceptionForHelper)
+DEF_CLR_API(runWithErrorTrap)
 DEF_CLR_API(getEEInfo)
 DEF_CLR_API(getJitTimeLogFilename)
 DEF_CLR_API(getMethodDefFromMethod)
@@ -142,6 +150,7 @@ DEF_CLR_API(canAccessFamily)
 DEF_CLR_API(isRIDClassDomainID)
 DEF_CLR_API(getClassDomainID)
 DEF_CLR_API(getFieldAddress)
+DEF_CLR_API(getStaticFieldCurrentClass)
 DEF_CLR_API(getVarArgsHandle)
 DEF_CLR_API(canGetVarArgsHandle)
 DEF_CLR_API(constructStringLiteral)
@@ -152,8 +161,7 @@ DEF_CLR_API(addActiveDependency)
 DEF_CLR_API(GetDelegateCtor)
 DEF_CLR_API(MethodCompileComplete)
 DEF_CLR_API(getTailCallCopyArgsThunk)
-DEF_CLR_API(getJitFlags)
-DEF_CLR_API(runWithErrorTrap)
+DEF_CLR_API(convertPInvokeCalliToCall)
 DEF_CLR_API(getMemoryManager)
 DEF_CLR_API(allocMem)
 DEF_CLR_API(reserveUnwindInfo)
@@ -172,9 +180,6 @@ DEF_CLR_API(recordRelocation)
 DEF_CLR_API(getRelocTypeHint)
 DEF_CLR_API(getModuleNativeEntryPointRange)
 DEF_CLR_API(getExpectedTargetArchitecture)
-DEF_CLR_API(resolveVirtualMethod)
-DEF_CLR_API(expandRawHandleIntrinsic)
-DEF_CLR_API(getDefaultEqualityComparerClass)
-DEF_CLR_API(getUnboxedEntry)
+DEF_CLR_API(getJitFlags)
 
 #undef DEF_CLR_API
index 6fe2200..83ca2a2 100644 (file)
@@ -130,6 +130,48 @@ void WrapICorJitInfo::getMethodVTableOffset(
     API_LEAVE(getMethodVTableOffset);
 }
 
+CORINFO_METHOD_HANDLE WrapICorJitInfo::resolveVirtualMethod(
+            CORINFO_METHOD_HANDLE       virtualMethod,          /* IN */
+            CORINFO_CLASS_HANDLE        implementingClass,      /* IN */
+            CORINFO_CONTEXT_HANDLE      ownerType = NULL        /* IN */
+            )
+{
+    API_ENTER(resolveVirtualMethod);
+    CORINFO_METHOD_HANDLE temp = wrapHnd->resolveVirtualMethod(virtualMethod, implementingClass, ownerType);
+    API_LEAVE(resolveVirtualMethod);
+    return temp;
+}
+
+CORINFO_METHOD_HANDLE WrapICorJitInfo::getUnboxedEntry(
+            CORINFO_METHOD_HANDLE ftn,
+            bool* requiresInstMethodTableArg = NULL /* OUT */
+            )
+{
+    API_ENTER(getUnboxedEntry);
+    CORINFO_METHOD_HANDLE temp = wrapHnd->getUnboxedEntry(ftn, requiresInstMethodTableArg);
+    API_LEAVE(getUnboxedEntry);
+    return temp;
+}
+
+CORINFO_CLASS_HANDLE WrapICorJitInfo::getDefaultEqualityComparerClass(
+            CORINFO_CLASS_HANDLE elemType
+            )
+{
+    API_ENTER(getDefaultEqualityComparerClass);
+    CORINFO_CLASS_HANDLE temp = wrapHnd->getDefaultEqualityComparerClass(elemType);
+    API_LEAVE(getDefaultEqualityComparerClass);
+    return temp;
+}
+
+void WrapICorJitInfo::expandRawHandleIntrinsic(
+        CORINFO_RESOLVED_TOKEN *        pResolvedToken,
+        CORINFO_GENERICHANDLE_RESULT *  pResult)
+{
+    API_ENTER(expandRawHandleIntrinsic);
+    wrapHnd->expandRawHandleIntrinsic(pResolvedToken, pResult);
+    API_LEAVE(expandRawHandleIntrinsic);
+}
+
 CorInfoIntrinsics WrapICorJitInfo::getIntrinsicID(
             CORINFO_METHOD_HANDLE       method,
             bool*                       pMustExpand             /* OUT */)
@@ -395,7 +437,7 @@ BOOL WrapICorJitInfo::isValueClass(CORINFO_CLASS_HANDLE cls)
     return temp;
 }
 
-CorInfoInlineTypeCheck canInlineTypeCheck(CORINFO_CLASS_HANDLE cls, CorInfoInlineTypeCheckSource source)
+CorInfoInlineTypeCheck WrapICorJitInfo::canInlineTypeCheck(CORINFO_CLASS_HANDLE cls, CorInfoInlineTypeCheckSource source)
 {
     API_ENTER(canInlineTypeCheck);
     CorInfoInlineTypeCheck temp = wrapHnd->canInlineTypeCheck(cls, source);
@@ -729,6 +771,28 @@ BOOL WrapICorJitInfo::areTypesEquivalent(
     return temp;
 }
 
+TypeCompareState WrapICorJitInfo::compareTypesForCast(
+            CORINFO_CLASS_HANDLE        fromClass,
+            CORINFO_CLASS_HANDLE        toClass
+            )
+{
+    API_ENTER(compareTypesForCast);
+    TypeCompareState temp = wrapHnd->compareTypesForCast(fromClass, toClass);
+    API_LEAVE(compareTypesForCast);
+    return temp;
+}
+
+TypeCompareState WrapICorJitInfo::compareTypesForEquality(
+            CORINFO_CLASS_HANDLE        cls1,
+            CORINFO_CLASS_HANDLE        cls2
+            )
+{
+    API_ENTER(compareTypesForEquality);
+    TypeCompareState temp = wrapHnd->compareTypesForEquality(cls1, cls2);
+    API_LEAVE(compareTypesForEquality);
+    return temp;
+}
+
 CORINFO_CLASS_HANDLE WrapICorJitInfo::mergeClasses(
             CORINFO_CLASS_HANDLE        cls1,
             CORINFO_CLASS_HANDLE        cls2)
@@ -739,6 +803,17 @@ CORINFO_CLASS_HANDLE WrapICorJitInfo::mergeClasses(
     return temp;
 }
 
+BOOL WrapICorJitInfo::isMoreSpecificType(
+            CORINFO_CLASS_HANDLE        cls1,
+            CORINFO_CLASS_HANDLE        cls2
+            )
+{
+    API_ENTER(isMoreSpecificType);
+    BOOL temp = wrapHnd->isMoreSpecificType(cls1, cls2);
+    API_LEAVE(isMoreSpecificType);
+    return temp;
+}
+
 CORINFO_CLASS_HANDLE WrapICorJitInfo::getParentType(
             CORINFO_CLASS_HANDLE        cls)
 {
@@ -1044,6 +1119,17 @@ void WrapICorJitInfo::ThrowExceptionForHelper(
     API_LEAVE(ThrowExceptionForHelper);
 }
 
+bool WrapICorJitInfo::runWithErrorTrap(
+        void (*function)(void*), // The function to run
+        void* parameter          // The context parameter that will be passed to the function and the handler
+        )
+{
+    API_ENTER(runWithErrorTrap);
+    bool temp = wrapHnd->runWithErrorTrap(function, parameter);
+    API_LEAVE(runWithErrorTrap);
+    return temp;
+}
+
 void WrapICorJitInfo::getEEInfo(
             CORINFO_EE_INFO            *pEEInfoOut)
 {
@@ -1086,7 +1172,7 @@ const char* WrapICorJitInfo::getMethodNameFromMetadata(
         const char                **enclosingClassName  /* OUT */)
 {
     API_ENTER(getMethodNameFromMetadata);
-    const char* temp = wrapHnd->getMethodNameFromMetaData(ftn, className, namespaceName, enclosingClassName);
+    const char* temp = wrapHnd->getMethodNameFromMetadata(ftn, className, namespaceName, enclosingClassName);
     API_LEAVE(getMethodNameFromMetadata);
     return temp;
 }
@@ -1374,6 +1460,17 @@ void* WrapICorJitInfo::getFieldAddress(
     return temp;
 }
 
+CORINFO_CLASS_HANDLE WrapICorJitInfo::getStaticFieldCurrentClass(
+                    CORINFO_FIELD_HANDLE    field,
+                    bool                   *pIsSpeculative = NULL
+                    )
+{
+    API_ENTER(getStaticFieldCurrentClass);
+    CORINFO_CLASS_HANDLE temp = wrapHnd->getStaticFieldCurrentClass(field, pIsSpeculative);
+    API_LEAVE(getStaticFieldCurrentClass);
+    return temp;
+}
+
 CORINFO_VARARGS_HANDLE WrapICorJitInfo::getVarArgsHandle(
                 CORINFO_SIG_INFO       *pSig,
                 void                  **ppIndirection)
@@ -1470,25 +1567,23 @@ void* WrapICorJitInfo::getTailCallCopyArgsThunk(
     return result;
 }
 
+bool WrapICorJitInfo::convertPInvokeCalliToCall(
+                    CORINFO_RESOLVED_TOKEN * pResolvedToken,
+                    bool fMustConvert
+                    )
+{
+    API_ENTER(convertPInvokeCalliToCall);
+    bool temp = wrapHnd->convertPInvokeCalliToCall(pResolvedToken, fMustConvert);
+    API_LEAVE(convertPInvokeCalliToCall);
+    return temp;
+}
+
 /*********************************************************************************/
 //
 // ICorJitInfo
 //
 /*********************************************************************************/
 
-DWORD WrapICorJitInfo::getJitFlags(CORJIT_FLAGS *jitFlags, DWORD sizeInBytes)
-{
-    API_ENTER(getJitFlags);
-    DWORD result = wrapHnd->getJitFlags(jitFlags, sizeInBytes);
-    API_LEAVE(getJitFlags);
-    return result;
-}
-
-bool WrapICorJitInfo::runWithErrorTrap(void(*function)(void*), void *param)
-{
-    return wrapHnd->runWithErrorTrap(function, param);
-}
-
 IEEMemoryManager* WrapICorJitInfo::getMemoryManager()
 {
     API_ENTER(getMemoryManager);
@@ -1659,48 +1754,14 @@ DWORD WrapICorJitInfo::getExpectedTargetArchitecture()
     return result;
 }
 
-CORINFO_METHOD_HANDLE WrapICorJitInfo::resolveVirtualMethod(
-    CORINFO_METHOD_HANDLE       virtualMethod,          /* IN */
-    CORINFO_CLASS_HANDLE        implementingClass,      /* IN */
-    CORINFO_CONTEXT_HANDLE      ownerType = NULL        /* IN */
-)
-{
-    API_ENTER(resolveVirtualMethod);
-    CORINFO_METHOD_HANDLE result = wrapHnd->resolveVirtualMethod(virtualMethod, implementingClass, ownerType);
-    API_LEAVE(resolveVirtualMethod);
-    return result;
-}
-
-CORINFO_METHOD_HANDLE WrapICorJitInfo::getUnboxedEntry(
-    CORINFO_METHOD_HANDLE       ftn,          /* IN */
-    bool* requiresInstMethodTableArg          /* OUT */
-)
-{
-    API_ENTER(getUnboxedEntry);
-    CORINFO_METHOD_HANDLE result = wrapHnd->getUnboxedEntry(ftn, requiresInstMethodTableArg);
-    API_LEAVE(getUnboxedEntry);
-    return result;
-}
-
-CORINFO_CLASS_HANDLE WrapICorJitInfo::getDefaultEqualityComparerClass(
-    CORINFO_CLASS_HANDLE elemType)
+DWORD WrapICorJitInfo::getJitFlags(CORJIT_FLAGS *jitFlags, DWORD sizeInBytes)
 {
-    API_ENTER(getDefaultEqualityComparerClass);
-    CORINFO_CLASS_HANDLE result = wrapHnd->getDefaultEqualityComparerClass(elemType);
-    API_LEAVE(getDefaultEqualityComparerClass);
+    API_ENTER(getJitFlags);
+    DWORD result = wrapHnd->getJitFlags(jitFlags, sizeInBytes);
+    API_LEAVE(getJitFlags);
     return result;
 }
 
-
-void WrapICorJitInfo::expandRawHandleIntrinsic(
-    CORINFO_RESOLVED_TOKEN *        pResolvedToken,
-    CORINFO_GENERICHANDLE_RESULT *  pResult)
-{
-    API_ENTER(expandRawHandleIntrinsic);
-    wrapHnd->expandRawHandleIntrinsic(pResolvedToken, pResult);
-    API_LEAVE(expandRawHandleIntrinsic);
-}
-
 /**********************************************************************************/
 // clang-format on
 /**********************************************************************************/