Index: lib/CodeGen/AsmPrinter/DebugLocEntry.h =================================================================== --- lib/CodeGen/AsmPrinter/DebugLocEntry.h +++ lib/CodeGen/AsmPrinter/DebugLocEntry.h @@ -100,9 +100,13 @@ SmallVector Values; public: - DebugLocEntry(const MCSymbol *B, const MCSymbol *E, Value Val) - : Begin(B), End(E) { - Values.push_back(std::move(Val)); + /// Create a location list entry for the range [\p Begin, \p End). + /// + /// \param Vals One or more values describing (parts of) the variable. + DebugLocEntry(const MCSymbol *Begin, const MCSymbol *End, + ArrayRef Vals) + : Begin(Begin), End(End) { + addValues(Vals); } /// Attempt to merge this DebugLocEntry with Next and return @@ -124,9 +128,10 @@ void addValues(ArrayRef Vals) { Values.append(Vals.begin(), Vals.end()); sortUniqueValues(); - assert(all_of(Values, [](DebugLocEntry::Value V) { - return V.isFragment(); - }) && "value must be a piece"); + assert((Values.size() == 1 || + all_of(Values, + [](DebugLocEntry::Value V) { return V.isFragment(); })) && + "must either have a single value or multiple pieces"); } // Sort the pieces by offset. Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1134,7 +1134,7 @@ continue; } - // If this fragment overlaps with any open ranges, truncate them. + // If this debug value overlaps with any open ranges, truncate them. const DIExpression *DIExpr = Begin->getDebugExpression(); auto Last = remove_if(OpenRanges, [&](DebugLocEntry::Value R) { return DIExpr->fragmentsOverlap(R.getExpression()); @@ -1156,30 +1156,15 @@ LLVM_DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n"); auto Value = getDebugLocValue(Begin); + OpenRanges.push_back(Value); // Omit entries with empty ranges as they do not have any effect in DWARF. if (StartLabel == EndLabel) { - // If this is a fragment, we must still add the value to the list of - // open ranges, since it may describe non-overlapping parts of the - // variable. - if (DIExpr->isFragment()) - OpenRanges.push_back(Value); LLVM_DEBUG(dbgs() << "Omitting location list entry with empty range.\n"); continue; } - DebugLocEntry Loc(StartLabel, EndLabel, Value); - - if (DIExpr->isFragment()) { - // Add this value to the list of open ranges. - OpenRanges.push_back(Value); - } - - // Add all values from still valid non-overlapping fragments. - if (OpenRanges.size()) - Loc.addValues(OpenRanges); - - DebugLoc.push_back(std::move(Loc)); + DebugLoc.emplace_back(StartLabel, EndLabel, OpenRanges); // Attempt to coalesce the ranges of two otherwise identical // DebugLocEntries. @@ -1962,6 +1947,8 @@ DebugLocStream::ListBuilder &List, const DIBasicType *BT, DwarfCompileUnit &TheCU) { + assert(!Values.empty() && + "location list entries without values are redundant"); assert(Begin != End && "unexpected location list entry with empty range"); DebugLocStream::EntryBuilder Entry(List, Begin, End); BufferByteStreamer Streamer = Entry.getStreamer();