Skip to content

Commit

Permalink
Fix JitEECallTimingInfo bit rot (#868)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
BruceForstall committed Dec 14, 2019
1 parent 379b6ea commit 6a620e6
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 59 deletions.
17 changes: 11 additions & 6 deletions src/coreclr/src/jit/ICorJitInfo_API_names.h
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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
167 changes: 114 additions & 53 deletions src/coreclr/src/jit/ICorJitInfo_API_wrapper.hpp
Expand Up @@ -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 */)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand All @@ -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)
{
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
/**********************************************************************************/

0 comments on commit 6a620e6

Please sign in to comment.