From 6a620e62cb148dafd36266b8017f914e10b1365d Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Fri, 13 Dec 2019 22:17:13 -0800 Subject: [PATCH] Fix JitEECallTimingInfo bit rot (#868) 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 | 17 ++- src/coreclr/src/jit/ICorJitInfo_API_wrapper.hpp | 167 ++++++++++++++++-------- 2 files changed, 125 insertions(+), 59 deletions(-) diff --git a/src/coreclr/src/jit/ICorJitInfo_API_names.h b/src/coreclr/src/jit/ICorJitInfo_API_names.h index 7a587f8..2e57834 100644 --- a/src/coreclr/src/jit/ICorJitInfo_API_names.h +++ b/src/coreclr/src/jit/ICorJitInfo_API_names.h @@ -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 diff --git a/src/coreclr/src/jit/ICorJitInfo_API_wrapper.hpp b/src/coreclr/src/jit/ICorJitInfo_API_wrapper.hpp index 6fe2200..83ca2a2 100644 --- a/src/coreclr/src/jit/ICorJitInfo_API_wrapper.hpp +++ b/src/coreclr/src/jit/ICorJitInfo_API_wrapper.hpp @@ -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 /**********************************************************************************/ -- 2.7.4