diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 7150a09cd4c..3dc03d9fb19 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1272,18 +1272,36 @@ DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc, auto Value = getDebugLocValue(Begin); DebugLocEntry Loc(StartLabel, EndLabel, Value); - if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc)) { - // Add all values from still valid non-overlapping pieces. + bool couldMerge = false; + + // If this is a piece, it may belong to the current DebugLocEntry. + if (DIVar.isVariablePiece()) { + // Add this value to the list of open ranges. + OpenRanges.push_back(std::make_pair(DIVar, Value)); + + // Attempt to add the piece to the last entry. + if (!DebugLoc.empty()) + if (DebugLoc.back().MergeValues(Loc)) + couldMerge = true; + } + + if (!couldMerge) { + // Need to add a new DebugLocEntry. Add all values from still + // valid non-overlapping pieces. for (auto Range : OpenRanges) Loc.addValue(Range.second); DebugLoc.push_back(std::move(Loc)); } - // Add this value to the list of open ranges. - if (DIVar.isVariablePiece()) - OpenRanges.push_back(std::make_pair(DIVar, Value)); + + // Attempt to coalesce the ranges of two otherwise identical + // DebugLocEntries. + auto CurEntry = DebugLoc.rbegin(); + auto PrevEntry = std::next(CurEntry); + if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry)) + DebugLoc.pop_back(); DEBUG(dbgs() << "Values:\n"; - for (auto Value : DebugLoc.back().getValues()) + for (auto Value : CurEntry->getValues()) Value.getVariable()->dump(); dbgs() << "-----\n"); } |