From 37ac89765f25603f2d6faf77300c857782401ca8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 25 May 2020 00:10:56 -0700 Subject: [PATCH] Fixed old-source-location for inlined methods --- IDEHelper/WinDebugger.cpp | 76 ++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/IDEHelper/WinDebugger.cpp b/IDEHelper/WinDebugger.cpp index f5376765..30a531c4 100644 --- a/IDEHelper/WinDebugger.cpp +++ b/IDEHelper/WinDebugger.cpp @@ -10791,12 +10791,27 @@ String WinDebugger::GetStackFrameInfo(int stackFrameIdx, intptr* addr, String* o 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) { 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]; - DbgSubprogram* dwSubprogram = wdStackFrame->mSubProgram; - if (dwSubprogram != NULL) - { - DbgSrcFile* dwSrcFile = NULL; - DbgLineData* dwLineData = NULL; + DbgModule* dbgModule = NULL; + DbgSrcFile* dbgSrcFile = NULL; - FixupLineDataForSubprogram(dwSubprogram); - addr_target findAddress = wdStackFrame->GetSourcePC(); + 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* dbgSubprogram = NULL; - DbgSrcFile* dbgSrcFile = NULL; - dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile); + 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) + { + FixupLineDataForSubprogram(dwSubprogram); + addr_target findAddress = wdStackFrame->GetSourcePC(); - 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); + DbgSubprogram* dbgSubprogram = NULL; + DbgLineData* dwLineData = dwSubprogram->FindClosestLine(findAddress, &dbgSubprogram, &dbgSrcFile); + 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 ""; }