return "UNKNOWN";
}
-void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersionData, const UINT cTieredVersionData)
+void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersionData,
+ const UINT cTieredVersionData, ULONG rejitID, CLRDATA_ADDRESS ilAddr, CLRDATA_ADDRESS ilNodeAddr)
{
- ExtOut(" Code Version History:\n");
-
for(int i = cTieredVersionData - 1; i >= 0; --i)
{
+ ExtOut("NativeCodeVersion: %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr));
+
const char *descriptor = NULL;
switch(pTieredVersionData[i].OptimizationTier)
{
break;
}
+ ExtOut(" ReJIT ID: %d\n", rejitID);
DMLOut(" CodeAddr: %s (%s)\n", DMLIP(pTieredVersionData[i].NativeCodeAddr), descriptor);
- ExtOut(" NativeCodeVersion: %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr));
+ DMLOut(" IL Addr: %s\n", DMLIL(ilAddr));
+ ExtOut(" ILCodeVersion: %p\n", SOS_PTR(ilNodeAddr));
+
}
}
-// 2.1 version
-void DumpTieredNativeCodeAddressInfo_21(struct DacpTieredVersionData_21 * pTieredVersionData, const UINT cTieredVersionData)
-{
- ExtOut("Code Version History:\n");
+void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData)
+{
+ int rejitID = (int)pReJitData->rejitID;
+ CLRDATA_ADDRESS ilAddr = 0;
+ CLRDATA_ADDRESS ilNodeAddr = 0;
- for(int i = cTieredVersionData - 1; i >= 0; --i)
+ struct DacpReJitData2 rejitData;
+ ReleaseHolder<ISOSDacInterface7> sos7;
+ if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) &&
+ SUCCEEDED(sos7->GetReJITInformation(pMethodDesc,
+ rejitID,
+ &rejitData)))
{
- const char *descriptor = NULL;
- switch(pTieredVersionData[i].TieredInfo)
- {
- case DacpTieredVersionData_21::TIERED_UNKNOWN:
- default:
- descriptor = "Unknown Tier";
- break;
- case DacpTieredVersionData_21::NON_TIERED:
- descriptor = "Non-Tiered";
- break;
- case DacpTieredVersionData_21::TIERED_0:
- descriptor = "Tier 0";
- break;
- case DacpTieredVersionData_21::TIERED_1:
- descriptor = "Tier 1";
- break;
- }
-
- DMLOut(" CodeAddr: %s (%s)\n", DMLIP(pTieredVersionData[i].NativeCodeAddr), descriptor);
- ExtOut(" NativeCodeVersion: %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr));
+ ilAddr = rejitData.il;
+ ilNodeAddr = rejitData.ilCodeVersionNodePtr;
}
-}
-
-void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData)
-{
- ExtOut(" ReJITID %p: ", SOS_PTR(pReJitData->rejitID));
struct DacpTieredVersionData codeAddrs[kcMaxTieredVersions];
int cCodeAddrs;
- LPCSTR szFlags;
- switch (pReJitData->flags)
- {
- default:
- case DacpReJitData::kUnknown:
- szFlags = "";
- break;
-
- case DacpReJitData::kRequested:
- szFlags = " (READY to jit on next call)";
- break;
-
- case DacpReJitData::kActive:
- szFlags = " (CURRENT)";
- break;
-
- case DacpReJitData::kReverted:
- szFlags = " (reverted)";
- break;
- }
-
- ExtOut("%s\n", szFlags);
-
ReleaseHolder<ISOSDacInterface5> sos5;
if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface5), &sos5)) &&
SUCCEEDED(sos5->GetTieredVersions(pMethodDesc,
- (int)pReJitData->rejitID,
+ rejitID,
codeAddrs,
kcMaxTieredVersions,
&cCodeAddrs)))
{
- DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs);
- }
-
- struct DacpReJitData2 rejitData;
- ReleaseHolder<ISOSDacInterface7> sos7;
- if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) &&
- SUCCEEDED(sos7->GetReJITInformation(pMethodDesc,
- (int)pReJitData->rejitID,
- &rejitData)))
- {
- ExtOut(" ReJIT Information:\n");
- DMLOut(" IL Addr: %s\n", DMLIL(rejitData.il));
- ExtOut(" ILCodeVersion: %p\n", SOS_PTR(rejitData.ilCodeVersionNodePtr));
+ DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs, rejitID, ilAddr, ilNodeAddr);
}
}
{
return;
}
- ExtOut("ReJITed versions:\n");
-
- // Dump CURRENT rejit info
- DumpRejitData(pMethodDescData->MethodDescPtr, &pMethodDescData->rejitDataCurrent);
// Dump reverted rejit infos
for (ULONG i=0; i < cRevertedRejitData; i++)
DMLOut("Current CodeAddr: %s\n", DMLIP(pMethodDescData->NativeCodeAddr));
+ int rejitID = (int)pMethodDescData->rejitDataCurrent.rejitID;
+ CLRDATA_ADDRESS ilAddr = 0;
+ CLRDATA_ADDRESS ilNodeAddr = 0;
+
+ struct DacpReJitData2 rejitData;
+ ReleaseHolder<ISOSDacInterface7> sos7;
+ if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)))
+ {
+ if SUCCEEDED(sos7->GetReJITInformation(pMethodDescData->MethodDescPtr,
+ rejitID,
+ &rejitData))
+ {
+ ilAddr = rejitData.il;
+ ilNodeAddr = rejitData.ilCodeVersionNodePtr;
+ }
+
+ int pendingRejitID;
+ struct DacpReJitData2 pendingRejitData;
+ if (sos7->GetPendingReJITID(pMethodDescData->MethodDescPtr, &pendingRejitID) == S_OK &&
+ SUCCEEDED(sos7->GetReJITInformation(pMethodDescData->MethodDescPtr, pendingRejitID, &pendingRejitData)))
+ {
+ // Special case, there is no jitted code yet but still need to output the IL information
+ ExtOut("ILCodeVersion: %p (pending)\n", SOS_PTR(pendingRejitData.ilCodeVersionNodePtr));
+ ExtOut(" ReJIT ID: %d\n", pendingRejitID);
+ DMLOut(" IL Addr: %s\n", DMLIL(pendingRejitData.il));
+ }
+ }
+
struct DacpTieredVersionData codeAddrs[kcMaxTieredVersions];
int cCodeAddrs;
ReleaseHolder<ISOSDacInterface5> sos5;
if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface5), &sos5)) &&
SUCCEEDED(sos5->GetTieredVersions(pMethodDescData->MethodDescPtr,
- (int)pMethodDescData->rejitDataCurrent.rejitID,
+ rejitID,
codeAddrs,
kcMaxTieredVersions,
&cCodeAddrs)))
{
- DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs);
+ DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs, rejitID, ilAddr, ilNodeAddr);
}
-
+
DumpAllRejitDataIfNecessary(pMethodDescData, pRevertedRejitData, cRevertedRejitData);
}
else
ISOSDacInterface7 : public IUnknown
{
public:
+ virtual HRESULT STDMETHODCALLTYPE GetPendingReJITID(
+ CLRDATA_ADDRESS methodDesc,
+ int *pRejitId) = 0;
+
virtual HRESULT STDMETHODCALLTYPE GetReJITInformation(
CLRDATA_ADDRESS methodDesc,
int rejitId,
ULONG ( STDMETHODCALLTYPE *Release )(
ISOSDacInterface7 * This);
+ HRESULT ( STDMETHODCALLTYPE *GetPendingReJITID )(
+ ISOSDacInterface7 * This,
+ CLRDATA_ADDRESS methodDesc,
+ int *pRejitId);
+
HRESULT ( STDMETHODCALLTYPE *GetReJITInformation )(
ISOSDacInterface7 * This,
CLRDATA_ADDRESS methodDesc,
( (This)->lpVtbl -> Release(This) )
+#define ISOSDacInterface7_GetPendingReJITID(This,methodDesc,pRejitId) \
+ ( (This)->lpVtbl -> GetPendingReJITID(This,methodDesc,pRejitId) )
+
#define ISOSDacInterface7_GetReJITInformation(This,methodDesc,rejitId,pRejitData) \
( (This)->lpVtbl -> GetReJITInformation(This,methodDesc,rejitId,pRejitData) )