| 11564 | } |
| 11565 | |
| 11566 | void WinDebugger::GetCodeAddrInfo(intptr addr, intptr inlineCallAddr, String* outFile, int* outHotIdx, int* outDefLineStart, int* outDefLineEnd, int* outLine, int* outColumn) |
| 11567 | { |
| 11568 | AutoCrit autoCrit(mDebugManager->mCritSect); |
| 11569 | |
| 11570 | DbgSubprogram* subProgram = NULL; |
| 11571 | DbgLineData* callingLineData = FindLineDataAtAddress((addr_target)addr, &subProgram); |
| 11572 | |
| 11573 | if (inlineCallAddr != 0) |
| 11574 | { |
| 11575 | auto inlinedSubProgram = mDebugTarget->FindSubProgram(inlineCallAddr); |
| 11576 | if (inlinedSubProgram != 0) |
| 11577 | { |
| 11578 | FixupLineDataForSubprogram(inlinedSubProgram->mInlineeInfo->mRootInliner); |
| 11579 | DbgSubprogram* parentSubprogram = inlinedSubProgram->mInlineeInfo->mInlineParent; // Require it be in the inline parent |
| 11580 | auto foundLine = parentSubprogram->FindClosestLine(inlinedSubProgram->mBlock.mLowPC, &parentSubprogram); |
| 11581 | if (foundLine != NULL) |
| 11582 | { |
| 11583 | auto srcFile = parentSubprogram->GetLineSrcFile(*foundLine); |
| 11584 | *outFile = srcFile->GetLocalPath(); |
| 11585 | *outLine = foundLine->mLine; |
| 11586 | } |
| 11587 | |
| 11588 | *outHotIdx = inlinedSubProgram->mCompileUnit->mDbgModule->mHotIdx; |
| 11589 | *outColumn = -1; |
| 11590 | |
| 11591 | DbgSubprogram* callingSubProgram = NULL; |
| 11592 | DbgLineData* callingLineData = FindLineDataAtAddress(inlinedSubProgram->mBlock.mLowPC - 1, &callingSubProgram); |
| 11593 | if ((callingLineData != NULL) && (callingSubProgram == subProgram)) |
| 11594 | { |
| 11595 | auto callingSrcFile = callingSubProgram->GetLineSrcFile(*callingLineData); |
| 11596 | auto srcFile = callingSrcFile; |
| 11597 | *outFile = srcFile->GetLocalPath(); |
| 11598 | |
| 11599 | if (*outLine == callingLineData->mLine) |
| 11600 | *outColumn = callingLineData->mColumn; |
| 11601 | } |
| 11602 | return; |
| 11603 | } |
| 11604 | } |
| 11605 | |
| 11606 | if (subProgram != NULL) |
| 11607 | { |
| 11608 | if ((subProgram->mInlineeInfo != NULL) && ((addr_target)addr >= subProgram->mBlock.mHighPC)) |
| 11609 | callingLineData = &subProgram->mInlineeInfo->mLastLineData; |
| 11610 | |
| 11611 | *outHotIdx = subProgram->mCompileUnit->mDbgModule->mHotIdx; |
| 11612 | *outFile = subProgram->GetLineSrcFile(*callingLineData)->GetLocalPath(); |
| 11613 | *outLine = callingLineData->mLine; |
| 11614 | *outColumn = callingLineData->mColumn; |
| 11615 | |
| 11616 | FixupLineDataForSubprogram(subProgram); |
| 11617 | DbgLineData* dwStartLineData = NULL; |
| 11618 | DbgLineData* dwEndLineData = NULL; |
| 11619 | if (subProgram->mLineInfo != NULL) |
| 11620 | { |
| 11621 | if (subProgram->mLineInfo->mLines.size() > 0) |
| 11622 | { |
| 11623 | dwStartLineData = &subProgram->mLineInfo->mLines[0]; |
no test coverage detected