Add support to emit debug info for C++ namespaces.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91440 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/DIE.h b/lib/CodeGen/AsmPrinter/DIE.h
index cad8b89..a6dc9b6 100644
--- a/lib/CodeGen/AsmPrinter/DIE.h
+++ b/lib/CodeGen/AsmPrinter/DIE.h
@@ -68,6 +68,7 @@
     /// Data - Raw data bytes for abbreviation.
     ///
     SmallVector<DIEAbbrevData, 8> Data;
+
   public:
     DIEAbbrev(unsigned T, unsigned C) : Tag(T), ChildrenFlag(C), Data() {}
     virtual ~DIEAbbrev() {}
@@ -131,19 +132,18 @@
     ///
     std::vector<DIE *> Children;
 
+    DIE *Parent;
+
     /// Attributes values.
     ///
     SmallVector<DIEValue*, 32> Values;
 
-    /// Abstract compile unit.
-    CompileUnit *AbstractCU;
-    
     // Private data for print()
     mutable unsigned IndentCount;
   public:
     explicit DIE(unsigned Tag)
       : Abbrev(Tag, dwarf::DW_CHILDREN_no), Offset(0),
-        Size(0), IndentCount(0) {}
+        Size(0), Parent (0), IndentCount(0) {}
     virtual ~DIE();
 
     // Accessors.
@@ -154,13 +154,12 @@
     unsigned getSize() const { return Size; }
     const std::vector<DIE *> &getChildren() const { return Children; }
     SmallVector<DIEValue*, 32> &getValues() { return Values; }
-    CompileUnit *getAbstractCompileUnit() const { return AbstractCU; }
-
+    DIE *getParent() const { return Parent; }
     void setTag(unsigned Tag) { Abbrev.setTag(Tag); }
     void setOffset(unsigned O) { Offset = O; }
     void setSize(unsigned S) { Size = S; }
-    void setAbstractCompileUnit(CompileUnit *CU) { AbstractCU = CU; }
-
+    void setParent(DIE *P) { Parent = P; }
+    
     /// addValue - Add a value and attributes to a DIE.
     ///
     void addValue(unsigned Attribute, unsigned Form, DIEValue *Value) {
@@ -179,8 +178,13 @@
     /// addChild - Add a child to the DIE.
     ///
     void addChild(DIE *Child) {
+      if (Child->getParent()) {
+        assert (Child->getParent() == this && "Unexpected DIE Parent!");
+        return;
+      }
       Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes);
       Children.push_back(Child);
+      Child->setParent(this);
     }
 
 #ifndef NDEBUG