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

Commit 76fce77

Browse files
authored
Merge pull request #93 from dotdash/dbg_update
Backport a fix for duplicate debug data errors
2 parents c7a16bd + f6c8362 commit 76fce77

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)