1
0
Fork 0
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:
Brian Fiete 2020-05-25 00:10:56 -07:00
parent 84aecbca81
commit 37ac89765f

View file

@ -10791,12 +10791,27 @@ String WinDebugger::GetStackFrameInfo(int stackFrameIdx, intptr* addr, String* o
srcFile->GetHash(outStr); srcFile->GetHash(outStr);
} }
}; };
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];
DbgSubprogram* dwSubprogram = wdStackFrame->mSubProgram; DbgModule* dbgModule = NULL;
if (dwSubprogram != NULL) DbgSrcFile* dbgSrcFile = NULL;
{
DbgSrcFile* dwSrcFile = NULL;
DbgLineData* dwLineData = NULL;
FixupLineDataForSubprogram(dwSubprogram); if (wdStackFrame->mInInlineMethod)
addr_target findAddress = wdStackFrame->GetSourcePC(); {
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* dbgSubprogram = NULL; DbgSubprogram* callingSubProgram = NULL;
DbgSrcFile* dbgSrcFile = NULL; DbgLineData* callingLineData = FindLineDataAtAddress(nextStackFrame->mSubProgram->mBlock.mLowPC - 1, &callingSubProgram);
dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile); if ((callingLineData != NULL) && (callingSubProgram == wdStackFrame->mSubProgram))
dbgSrcFile = callingSubProgram->GetLineSrcFile(*callingLineData);
}
else
{
DbgSubprogram* dwSubprogram = wdStackFrame->mSubProgram;
if (dwSubprogram != NULL)
{
FixupLineDataForSubprogram(dwSubprogram);
addr_target findAddress = wdStackFrame->GetSourcePC();
DbgModule* dbgModule = dwSubprogram->mCompileUnit->mDbgModule; DbgSubprogram* dbgSubprogram = NULL;
if (dbgSrcFile != NULL) DbgLineData* dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile);
{ dbgModule = dwSubprogram->mCompileUnit->mDbgModule;
// Note: we must use mFilePath here, make sure we don't use GetLocalPath()
return dbgModule->GetOldSourceCommand(dbgSrcFile->mFilePath);
} }
} }
if (dbgSrcFile != NULL)
{
// Note: we must use mFilePath here, make sure we don't use GetLocalPath()
return dbgModule->GetOldSourceCommand(dbgSrcFile->mFilePath);
}
return ""; return "";
} }