| 790 | } |
| 791 | |
| 792 | DbgSubprogram* DebugTarget::FindSubProgram(addr_target pc, DbgOnDemandKind onDemandKind) |
| 793 | { |
| 794 | BP_ZONE("WinDebugger::FindSubProgram"); |
| 795 | |
| 796 | for (int pass = 0; pass < 2; pass++) |
| 797 | { |
| 798 | int mapBlockSize = 1 << DbgRadixMap<DbgSubprogramMapEntry*>::BLOCK_SHIFT; |
| 799 | |
| 800 | DbgSubprogram* foundSubprogram = NULL; |
| 801 | |
| 802 | // Even though the radix map is LIFO, we might find an inline parent in an earlier block |
| 803 | // so we can't terminate the search until we exhaust the lookup |
| 804 | addr_target bestStart = 0; |
| 805 | for (int offset = 0; offset < DBG_MAX_LOOKBACK; offset += mapBlockSize) |
| 806 | { |
| 807 | DbgSubprogramMapEntry* subprogramMapEntry = mSubprogramMap.FindFirstLeafAt(pc - offset); |
| 808 | while (subprogramMapEntry != NULL) |
| 809 | { |
| 810 | auto dwSubprogram = subprogramMapEntry->mEntry; |
| 811 | if ((pc >= dwSubprogram->mBlock.mLowPC) && (pc < dwSubprogram->mBlock.mHighPC) && (dwSubprogram->mBlock.mLowPC > bestStart)) |
| 812 | { |
| 813 | if ((dwSubprogram->mLineInfo != NULL) && (dwSubprogram->mLineInfo->mHasInlinees)) |
| 814 | { |
| 815 | if (dwSubprogram->mNeedLineDataFixup) |
| 816 | mDebugger->FixupLineDataForSubprogram(dwSubprogram); |
| 817 | |
| 818 | DbgSubprogram* inlinedSubprogram = NULL; |
| 819 | if (dwSubprogram->FindClosestLine(pc, &inlinedSubprogram) != NULL) |
| 820 | { |
| 821 | return inlinedSubprogram; |
| 822 | } |
| 823 | } |
| 824 | |
| 825 | /*bool inGap = false; |
| 826 | if (dwSubprogram->mHasLineGaps) |
| 827 | { |
| 828 | mDebugger->FixupLineDataForSubprogram(dwSubprogram); |
| 829 | auto lineData = dwSubprogram->FindClosestLine(pc, 0, true); |
| 830 | inGap == (lineData == NULL) || (lineData->mLine == -1); |
| 831 | } |
| 832 | |
| 833 | if (!inGap) |
| 834 | { |
| 835 | foundSubprogram = dwSubprogram; |
| 836 | bestStart = dwSubprogram->mBlock.mLowPC; |
| 837 | } |
| 838 | else |
| 839 | { |
| 840 | }*/ |
| 841 | |
| 842 | return dwSubprogram; |
| 843 | //foundSubprogram = dwSubprogram; |
| 844 | //bestStart = dwSubprogram->mBlock.mLowPC; |
| 845 | } |
| 846 | subprogramMapEntry = subprogramMapEntry->mNext; |
| 847 | } |
| 848 | } |
| 849 | if (foundSubprogram != NULL) |
no test coverage detected