DebugInfo: Simplify debug loc list handling by keeping separate lists
authorDavid Blaikie <dblaikie@gmail.com>
Mon, 24 Mar 2014 22:38:38 +0000 (22:38 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Mon, 24 Mar 2014 22:38:38 +0000 (22:38 +0000)
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

lib/CodeGen/AsmPrinter/DIEHash.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.h

index 0f5e8fb5b4b39fc33ba4bb39f5106ec18b5a0bc2..9756054b28508facdcf2e8a32e7393b213719b7b 100644 (file)
@@ -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
index 3f794ad8ff5442977d4ad2b03f37d6a3ea5e84f5..c50243af0835e78ae21b07c2d326769de4de9378 100644 (file)
@@ -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;
   }
 }
 
index 2d073e380c0394fc71f871707ffb4ad129b7e17c..064c0fa7624b716798df6b4ea3f6a36eb259c608 100644 (file)
@@ -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;
   }