@@ -205,9 +205,34 @@ ArrayRef<DbgVariable::FrameIndexExpr> DbgVariable::getFrameIndexExprs() const {
205
205
return A.Expr ->getFragmentInfo ()->OffsetInBits <
206
206
B.Expr ->getFragmentInfo ()->OffsetInBits ;
207
207
});
208
+
208
209
return FrameIndexExprs;
209
210
}
210
211
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
+
211
236
static const DwarfAccelTable::Atom TypeAtoms[] = {
212
237
DwarfAccelTable::Atom (dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
213
238
DwarfAccelTable::Atom (dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
0 commit comments