#endif // !FEATURE_PAL
+// Max number of methods that !dumpmodule -prof will print
+const UINT kcMaxMethodDescsForProfiler = 100;
+
#include <set>
#include <vector>
#include <map>
}
else
{
+ TADDR ilAddr = NULL;
+ struct DacpProfilerILData ilData;
+ ReleaseHolder<ISOSDacInterface7> sos7;
+ if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) &&
+ SUCCEEDED(sos7->GetProfilerModifiedILInformation(MethodDescData.MethodDescPtr, &ilData)))
+ {
+ if (ilData.type == DacpProfilerILData::ILModified)
+ {
+ ExtOut("Found profiler modified IL\n");
+ ilAddr = TO_TADDR(ilData.il);
+ }
+ }
+
// Factor this so that it returns a map from IL offset to the textual representation of the decoding
// to be consumed by !u -il
// The disassemble function can give a MethodDescData as well as the set of keys IL offsets
return Status;
}
- ULONG pRva;
- DWORD dwFlags;
- if (pImport->GetRVA(MethodDescData.MDToken, &pRva, &dwFlags) != S_OK)
- {
- ExtOut("error in import\n");
- return Status;
- }
+ if (ilAddr == NULL)
+ {
+ ULONG pRva;
+ DWORD dwFlags;
+ if (pImport->GetRVA(MethodDescData.MDToken, &pRva, &dwFlags) != S_OK)
+ {
+ ExtOut("error in import\n");
+ return Status;
+ }
- CLRDATA_ADDRESS ilAddrClr;
- if (g_sos->GetILForModule(MethodDescData.ModulePtr, pRva, &ilAddrClr) != S_OK)
- {
- ExtOut("FindIL failed\n");
- return Status;
+ CLRDATA_ADDRESS ilAddrClr;
+ if (g_sos->GetILForModule(MethodDescData.ModulePtr, pRva, &ilAddrClr) != S_OK)
+ {
+ ExtOut("FindIL failed\n");
+ return Status;
+ }
+
+ ilAddr = TO_TADDR(ilAddrClr);
}
- TADDR ilAddr = TO_TADDR(ilAddrClr);
+ if (ilAddr == NULL)
+ {
+ ExtOut("Unkown error in reading function IL\n");
+ return E_FAIL;
+ }
IfFailRet(DecodeILFromAddress(pImport, ilAddr));
}
}
DWORD_PTR p_ModuleAddr = NULL;
BOOL bMethodTables = FALSE;
+ BOOL bProfilerModified = FALSE;
BOOL dml = FALSE;
CMDOption option[] =
{ // name, vptr, type, hasValue
{"-mt", &bMethodTables, COBOOL, FALSE},
#ifndef FEATURE_PAL
- {"/d", &dml, COBOOL, FALSE}
+ {"/d", &dml, COBOOL, FALSE},
#endif
+ {"-prof", &bProfilerModified, COBOOL, FALSE},
};
CMDValue arg[] =
{ // vptr, type
g_sos->TraverseModuleMap(TYPEREFTOMETHODTABLE, TO_CDADDR(p_ModuleAddr), ModuleMapTraverse, (LPVOID)mdTypeDefNil);
}
+ if (bProfilerModified)
+ {
+ CLRDATA_ADDRESS methodDescs[kcMaxMethodDescsForProfiler];
+ int cMethodDescs;
+
+ ReleaseHolder<ISOSDacInterface7> sos7;
+ if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) &&
+ SUCCEEDED(sos7->GetMethodsWithProfilerModifiedIL(TO_CDADDR(p_ModuleAddr),
+ methodDescs,
+ kcMaxMethodDescsForProfiler,
+ &cMethodDescs)))
+ {
+ if (cMethodDescs >0)
+ {
+ ExtOut("\nMethods in this module with profiler modified IL:\n");
+ for (int i = 0; i < cMethodDescs; ++i)
+ {
+ CLRDATA_ADDRESS md = methodDescs[i];
+
+ DMLOut("MethodDesc: %s ", DMLMethodDesc(md));
+
+ // Easiest to get full parameterized method name from ..::GetMethodName
+ if (g_sos->GetMethodDescName(md, mdNameLen, g_mdName, NULL) == S_OK)
+ {
+ ExtOut("Name: %S", g_mdName);
+ }
+
+ struct DacpProfilerILData ilData;
+ if (SUCCEEDED(sos7->GetProfilerModifiedILInformation(md, &ilData)))
+ {
+ if (ilData.type == DacpProfilerILData::ILModified)
+ {
+ ExtOut(" (IL Modified)");
+ }
+ else if (ilData.type == DacpProfilerILData::ReJITModified)
+ {
+ ExtOut(" (ReJIT Modified)");
+ }
+ }
+
+ ExtOut("\n");
+ }
+ }
+ else
+ {
+ ExtOut("\nThis module has no methods with profiler modified IL.\n");
+ }
+ }
+ else
+ {
+ ExtOut("\nThis runtime version does not support listing the profiler modified functions.\n");
+ }
+
+
+
+ HRESULT GetMethodsWithProfilerModifiedIL(CLRDATA_ADDRESS module, CLRDATA_ADDRESS *methodDescs, int cMethodDescs, int *pcMethodDescs);
+ }
+
return Status;
}
struct DacpReJitData2 rejitData;
ReleaseHolder<ISOSDacInterface7> sos7;
if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) &&
- SUCCEEDED(sos7->GetRejitInformation(pMethodDesc,
+ SUCCEEDED(sos7->GetReJITInformation(pMethodDesc,
(int)pReJitData->rejitID,
&rejitData)))
{
kReverted,
};
- CLRDATA_ADDRESS rejitID;
+ ULONG rejitID;
Flags flags;
CLRDATA_ADDRESS il;
CLRDATA_ADDRESS ilCodeVersionNodePtr;
};
+struct MSLAYOUT DacpProfilerILData : ZeroInit<DacpProfilerILData>
+{
+ enum ModificationType
+ {
+ Unmodified,
+ ILModified,
+ ReJITModified,
+ };
+
+ ModificationType type;
+ CLRDATA_ADDRESS il;
+ ULONG rejitID;
+};
+
struct MSLAYOUT DacpMethodDescData : ZeroInit<DacpMethodDescData>
{
BOOL bHasNativeCode;
]
interface ISOSDacInterface7 : IUnknown
{
- HRESULT GetRejitInformation(CLRDATA_ADDRESS methodDesc, int rejitId, struct DacpReJitData2 *pRejitData);
+ HRESULT GetReJITInformation(CLRDATA_ADDRESS methodDesc, int rejitId, struct DacpReJitData2 *pRejitData);
+ HRESULT GetProfilerModifiedILInformation(CLRDATA_ADDRESS methodDesc, struct DacpProfilerILData *pILData);
+ HRESULT GetMethodsWithProfilerModifiedIL(CLRDATA_ADDRESS mod, CLRDATA_ADDRESS *methodDescs, int cMethodDescs, int *pcMethodDescs);
};
/* File created by MIDL compiler version 8.01.0622 */
/* at Mon Jan 18 19:14:07 2038
*/
-/* Compiler settings for C:/git/coreclr/src/inc/sospriv.idl:
+/* Compiler settings for C:/git/diagnostics/src/inc/sospriv.idl:
Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
ISOSDacInterface7 : public IUnknown
{
public:
- virtual HRESULT STDMETHODCALLTYPE GetRejitInformation(
+ virtual HRESULT STDMETHODCALLTYPE GetReJITInformation(
CLRDATA_ADDRESS methodDesc,
int rejitId,
struct DacpReJitData2 *pRejitData) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetProfilerModifiedILInformation(
+ CLRDATA_ADDRESS methodDesc,
+ struct DacpProfilerILData *pILData) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetMethodsWithProfilerModifiedIL(
+ CLRDATA_ADDRESS mod,
+ CLRDATA_ADDRESS *methodDescs,
+ int cMethodDescs,
+ int *pcMethodDescs) = 0;
+
};
ULONG ( STDMETHODCALLTYPE *Release )(
ISOSDacInterface7 * This);
- HRESULT ( STDMETHODCALLTYPE *GetRejitInformation )(
+ HRESULT ( STDMETHODCALLTYPE *GetReJITInformation )(
ISOSDacInterface7 * This,
CLRDATA_ADDRESS methodDesc,
int rejitId,
struct DacpReJitData2 *pRejitData);
+ HRESULT ( STDMETHODCALLTYPE *GetProfilerModifiedILInformation )(
+ ISOSDacInterface7 * This,
+ CLRDATA_ADDRESS methodDesc,
+ struct DacpProfilerILData *pILData);
+
+ HRESULT ( STDMETHODCALLTYPE *GetMethodsWithProfilerModifiedIL )(
+ ISOSDacInterface7 * This,
+ CLRDATA_ADDRESS mod,
+ CLRDATA_ADDRESS *methodDescs,
+ int cMethodDescs,
+ int *pcMethodDescs);
+
END_INTERFACE
} ISOSDacInterface7Vtbl;
( (This)->lpVtbl -> Release(This) )
-#define ISOSDacInterface7_GetRejitInformation(This,methodDesc,rejitId,pRejitData) \
- ( (This)->lpVtbl -> GetRejitInformation(This,methodDesc,rejitId,pRejitData) )
+#define ISOSDacInterface7_GetReJITInformation(This,methodDesc,rejitId,pRejitData) \
+ ( (This)->lpVtbl -> GetReJITInformation(This,methodDesc,rejitId,pRejitData) )
+
+#define ISOSDacInterface7_GetProfilerModifiedILInformation(This,methodDesc,pILData) \
+ ( (This)->lpVtbl -> GetProfilerModifiedILInformation(This,methodDesc,pILData) )
+
+#define ISOSDacInterface7_GetMethodsWithProfilerModifiedIL(This,mod,methodDescs,cMethodDescs,pcMethodDescs) \
+ ( (This)->lpVtbl -> GetMethodsWithProfilerModifiedIL(This,mod,methodDescs,cMethodDescs,pcMethodDescs) )
#endif /* COBJMACROS */