1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

[DebugInfo] Pass all values in DebugLocEntry's constructor, NFC

Summary:
With MergeValues() removed, amend DebugLocEntry's constructor so that it
takes multiple values rather than a single, and keep non-fragment values
in OpenRanges, as this allows some cleanup of the code in
buildLocationList().

Reviewers: aprantl, dblaikie, loladiro

Reviewed By: aprantl

Subscribers: hiraditya, llvm-commits

Tags: #debug-info, #llvm

Differential Revision: https://reviews.llvm.org/D59303

llvm-svn: 357988
This commit is contained in:
David Stenberg 2019-04-09 10:08:26 +00:00
parent 6913cd88cb
commit 9e5a3cb399
2 changed files with 16 additions and 24 deletions

View File

@ -100,9 +100,13 @@ private:
SmallVector<Value, 1> Values; SmallVector<Value, 1> Values;
public: public:
DebugLocEntry(const MCSymbol *B, const MCSymbol *E, Value Val) /// Create a location list entry for the range [\p Begin, \p End).
: Begin(B), End(E) { ///
Values.push_back(std::move(Val)); /// \param Vals One or more values describing (parts of) the variable.
DebugLocEntry(const MCSymbol *Begin, const MCSymbol *End,
ArrayRef<Value> Vals)
: Begin(Begin), End(End) {
addValues(Vals);
} }
/// Attempt to merge this DebugLocEntry with Next and return /// Attempt to merge this DebugLocEntry with Next and return
@ -124,9 +128,10 @@ public:
void addValues(ArrayRef<DebugLocEntry::Value> Vals) { void addValues(ArrayRef<DebugLocEntry::Value> Vals) {
Values.append(Vals.begin(), Vals.end()); Values.append(Vals.begin(), Vals.end());
sortUniqueValues(); sortUniqueValues();
assert(all_of(Values, [](DebugLocEntry::Value V) { assert((Values.size() == 1 ||
return V.isFragment(); all_of(Values,
}) && "value must be a piece"); [](DebugLocEntry::Value V) { return V.isFragment(); })) &&
"must either have a single value or multiple pieces");
} }
// Sort the pieces by offset. // Sort the pieces by offset.

View File

@ -1134,7 +1134,7 @@ DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
continue; 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(); const DIExpression *DIExpr = Begin->getDebugExpression();
auto Last = remove_if(OpenRanges, [&](DebugLocEntry::Value R) { auto Last = remove_if(OpenRanges, [&](DebugLocEntry::Value R) {
return DIExpr->fragmentsOverlap(R.getExpression()); return DIExpr->fragmentsOverlap(R.getExpression());
@ -1156,30 +1156,15 @@ DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
LLVM_DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n"); LLVM_DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
auto Value = getDebugLocValue(Begin); auto Value = getDebugLocValue(Begin);
OpenRanges.push_back(Value);
// Omit entries with empty ranges as they do not have any effect in DWARF. // Omit entries with empty ranges as they do not have any effect in DWARF.
if (StartLabel == EndLabel) { 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"); LLVM_DEBUG(dbgs() << "Omitting location list entry with empty range.\n");
continue; continue;
} }
DebugLocEntry Loc(StartLabel, EndLabel, Value); DebugLoc.emplace_back(StartLabel, EndLabel, OpenRanges);
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));
// Attempt to coalesce the ranges of two otherwise identical // Attempt to coalesce the ranges of two otherwise identical
// DebugLocEntries. // DebugLocEntries.
@ -1962,6 +1947,8 @@ void DebugLocEntry::finalize(const AsmPrinter &AP,
DebugLocStream::ListBuilder &List, DebugLocStream::ListBuilder &List,
const DIBasicType *BT, const DIBasicType *BT,
DwarfCompileUnit &TheCU) { DwarfCompileUnit &TheCU) {
assert(!Values.empty() &&
"location list entries without values are redundant");
assert(Begin != End && "unexpected location list entry with empty range"); assert(Begin != End && "unexpected location list entry with empty range");
DebugLocStream::EntryBuilder Entry(List, Begin, End); DebugLocStream::EntryBuilder Entry(List, Begin, End);
BufferByteStreamer Streamer = Entry.getStreamer(); BufferByteStreamer Streamer = Entry.getStreamer();