Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit f6c8362

Browse files
Björn Steinbrinkdotdash
Björn Steinbrink
authored andcommitted
Ignore all duplicate frame index expression
Some passes might duplicate calls to llvm.dbg.declare creating duplicate frame index expression which currently trigger an assertion which is meant to catch erroneous, overlapping fragment declarations. But identical frame index expressions are just redundant and don't actually conflict with each other, so we can be more lenient and just ignore the duplicates. Reviewers: aprantl, rnk Subscribers: llvm-commits, JDevlieghere Differential Revision: https://reviews.llvm.org/D38540
1 parent c7a16bd commit f6c8362

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

lib/CodeGen/AsmPrinter/DwarfDebug.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,34 @@ ArrayRef<DbgVariable::FrameIndexExpr> DbgVariable::getFrameIndexExprs() const {
205205
return A.Expr->getFragmentInfo()->OffsetInBits <
206206
B.Expr->getFragmentInfo()->OffsetInBits;
207207
});
208+
208209
return FrameIndexExprs;
209210
}
210211

212+
void DbgVariable::addMMIEntry(const DbgVariable &V) {
213+
assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
214+
assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
215+
assert(V.Var == Var && "conflicting variable");
216+
assert(V.IA == IA && "conflicting inlined-at location");
217+
218+
assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
219+
assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
220+
221+
for (const auto &FIE : V.FrameIndexExprs)
222+
// Ignore duplicate entries.
223+
if (llvm::none_of(FrameIndexExprs, [&](const FrameIndexExpr &Other) {
224+
return FIE.FI == Other.FI && FIE.Expr == Other.Expr;
225+
}))
226+
FrameIndexExprs.push_back(FIE);
227+
228+
assert((FrameIndexExprs.size() == 1 ||
229+
llvm::all_of(FrameIndexExprs,
230+
[](FrameIndexExpr &FIE) {
231+
return FIE.Expr && FIE.Expr->isFragment();
232+
})) &&
233+
"conflicting locations for variable");
234+
}
235+
211236
static const DwarfAccelTable::Atom TypeAtoms[] = {
212237
DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
213238
DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),

lib/CodeGen/AsmPrinter/DwarfDebug.h

+1-17
Original file line numberDiff line numberDiff line change
@@ -124,23 +124,7 @@ class DbgVariable {
124124
/// Get the FI entries, sorted by fragment offset.
125125
ArrayRef<FrameIndexExpr> getFrameIndexExprs() const;
126126
bool hasFrameIndexExprs() const { return !FrameIndexExprs.empty(); }
127-
128-
void addMMIEntry(const DbgVariable &V) {
129-
assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
130-
assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
131-
assert(V.Var == Var && "conflicting variable");
132-
assert(V.IA == IA && "conflicting inlined-at location");
133-
134-
assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
135-
assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
136-
137-
FrameIndexExprs.append(V.FrameIndexExprs.begin(), V.FrameIndexExprs.end());
138-
assert(all_of(FrameIndexExprs,
139-
[](FrameIndexExpr &FIE) {
140-
return FIE.Expr && FIE.Expr->isFragment();
141-
}) &&
142-
"conflicting locations for variable");
143-
}
127+
void addMMIEntry(const DbgVariable &V);
144128

145129
// Translate tag to proper Dwarf tag.
146130
dwarf::Tag getTag() const {

0 commit comments

Comments
 (0)