DynamicAssembly=0x2,
NativeAssembly=0x4,
CollectibleAssembly=0x8,
+ ReadyToRunAssembly=0x10,
}AssemblyFlags;
typedef enum _ModuleFlags
NativeModule=0x2,
DynamicModule=0x4,
ManifestModule=0x8,
- IbcOptimized=0x10
+ IbcOptimized=0x10,
+ ReadyToRunModule=0x20,
}ModuleFlags;
typedef enum _RangeFlags
static VOID SendEventsForNgenMethods(Module *pModule, DWORD dwEventOptions);
static VOID SendMethodJitStartEvent(MethodDesc *pMethodDesc, SString *namespaceOrClassName=NULL, SString *methodName=NULL, SString *methodSignature=NULL);
static VOID SendMethodILToNativeMapEvent(MethodDesc * pMethodDesc, DWORD dwEventOptions, SIZE_T pCode, ReJITID rejitID);
- static VOID SendMethodEvent(MethodDesc *pMethodDesc, DWORD dwEventOptions, BOOL bIsJit, SString *namespaceOrClassName=NULL, SString *methodName=NULL, SString *methodSignature=NULL, SIZE_T pCode = 0, ReJITID rejitID = 0);
+ static VOID SendMethodEvent(MethodDesc *pMethodDesc, DWORD dwEventOptions, BOOL bIsJit, SString *namespaceOrClassName=NULL, SString *methodName=NULL, SString *methodSignature=NULL, SIZE_T pCode = 0, ReJITID rejitID = 0, BOOL bProfilerRejectedPrecompiledCode = FALSE, BOOL bReadyToRunRejectedPrecompiledCode = FALSE);
static VOID SendHelperEvent(ULONGLONG ullHelperStartAddress, ULONG ulHelperSize, LPCWSTR pHelperName);
public:
typedef union _MethodStructs
GenericMethod=0x2,
SharedGenericCode=0x4,
JittedMethod=0x8,
- JitHelperMethod=0x10
+ JitHelperMethod=0x10,
+ ProfilerRejectedPrecompiledCode=0x20,
+ ReadyToRunRejectedPrecompiledCode=0x40,
}MethodFlags;
typedef enum _MethodExtent
}MethodStructs;
static VOID MethodJitting(MethodDesc *pMethodDesc, SString *namespaceOrClassName=NULL, SString *methodName=NULL, SString *methodSignature=NULL);
- static VOID MethodJitted(MethodDesc *pMethodDesc, SString *namespaceOrClassName=NULL, SString *methodName=NULL, SString *methodSignature=NULL, SIZE_T pCode = 0, ReJITID rejitID = 0);
+ static VOID MethodJitted(MethodDesc *pMethodDesc, SString *namespaceOrClassName=NULL, SString *methodName=NULL, SString *methodSignature=NULL, SIZE_T pCode = 0, ReJITID rejitID = 0, BOOL bProfilerRejectedPrecompiledCode = FALSE, BOOL bReadyToRunRejectedPrecompiledCode = FALSE);
static VOID StubInitialized(ULONGLONG ullHelperStartAddress, LPCWSTR pHelperName);
static VOID StubsInitialized(PVOID *pHelperStartAddresss, PVOID *pHelperNames, LONG ulNoOfHelpers);
static VOID MethodRestored(MethodDesc * pMethodDesc);
/*******************************************************/
/* This is called by the runtime when a method is jitted completely */
/*******************************************************/
-VOID ETW::MethodLog::MethodJitted(MethodDesc *pMethodDesc, SString *namespaceOrClassName, SString *methodName, SString *methodSignature, SIZE_T pCode, ReJITID rejitID)
+VOID ETW::MethodLog::MethodJitted(MethodDesc *pMethodDesc, SString *namespaceOrClassName, SString *methodName, SString *methodSignature, SIZE_T pCode, ReJITID rejitID, BOOL bProfilerRejectedPrecompiledCode, BOOL bReadyToRunRejectedPrecompiledCode)
{
CONTRACTL {
NOTHROW;
TRACE_LEVEL_INFORMATION,
CLR_JIT_KEYWORD))
{
- ETW::MethodLog::SendMethodEvent(pMethodDesc, ETW::EnumerationLog::EnumerationStructs::JitMethodLoad, TRUE, namespaceOrClassName, methodName, methodSignature, pCode, rejitID);
+ ETW::MethodLog::SendMethodEvent(pMethodDesc, ETW::EnumerationLog::EnumerationStructs::JitMethodLoad, TRUE, namespaceOrClassName, methodName, methodSignature, pCode, rejitID, bProfilerRejectedPrecompiledCode, bReadyToRunRejectedPrecompiledCode);
}
if(ETW_TRACING_CATEGORY_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_Context,
BOOL bIsCollectibleAssembly = pAssembly->IsCollectible();
BOOL bIsDomainNeutral = pAssembly->IsDomainNeutral() ;
BOOL bHasNativeImage = pAssembly->GetManifestFile()->HasNativeImage();
+ BOOL bIsReadyToRun = pAssembly->GetManifestFile()->IsILImageReadyToRun();
ULONGLONG ullAssemblyId = (ULONGLONG)pAssembly;
ULONGLONG ullDomainId = (ULONGLONG)pAssembly->GetDomain();
ULONG ulAssemblyFlags = ((bIsDomainNeutral ? ETW::LoaderLog::LoaderStructs::DomainNeutralAssembly : 0) |
(bIsDynamicAssembly ? ETW::LoaderLog::LoaderStructs::DynamicAssembly : 0) |
(bHasNativeImage ? ETW::LoaderLog::LoaderStructs::NativeAssembly : 0) |
- (bIsCollectibleAssembly ? ETW::LoaderLog::LoaderStructs::CollectibleAssembly : 0));
+ (bIsCollectibleAssembly ? ETW::LoaderLog::LoaderStructs::CollectibleAssembly : 0) |
+ (bIsReadyToRun ? ETW::LoaderLog::LoaderStructs::ReadyToRunAssembly : 0));
SString sAssemblyPath;
pAssembly->GetDisplayName(sAssemblyPath);
{
bIsIbcOptimized = pModule->IsIbcOptimized();
}
+ BOOL bIsReadyToRun = pModule->IsReadyToRun();
ULONG ulReservedFlags = 0;
ULONG ulFlags = ((bIsDomainNeutral ? ETW::LoaderLog::LoaderStructs::DomainNeutralModule : 0) |
(bHasNativeImage ? ETW::LoaderLog::LoaderStructs::NativeModule : 0) |
(bIsDynamicAssembly ? ETW::LoaderLog::LoaderStructs::DynamicModule : 0) |
(bIsManifestModule ? ETW::LoaderLog::LoaderStructs::ManifestModule : 0) |
- (bIsIbcOptimized ? ETW::LoaderLog::LoaderStructs::IbcOptimized : 0));
+ (bIsIbcOptimized ? ETW::LoaderLog::LoaderStructs::IbcOptimized : 0) |
+ (bIsReadyToRun ? ETW::LoaderLog::LoaderStructs::ReadyToRunModule : 0));
// Grab PDB path, guid, and age for managed PDB and native (NGEN) PDB when
// available. Any failures are not fatal. The corresponding PDB info will remain
/****************************************************************************/
/* This routine is used to send a method load/unload or rundown event */
/****************************************************************************/
-VOID ETW::MethodLog::SendMethodEvent(MethodDesc *pMethodDesc, DWORD dwEventOptions, BOOL bIsJit, SString *namespaceOrClassName, SString *methodName, SString *methodSignature, SIZE_T pCode, ReJITID rejitID)
+VOID ETW::MethodLog::SendMethodEvent(MethodDesc *pMethodDesc, DWORD dwEventOptions, BOOL bIsJit, SString *namespaceOrClassName, SString *methodName, SString *methodSignature, SIZE_T pCode, ReJITID rejitID, BOOL bProfilerRejectedPrecompiledCode, BOOL bReadyToRunRejectedPrecompiledCode)
{
CONTRACTL {
THROWS;
(bHasSharedGenericCode ? ETW::MethodLog::MethodStructs::SharedGenericCode : 0) |
(bIsGenericMethod ? ETW::MethodLog::MethodStructs::GenericMethod : 0) |
(bIsDynamicMethod ? ETW::MethodLog::MethodStructs::DynamicMethod : 0) |
- (bIsJit ? ETW::MethodLog::MethodStructs::JittedMethod : 0)));
+ (bIsJit ? ETW::MethodLog::MethodStructs::JittedMethod : 0) |
+ (bProfilerRejectedPrecompiledCode ? ETW::MethodLog::MethodStructs::ProfilerRejectedPrecompiledCode : 0) |
+ (bReadyToRunRejectedPrecompiledCode ? ETW::MethodLog::MethodStructs::ReadyToRunRejectedPrecompiledCode : 0)));
// Intentionally set the extent flags (cold vs. hot) only after all the other common
// flags (above) have been set.
private:
PCODE PrepareILBasedCode(PrepareCodeConfig* pConfig);
PCODE GetPrecompiledCode(PrepareCodeConfig* pConfig);
- PCODE GetPrecompiledNgenCode();
- PCODE GetPrecompiledR2RCode();
+ PCODE GetPrecompiledNgenCode(PrepareCodeConfig* pConfig);
+ PCODE GetPrecompiledR2RCode(PrepareCodeConfig* pConfig);
PCODE GetMulticoreJitCode();
COR_ILMETHOD_DECODER* GetAndVerifyILHeader(PrepareCodeConfig* pConfig, COR_ILMETHOD_DECODER* pIlDecoderMemory);
COR_ILMETHOD_DECODER* GetAndVerifyMetadataILHeader(PrepareCodeConfig* pConfig, COR_ILMETHOD_DECODER* pIlDecoderMemory);
virtual BOOL SetNativeCode(PCODE pCode, PCODE * ppAlternateCodeToUse);
virtual COR_ILMETHOD* GetILHeader();
virtual CORJIT_FLAGS GetJitCompilationFlags();
+ BOOL ProfilerRejectedPrecompiledCode();
+ BOOL ReadyToRunRejectedPrecompiledCode();
+ void SetProfilerRejectedPrecompiledCode();
+ void SetReadyToRunRejectedPrecompiledCode();
protected:
MethodDesc* m_pMethodDesc;
NativeCodeVersion m_nativeCodeVersion;
BOOL m_needsMulticoreJitNotification;
BOOL m_mayUsePrecompiledCode;
+ BOOL m_ProfilerRejectedPrecompiledCode;
+ BOOL m_ReadyToRunRejectedPrecompiledCode;
};
#ifdef FEATURE_CODE_VERSIONING
PCODE pCode = NULL;
#ifdef FEATURE_PREJIT
- pCode = GetPrecompiledNgenCode();
+ pCode = GetPrecompiledNgenCode(pConfig);
#endif
#ifdef FEATURE_READYTORUN
if (pCode == NULL)
{
- pCode = GetPrecompiledR2RCode();
+ pCode = GetPrecompiledR2RCode(pConfig);
if (pCode != NULL)
{
pConfig->SetNativeCode(pCode, &pCode);
return pCode;
}
-PCODE MethodDesc::GetPrecompiledNgenCode()
+PCODE MethodDesc::GetPrecompiledNgenCode(PrepareCodeConfig* pConfig)
{
STANDARD_VM_CONTRACT;
PCODE pCode = NULL;
{
SetNativeCodeInterlocked(NULL, pCode);
_ASSERTE(!IsPreImplemented());
+ pConfig->SetProfilerRejectedPrecompiledCode();
pCode = NULL;
}
}
}
-PCODE MethodDesc::GetPrecompiledR2RCode()
+PCODE MethodDesc::GetPrecompiledR2RCode(PrepareCodeConfig* pConfig)
{
STANDARD_VM_CONTRACT;
Module * pModule = GetModule();
if (pModule->IsReadyToRun())
{
- pCode = pModule->GetReadyToRunInfo()->GetEntryPoint(this);
+ pCode = pModule->GetReadyToRunInfo()->GetEntryPoint(this, pConfig);
}
#endif
return pCode;
&methodName,
&methodSignature,
pCode,
- pConfig->GetCodeVersion().GetVersionId());
+ pConfig->GetCodeVersion().GetVersionId(),
+ pConfig->ProfilerRejectedPrecompiledCode(),
+ pConfig->ReadyToRunRejectedPrecompiledCode());
}
}
m_pMethodDesc(codeVersion.GetMethodDesc()),
m_nativeCodeVersion(codeVersion),
m_needsMulticoreJitNotification(needsMulticoreJitNotification),
- m_mayUsePrecompiledCode(mayUsePrecompiledCode)
+ m_mayUsePrecompiledCode(mayUsePrecompiledCode),
+ m_ProfilerRejectedPrecompiledCode(FALSE),
+ m_ReadyToRunRejectedPrecompiledCode(FALSE)
{}
MethodDesc* PrepareCodeConfig::GetMethodDesc()
return m_needsMulticoreJitNotification;
}
+BOOL PrepareCodeConfig::ProfilerRejectedPrecompiledCode()
+{
+ LIMITED_METHOD_CONTRACT;
+ return m_ProfilerRejectedPrecompiledCode;
+}
+
+void PrepareCodeConfig::SetProfilerRejectedPrecompiledCode()
+{
+ LIMITED_METHOD_CONTRACT;
+ m_ProfilerRejectedPrecompiledCode = TRUE;
+}
+
+BOOL PrepareCodeConfig::ReadyToRunRejectedPrecompiledCode()
+{
+ LIMITED_METHOD_CONTRACT;
+ return m_ReadyToRunRejectedPrecompiledCode;
+}
+
+void PrepareCodeConfig::SetReadyToRunRejectedPrecompiledCode()
+{
+ LIMITED_METHOD_CONTRACT;
+ m_ReadyToRunRejectedPrecompiledCode = TRUE;
+}
+
NativeCodeVersion PrepareCodeConfig::GetCodeVersion()
{
LIMITED_METHOD_CONTRACT;
#include "compile.h"
#include "versionresilienthashcode.h"
#include "typehashingalgorithms.h"
+#include "method.hpp"
using namespace NativeFormat;
return true;
}
-PCODE ReadyToRunInfo::GetEntryPoint(MethodDesc * pMD, BOOL fFixups /*=TRUE*/)
+PCODE ReadyToRunInfo::GetEntryPoint(MethodDesc * pMD, PrepareCodeConfig* pConfig, BOOL fFixups /*=TRUE*/)
{
STANDARD_VM_CONTRACT;
}
if (!fShouldSearchCache)
{
+ pConfig->SetProfilerRejectedPrecompiledCode();
return NULL;
}
#endif // PROFILING_SUPPORTED
if (fFixups)
{
if (!m_pModule->FixupDelayList(dac_cast<TADDR>(m_pLayout->GetBase()) + offset))
+ {
+#ifndef CROSSGEN_COMPILE
+ pConfig->SetReadyToRunRejectedPrecompiledCode();
+#endif // CROSSGEN_COMPILE
return NULL;
+ }
}
id >>= 2;
typedef DPTR(struct READYTORUN_SECTION) PTR_READYTORUN_SECTION;
+class PrepareCodeConfig;
+
typedef DPTR(class ReadyToRunInfo) PTR_ReadyToRunInfo;
class ReadyToRunInfo
{
static PTR_ReadyToRunInfo Initialize(Module * pModule, AllocMemTracker *pamTracker);
- PCODE GetEntryPoint(MethodDesc * pMD, BOOL fFixups = TRUE);
+ PCODE GetEntryPoint(MethodDesc * pMD, PrepareCodeConfig* pConfig, BOOL fFixups = TRUE);
MethodDesc * GetMethodDescForEntryPoint(PCODE entryPoint);