mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fixed old-source-location for inlined methods
This commit is contained in:
parent
84aecbca81
commit
37ac89765f
1 changed files with 51 additions and 25 deletions
|
@ -10792,11 +10792,26 @@ String WinDebugger::GetStackFrameInfo(int stackFrameIdx, intptr* addr, String* o
|
|||
}
|
||||
};
|
||||
|
||||
auto _SetFlags = [&](DbgSubprogram* dwSubprogram)
|
||||
{
|
||||
DbgModule* dbgModule = dwSubprogram->mCompileUnit->mDbgModule;
|
||||
if (dwSubprogram->mIsOptimized)
|
||||
*outFlags |= FrameFlags_Optimized;
|
||||
if (dbgModule->HasPendingDebugInfo())
|
||||
*outFlags |= FrameFlags_HasPendingDebugInfo;
|
||||
if (dbgModule->CanGetOldSource())
|
||||
*outFlags |= FrameFlags_CanGetOldSource;
|
||||
if ((dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Replaced) || (dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Invalid))
|
||||
*outFlags |= FrameFlags_WasHotReplaced;
|
||||
};
|
||||
|
||||
if (wdStackFrame->mInInlineMethod)
|
||||
{
|
||||
WdStackFrame* nextStackFrame = mCallStack[actualStackFrameIdx - 1];
|
||||
auto subProgram = nextStackFrame->mSubProgram;
|
||||
|
||||
_SetFlags(subProgram);
|
||||
|
||||
FixupLineDataForSubprogram(subProgram->mInlineeInfo->mRootInliner);
|
||||
DbgSubprogram* parentSubprogram = subProgram->mInlineeInfo->mInlineParent; // Require it be in the inline parent
|
||||
auto foundLine = parentSubprogram->FindClosestLine(subProgram->mBlock.mLowPC, &parentSubprogram);
|
||||
|
@ -10836,9 +10851,6 @@ String WinDebugger::GetStackFrameInfo(int stackFrameIdx, intptr* addr, String* o
|
|||
DbgSubprogram* dwSubprogram = wdStackFrame->mSubProgram;
|
||||
if (dwSubprogram != NULL)
|
||||
{
|
||||
if (dwSubprogram->mIsOptimized)
|
||||
*outFlags |= FrameFlags_Optimized;
|
||||
|
||||
String demangledName;
|
||||
if ((dwSubprogram->mName != NULL) && (strncmp(dwSubprogram->mName, ":Sep@", 5) == 0))
|
||||
{
|
||||
|
@ -10894,12 +10906,7 @@ String WinDebugger::GetStackFrameInfo(int stackFrameIdx, intptr* addr, String* o
|
|||
if ((dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Replaced) || (dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Invalid))
|
||||
demangledName = "#" + demangledName;
|
||||
|
||||
if (dbgModule->HasPendingDebugInfo())
|
||||
*outFlags |= FrameFlags_HasPendingDebugInfo;
|
||||
if (dbgModule->CanGetOldSource())
|
||||
*outFlags |= FrameFlags_CanGetOldSource;
|
||||
if ((dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Replaced) || (dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Invalid))
|
||||
*outFlags |= FrameFlags_WasHotReplaced;
|
||||
_SetFlags(dwSubprogram);
|
||||
|
||||
if ((dwLineData != NULL) && (dwSrcFile != NULL))
|
||||
{
|
||||
|
@ -10977,26 +10984,45 @@ String WinDebugger::Callstack_GetStackFrameOldFileInfo(int stackFrameIdx)
|
|||
UpdateCallStackMethod(actualStackFrameIdx);
|
||||
WdStackFrame* wdStackFrame = mCallStack[actualStackFrameIdx];
|
||||
|
||||
DbgModule* dbgModule = NULL;
|
||||
DbgSrcFile* dbgSrcFile = NULL;
|
||||
|
||||
if (wdStackFrame->mInInlineMethod)
|
||||
{
|
||||
WdStackFrame* nextStackFrame = mCallStack[actualStackFrameIdx - 1];
|
||||
auto subProgram = nextStackFrame->mSubProgram;
|
||||
dbgModule = subProgram->mCompileUnit->mDbgModule;
|
||||
|
||||
FixupLineDataForSubprogram(subProgram->mInlineeInfo->mRootInliner);
|
||||
DbgSubprogram* parentSubprogram = subProgram->mInlineeInfo->mInlineParent; // Require it be in the inline parent
|
||||
auto foundLine = parentSubprogram->FindClosestLine(subProgram->mBlock.mLowPC, &parentSubprogram);
|
||||
if (foundLine != NULL)
|
||||
dbgSrcFile = parentSubprogram->GetLineSrcFile(*foundLine);
|
||||
|
||||
DbgSubprogram* callingSubProgram = NULL;
|
||||
DbgLineData* callingLineData = FindLineDataAtAddress(nextStackFrame->mSubProgram->mBlock.mLowPC - 1, &callingSubProgram);
|
||||
if ((callingLineData != NULL) && (callingSubProgram == wdStackFrame->mSubProgram))
|
||||
dbgSrcFile = callingSubProgram->GetLineSrcFile(*callingLineData);
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgSubprogram* dwSubprogram = wdStackFrame->mSubProgram;
|
||||
if (dwSubprogram != NULL)
|
||||
{
|
||||
DbgSrcFile* dwSrcFile = NULL;
|
||||
DbgLineData* dwLineData = NULL;
|
||||
|
||||
FixupLineDataForSubprogram(dwSubprogram);
|
||||
addr_target findAddress = wdStackFrame->GetSourcePC();
|
||||
|
||||
DbgSubprogram* dbgSubprogram = NULL;
|
||||
DbgSrcFile* dbgSrcFile = NULL;
|
||||
dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile);
|
||||
DbgLineData* dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile);
|
||||
dbgModule = dwSubprogram->mCompileUnit->mDbgModule;
|
||||
}
|
||||
}
|
||||
|
||||
DbgModule* dbgModule = dwSubprogram->mCompileUnit->mDbgModule;
|
||||
if (dbgSrcFile != NULL)
|
||||
{
|
||||
// Note: we must use mFilePath here, make sure we don't use GetLocalPath()
|
||||
return dbgModule->GetOldSourceCommand(dbgSrcFile->mFilePath);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue