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:
parent
6913cd88cb
commit
9e5a3cb399
@ -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.
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user