DebugInfo: Move the reference to the CU from the location list entry to the list...
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 5 Aug 2014 23:14:16 +0000 (23:14 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 5 Aug 2014 23:14:16 +0000 (23:14 +0000)
This simplifies construction and usage while making the data structure
smaller. It was a holdover from the days when we didn't have a separate
DebugLocList and all we had was a flat list of DebugLocEntries.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214933 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DebugLocEntry.h
lib/CodeGen/AsmPrinter/DebugLocList.h
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.h

index 8cfe39d2ca3fe089c5647423b2aad3c83f002b3b..84bb6e4801c328ba46a65c95aab08c186385a408 100644 (file)
@@ -15,7 +15,6 @@
 #include "llvm/MC/MCSymbol.h"
 
 namespace llvm {
-class DwarfCompileUnit;
 class MDNode;
 /// \brief This struct describes location entries emitted in the .debug_loc
 /// section.
@@ -91,14 +90,10 @@ private:
   /// A list of locations/constants belonging to this entry.
   SmallVector<Value, 1> Values;
 
-  /// The compile unit that this location entry is referenced by.
-  const DwarfCompileUnit *Unit;
-
 public:
-  DebugLocEntry() : Begin(nullptr), End(nullptr), Unit(nullptr) {}
-  DebugLocEntry(const MCSymbol *B, const MCSymbol *E,
-                Value Val, const DwarfCompileUnit *U)
-      : Begin(B), End(E), Unit(U) {
+  DebugLocEntry() : Begin(nullptr), End(nullptr) {}
+  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, Value Val)
+      : Begin(B), End(E) {
     Values.push_back(std::move(Val));
   }
 
@@ -130,7 +125,6 @@ public:
 
   const MCSymbol *getBeginSym() const { return Begin; }
   const MCSymbol *getEndSym() const { return End; }
-  const DwarfCompileUnit *getCU() const { return Unit; }
   const ArrayRef<Value> getValues() const { return Values; }
   void addValue(Value Val) {
     assert(DIVariable(Val.Variable).isVariablePiece() &&
index 7a51c7bd5b0c627bdea889447d7b00833d5e559d..542896c88e5c7fbda1f6e0877bf52b82b45c557a 100644 (file)
 #ifndef CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__
 #define CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__
 
-#include "llvm/MC/MCSymbol.h"
 #include "llvm/ADT/SmallVector.h"
 #include "DebugLocEntry.h"
 
 namespace llvm {
+class DwarfCompileUnit;
+class MCSymbol;
 struct DebugLocList {
   MCSymbol *Label;
+  DwarfCompileUnit *CU;
   SmallVector<DebugLocEntry, 4> List;
 };
 }
index c94eeb943c9e6327f4ddccad80d028d7af31846c..ee23a1c5d2235b72f03f40c1aef323f681269bbc 100644 (file)
@@ -1229,10 +1229,9 @@ static bool piecesOverlap(DIVariable P1, DIVariable P2) {
 // [1-3]    [x, (reg0, piece  0, 32), (reg1, piece 32, 32)]
 // [3-4]    [x, (reg1, piece 32, 32)]
 // [4- ]    [x, (mem,  piece  0, 64)]
-void DwarfDebug::
-buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
-                  const DbgValueHistoryMap::InstrRanges &Ranges,
-                  DwarfCompileUnit *TheCU) {
+void
+DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
+                              const DbgValueHistoryMap::InstrRanges &Ranges) {
   typedef std::pair<DIVariable, DebugLocEntry::Value> Range;
   SmallVector<Range, 4> OpenRanges;
 
@@ -1271,7 +1270,7 @@ buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
     DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
 
     auto Value = getDebugLocValue(Begin);
-    DebugLocEntry Loc(StartLabel, EndLabel, Value, TheCU);
+    DebugLocEntry Loc(StartLabel, EndLabel, Value);
     if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc)) {
       // Add all values from still valid non-overlapping pieces.
       for (auto Range : OpenRanges)
@@ -1340,11 +1339,12 @@ DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
 
     DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
     DebugLocList &LocList = DotDebugLocEntries.back();
+    LocList.CU = TheCU;
     LocList.Label =
         Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
 
     // Build the location list for this variable.
-    buildLocationList(LocList.List, Ranges, TheCU);
+    buildLocationList(LocList.List, Ranges);
   }
 
   // Collect info for variables that were optimized out.
@@ -2198,11 +2198,11 @@ void DwarfDebug::emitDebugLoc() {
   unsigned char Size = Asm->getDataLayout().getPointerSize();
   for (const auto &DebugLoc : DotDebugLocEntries) {
     Asm->OutStreamer.EmitLabel(DebugLoc.Label);
+    const DwarfCompileUnit *CU = DebugLoc.CU;
     for (const auto &Entry : DebugLoc.List) {
       // 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.
-      const DwarfCompileUnit *CU = Entry.getCU();
       if (CU->getRanges().size() == 1) {
         // Grab the begin symbol from the first range as our base.
         const MCSymbol *Base = CU->getRanges()[0].getStart();
index fd6c155388c00fef375940056075fdb8788c0402..ef99f6b7623ba583dfbd21dd90a0c9cba99096b1 100644 (file)
@@ -538,8 +538,7 @@ class DwarfDebug : public AsmPrinterHandler {
   /// \brief Build the location list for all DBG_VALUEs in the
   /// function that describe the same variable.
   void buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
-                         const DbgValueHistoryMap::InstrRanges &Ranges,
-                         DwarfCompileUnit *TheCU);
+                         const DbgValueHistoryMap::InstrRanges &Ranges);
 
   /// \brief Collect variable information from the side table maintained
   /// by MMI.