// Hash the contents of a loclistptr class.
void DIEHash::hashLocList(const DIELocList &LocList) {
- SmallVectorImpl<DebugLocEntry>::const_iterator Start =
- AP->getDwarfDebug()->getDebugLocEntries().begin();
- Start += LocList.getValue();
HashingByteStreamer Streamer(*this);
- for (SmallVectorImpl<DebugLocEntry>::const_iterator
- I = Start,
- E = AP->getDwarfDebug()->getDebugLocEntries().end();
- I != E; ++I) {
- const DebugLocEntry &Entry = *I;
- // Go through the entries until we hit the end of the list,
- // which is the next empty entry.
- if (Entry.isEmpty())
- return;
- else
- AP->getDwarfDebug()->emitDebugLocEntry(Streamer, Entry);
- }
+ for (const auto &Entry :
+ AP->getDwarfDebug()->getDebugLocEntries()[LocList.getValue()])
+ AP->getDwarfDebug()->emitDebugLocEntry(Streamer, Entry);
}
// Hash an individual attribute \param Attr based on the type of attribute and
// Handle multiple DBG_VALUE instructions describing one variable.
RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
+ SmallVector<DebugLocEntry, 4> DebugLoc;
for (SmallVectorImpl<const MachineInstr *>::const_iterator
HI = History.begin(),
HE = History.end();
LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
DebugLocEntry Loc = getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU);
- if (DotDebugLocEntries.empty() || !DotDebugLocEntries.back().Merge(Loc))
- DotDebugLocEntries.push_back(std::move(Loc));
+ if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
+ DebugLoc.push_back(std::move(Loc));
}
- DotDebugLocEntries.push_back(DebugLocEntry());
+ DotDebugLocEntries.push_back(std::move(DebugLoc));
}
// Collect info for variables that were optimized out.
Asm->OutStreamer.SwitchSection(
Asm->getObjFileLowering().getDwarfLocSection());
unsigned char Size = Asm->getDataLayout().getPointerSize();
- Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
- unsigned index = 1;
- for (SmallVectorImpl<DebugLocEntry>::const_iterator
- I = DotDebugLocEntries.begin(),
- E = DotDebugLocEntries.end();
- I != E; ++I, ++index) {
- const DebugLocEntry &Entry = *I;
-
- if (Entry.isEmpty()) {
- Asm->OutStreamer.EmitIntValue(0, Size);
- Asm->OutStreamer.EmitIntValue(0, Size);
- Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
- } else {
+ unsigned index = 0;
+ for (const auto &DebugLoc : DotDebugLocEntries) {
+ Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
+ for (const auto &Entry : DebugLoc) {
// Set up the range. This range is relative to the entry point of the
// compile unit. This is a hard coded 0 for low_pc when we're emitting
// ranges, or the DW_AT_low_pc on the compile unit otherwise.
// Close the range.
Asm->OutStreamer.EmitLabel(end);
}
+ Asm->OutStreamer.EmitIntValue(0, Size);
+ Asm->OutStreamer.EmitIntValue(0, Size);
+ ++index;
}
}
DenseMap<const MDNode *, DbgVariable *> AbstractVariables;
// Collection of DebugLocEntry.
- SmallVector<DebugLocEntry, 4> DotDebugLocEntries;
+ SmallVector<SmallVector<DebugLocEntry, 4>, 4> DotDebugLocEntries;
// Collection of subprogram DIEs that are marked (at the end of the module)
// as DW_AT_inline.
const DwarfCompileUnit *getPrevCU() const { return PrevCU; }
/// Returns the entries for the .debug_loc section.
- const SmallVectorImpl<DebugLocEntry> &getDebugLocEntries() const {
+ const SmallVectorImpl<SmallVector<DebugLocEntry, 4>> &
+ getDebugLocEntries() const {
return DotDebugLocEntries;
}