mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-14 14:24:10 +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)
|
if (wdStackFrame->mInInlineMethod)
|
||||||
{
|
{
|
||||||
WdStackFrame* nextStackFrame = mCallStack[actualStackFrameIdx - 1];
|
WdStackFrame* nextStackFrame = mCallStack[actualStackFrameIdx - 1];
|
||||||
auto subProgram = nextStackFrame->mSubProgram;
|
auto subProgram = nextStackFrame->mSubProgram;
|
||||||
|
|
||||||
|
_SetFlags(subProgram);
|
||||||
|
|
||||||
FixupLineDataForSubprogram(subProgram->mInlineeInfo->mRootInliner);
|
FixupLineDataForSubprogram(subProgram->mInlineeInfo->mRootInliner);
|
||||||
DbgSubprogram* parentSubprogram = subProgram->mInlineeInfo->mInlineParent; // Require it be in the inline parent
|
DbgSubprogram* parentSubprogram = subProgram->mInlineeInfo->mInlineParent; // Require it be in the inline parent
|
||||||
auto foundLine = parentSubprogram->FindClosestLine(subProgram->mBlock.mLowPC, &parentSubprogram);
|
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;
|
DbgSubprogram* dwSubprogram = wdStackFrame->mSubProgram;
|
||||||
if (dwSubprogram != NULL)
|
if (dwSubprogram != NULL)
|
||||||
{
|
{
|
||||||
if (dwSubprogram->mIsOptimized)
|
|
||||||
*outFlags |= FrameFlags_Optimized;
|
|
||||||
|
|
||||||
String demangledName;
|
String demangledName;
|
||||||
if ((dwSubprogram->mName != NULL) && (strncmp(dwSubprogram->mName, ":Sep@", 5) == 0))
|
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))
|
if ((dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Replaced) || (dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Invalid))
|
||||||
demangledName = "#" + demangledName;
|
demangledName = "#" + demangledName;
|
||||||
|
|
||||||
if (dbgModule->HasPendingDebugInfo())
|
_SetFlags(dwSubprogram);
|
||||||
*outFlags |= FrameFlags_HasPendingDebugInfo;
|
|
||||||
if (dbgModule->CanGetOldSource())
|
|
||||||
*outFlags |= FrameFlags_CanGetOldSource;
|
|
||||||
if ((dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Replaced) || (dwSubprogram->mHotReplaceKind == DbgSubprogram::HotReplaceKind_Invalid))
|
|
||||||
*outFlags |= FrameFlags_WasHotReplaced;
|
|
||||||
|
|
||||||
if ((dwLineData != NULL) && (dwSrcFile != NULL))
|
if ((dwLineData != NULL) && (dwSrcFile != NULL))
|
||||||
{
|
{
|
||||||
|
@ -10977,26 +10984,45 @@ String WinDebugger::Callstack_GetStackFrameOldFileInfo(int stackFrameIdx)
|
||||||
UpdateCallStackMethod(actualStackFrameIdx);
|
UpdateCallStackMethod(actualStackFrameIdx);
|
||||||
WdStackFrame* wdStackFrame = mCallStack[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;
|
DbgSubprogram* dwSubprogram = wdStackFrame->mSubProgram;
|
||||||
if (dwSubprogram != NULL)
|
if (dwSubprogram != NULL)
|
||||||
{
|
{
|
||||||
DbgSrcFile* dwSrcFile = NULL;
|
|
||||||
DbgLineData* dwLineData = NULL;
|
|
||||||
|
|
||||||
FixupLineDataForSubprogram(dwSubprogram);
|
FixupLineDataForSubprogram(dwSubprogram);
|
||||||
addr_target findAddress = wdStackFrame->GetSourcePC();
|
addr_target findAddress = wdStackFrame->GetSourcePC();
|
||||||
|
|
||||||
DbgSubprogram* dbgSubprogram = NULL;
|
DbgSubprogram* dbgSubprogram = NULL;
|
||||||
DbgSrcFile* dbgSrcFile = NULL;
|
DbgLineData* dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile);
|
||||||
dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile);
|
dbgModule = dwSubprogram->mCompileUnit->mDbgModule;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DbgModule* dbgModule = dwSubprogram->mCompileUnit->mDbgModule;
|
|
||||||
if (dbgSrcFile != NULL)
|
if (dbgSrcFile != NULL)
|
||||||
{
|
{
|
||||||
// Note: we must use mFilePath here, make sure we don't use GetLocalPath()
|
// Note: we must use mFilePath here, make sure we don't use GetLocalPath()
|
||||||
return dbgModule->GetOldSourceCommand(dbgSrcFile->mFilePath);
|
return dbgModule->GetOldSourceCommand(dbgSrcFile->mFilePath);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue