Skip to content

Commit bebb613

Browse files
authored
Avoid redundant GetRVA calls when fetching IL header (#118318)
Change more places to use MethodDesc::MayHaveILHeader introduced by recent PR
1 parent 94c22bb commit bebb613

File tree

4 files changed

+28
-18
lines changed

4 files changed

+28
-18
lines changed

src/coreclr/debug/daccess/task.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3573,13 +3573,13 @@ ClrDataMethodDefinition::GetIlMethod(void)
35733573
{
35743574
if (m_methodDesc)
35753575
{
3576-
if (!m_methodDesc->HasILHeader())
3576+
if (m_methodDesc->MayHaveILHeader())
35773577
{
3578-
return NULL;
3578+
return m_methodDesc->GetILHeader();
35793579
}
35803580
else
35813581
{
3582-
return m_methodDesc->GetILHeader();
3582+
return NULL;
35833583
}
35843584
}
35853585
else

src/coreclr/vm/jitinterface.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7680,10 +7680,11 @@ CEEInfo::getMethodInfo(
76807680
JIT_TO_EE_TRANSITION();
76817681

76827682
MethodDesc* ftn = GetMethod(ftnHnd);
7683-
if (ftn->HasILHeader())
7683+
COR_ILMETHOD* pILHeader;
7684+
if (ftn->MayHaveILHeader() && (pILHeader = ftn->GetILHeader()) != NULL)
76847685
{
76857686
// Get the IL header and set it.
7686-
COR_ILMETHOD_DECODER header(ftn->GetILHeader(), ftn->GetMDImport(), NULL);
7687+
COR_ILMETHOD_DECODER header(pILHeader, ftn->GetMDImport(), NULL);
76877688
getMethodInfoWorker(ftn, &header, methInfo, context);
76887689
result = true;
76897690
}
@@ -7861,9 +7862,10 @@ CorInfoInline CEEInfo::canInline (CORINFO_METHOD_HANDLE hCaller,
78617862

78627863
if (pRootModule->IsRuntimeWrapExceptions() != pCalleeModule->IsRuntimeWrapExceptions())
78637864
{
7864-
if (pCallee->HasILHeader())
7865+
COR_ILMETHOD* pILHeader;
7866+
if (pCallee->MayHaveILHeader() && (pILHeader = pCallee->GetILHeader()) != NULL)
78657867
{
7866-
COR_ILMETHOD_DECODER header(pCallee->GetILHeader(), pCallee->GetMDImport(), NULL);
7868+
COR_ILMETHOD_DECODER header(pILHeader, pCallee->GetMDImport(), NULL);
78677869
if (header.EHCount() > 0)
78687870
{
78697871
result = INLINE_FAIL;
@@ -12771,6 +12773,8 @@ void CEECodeGenInfo::getEHinfo(
1277112773
JIT_TO_EE_TRANSITION();
1277212774

1277312775
MethodDesc* pMD = GetMethod(ftn);
12776+
12777+
COR_ILMETHOD* pILHeader;
1277412778
if (IsDynamicMethodHandle(ftn))
1277512779
{
1277612780
pMD->AsDynamicMethodDesc()->GetResolver()->GetEHInfo(EHnumber, clause);
@@ -12779,9 +12783,9 @@ void CEECodeGenInfo::getEHinfo(
1277912783
{
1278012784
getEHinfoHelper(ftn, EHnumber, clause, m_ILHeader);
1278112785
}
12782-
else if (pMD->HasILHeader())
12786+
else if (pMD->MayHaveILHeader() && (pILHeader = pMD->GetILHeader()) != NULL)
1278312787
{
12784-
COR_ILMETHOD_DECODER header(pMD->GetILHeader(), pMD->GetMDImport(), NULL);
12788+
COR_ILMETHOD_DECODER header(pILHeader, pMD->GetMDImport(), NULL);
1278512789
getEHinfoHelper(ftn, EHnumber, clause, &header);
1278612790
}
1278712791
else if (pMD->IsIL())

src/coreclr/vm/method.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,14 +1188,20 @@ COR_ILMETHOD* MethodDesc::GetILHeader()
11881188
}
11891189
CONTRACTL_END
11901190

1191+
RVA rva = GetRVA();
1192+
if (rva == 0)
1193+
{
1194+
return NULL;
1195+
}
1196+
11911197
Module *pModule = GetModule();
11921198

11931199
// Always pickup overrides like reflection emit, EnC, etc.
11941200
TADDR pIL = pModule->GetDynamicIL(GetMemberDef());
11951201

11961202
if (pIL == (TADDR)NULL)
11971203
{
1198-
pIL = pModule->GetIL(GetRVA());
1204+
pIL = pModule->GetIL(rva);
11991205
}
12001206

12011207
#ifdef _DEBUG_IMPL

src/coreclr/vm/versionresilienthashcode.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ bool GetVersionResilientILCodeHashCode(MethodDesc *pMD, int* hashCode, unsigned*
368368
{
369369
uint32_t maxStack;
370370
uint32_t EHCount;
371+
COR_ILMETHOD* pILHeader;
371372
const BYTE* pILCode;
372373
uint32_t cbILCode;
373374
bool initLocals;
@@ -388,15 +389,9 @@ bool GetVersionResilientILCodeHashCode(MethodDesc *pMD, int* hashCode, unsigned*
388389

389390
initLocals = (options & CORINFO_OPT_INIT_LOCALS) == CORINFO_OPT_INIT_LOCALS;
390391
}
391-
else if (!pMD->HasILHeader())
392+
else if (pMD->MayHaveILHeader() && (pILHeader = pMD->GetILHeader()) != NULL)
392393
{
393-
// Dynamically generated IL methods like UnsafeAccessors may not have
394-
// an IL header.
395-
return false;
396-
}
397-
else
398-
{
399-
COR_ILMETHOD_DECODER header(pMD->GetILHeader(), pMD->GetMDImport(), NULL);
394+
COR_ILMETHOD_DECODER header(pILHeader, pMD->GetMDImport(), NULL);
400395

401396
pILCode = header.Code;
402397
cbILCode = header.GetCodeSize();
@@ -422,6 +417,11 @@ bool GetVersionResilientILCodeHashCode(MethodDesc *pMD, int* hashCode, unsigned*
422417
// Do not hash the classToken field, as is possibly token dependent
423418
}
424419
}
420+
else
421+
{
422+
// Dynamically generated IL methods like UnsafeAccessors are not handled yet.
423+
return false;
424+
}
425425

426426
hashILData.Add(maxStack);
427427
hashILData.Add(EHCount);

0 commit comments

Comments
 (0)