diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-03-24 22:38:38 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-03-24 22:38:38 +0000 |
commit | 0f53443d827491502a4f56728a383ea8b39cf3dd (patch) | |
tree | b1844eb684905c7b64c4e5f7cc2517ef12b4e0c4 | |
parent | 7385c3207c5fa893abe91cf75e95ed36f64caf40 (diff) | |
download | llvm-0f53443d827491502a4f56728a383ea8b39cf3dd.tar.gz llvm-0f53443d827491502a4f56728a383ea8b39cf3dd.tar.bz2 llvm-0f53443d827491502a4f56728a383ea8b39cf3dd.tar.xz |
DebugInfo: Simplify debug loc list handling by keeping separate lists
Rather than using a flat list with "empty" entries (ala the actual
on-disk format), keep separate lists for each variable.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204680 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/AsmPrinter/DIEHash.cpp | 18 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 27 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.h | 5 |
3 files changed, 17 insertions, 33 deletions
diff --git a/lib/CodeGen/AsmPrinter/DIEHash.cpp b/lib/CodeGen/AsmPrinter/DIEHash.cpp index 0f5e8fb5b4..9756054b28 100644 --- a/lib/CodeGen/AsmPrinter/DIEHash.cpp +++ b/lib/CodeGen/AsmPrinter/DIEHash.cpp @@ -283,22 +283,10 @@ void DIEHash::hashBlockData(const SmallVectorImpl<DIEValue *> &Values) { // 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 diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 3f794ad8ff..c50243af08 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1260,6 +1260,7 @@ DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) { // 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(); @@ -1298,10 +1299,10 @@ DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) { 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. @@ -2383,19 +2384,10 @@ void DwarfDebug::emitDebugLoc() { 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. @@ -2420,6 +2412,9 @@ void DwarfDebug::emitDebugLoc() { // Close the range. Asm->OutStreamer.EmitLabel(end); } + Asm->OutStreamer.EmitIntValue(0, Size); + Asm->OutStreamer.EmitIntValue(0, Size); + ++index; } } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 2d073e380c..064c0fa762 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -366,7 +366,7 @@ class DwarfDebug : public AsmPrinterHandler { 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. @@ -763,7 +763,8 @@ public: 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; } |