As part of the ongoing work in finalizing the accelerator tables, extend
the debug type accelerator tables to contain the tag and a flag
stating whether or not a compound type is a complete type.

rdar://10652330

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147651 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp b/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp
index 6c77a63..940592e 100644
--- a/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp
@@ -42,16 +42,22 @@
   HeaderData(atom) {
 }
 
+// The length of the header data is always going to be 4 + 4 + 4*NumAtoms.
+DwarfAccelTable::DwarfAccelTable(std::vector<DwarfAccelTable::Atom> &atomList) :
+  Header(8 + (atomList.size() * 4)),
+  HeaderData(atomList) {
+}
+
 DwarfAccelTable::~DwarfAccelTable() {
-  for (size_t i = 0, e = Data.size() ; i < e; ++i)
+  for (size_t i = 0, e = Data.size(); i < e; ++i)
     delete Data[i];
 }
 
-void DwarfAccelTable::AddName(StringRef Name, DIE* die) {
+void DwarfAccelTable::AddName(StringRef Name, DIE* die, char Flags) {
   // If the string is in the list already then add this die to the list
   // otherwise add a new one.
-  DIEArray &DIEs = Entries[Name];
-  DIEs.push_back(die);
+  DataArray &DIEs = Entries[Name];
+  DIEs.push_back(new HashDataContents(die, Flags));
 }
 
 void DwarfAccelTable::ComputeBucketCount(void) {
@@ -76,15 +82,16 @@
 namespace {
   // DIESorter - comparison predicate that sorts DIEs by their offset.
   struct DIESorter {
-    bool operator()(DIE *A, DIE *B) const {
-      return A->getOffset() < B->getOffset();
+    bool operator()(const struct DwarfAccelTable::HashDataContents *A,
+                    const struct DwarfAccelTable::HashDataContents *B) const {
+      return A->Die->getOffset() < B->Die->getOffset();
     }
   };
 }
 
 void DwarfAccelTable::FinalizeTable(AsmPrinter *Asm, const char *Prefix) {
   // Create the individual hash data outputs.
-  for (StringMap<DIEArray>::iterator
+  for (StringMap<DataArray>::iterator
          EI = Entries.begin(), EE = Entries.end(); EI != EE; ++EI) {
     struct HashData *Entry = new HashData((*EI).getKeyData());
 
@@ -93,10 +100,10 @@
     (*EI).second.erase(std::unique((*EI).second.begin(), (*EI).second.end()),
                        (*EI).second.end());
 
-    for (DIEArray::const_iterator DI = (*EI).second.begin(),
+    for (DataArray::const_iterator DI = (*EI).second.begin(),
            DE = (*EI).second.end();
          DI != DE; ++DI)
-      Entry->addOffset((*DI)->getOffset());
+      Entry->addData((*DI));
     Data.push_back(Entry);
   }
 
@@ -202,11 +209,18 @@
       Asm->EmitSectionOffset(D->getStringPoolEntry((*HI)->Str),
                              D->getStringPool());
       Asm->OutStreamer.AddComment("Num DIEs");
-      Asm->EmitInt32((*HI)->DIEOffsets.size());
-      for (std::vector<uint32_t>::const_iterator
-             DI = (*HI)->DIEOffsets.begin(), DE = (*HI)->DIEOffsets.end();
+      Asm->EmitInt32((*HI)->Data.size());
+      for (std::vector<struct HashDataContents*>::const_iterator
+             DI = (*HI)->Data.begin(), DE = (*HI)->Data.end();
            DI != DE; ++DI) {
-        Asm->EmitInt32((*DI));
+        // Emit the DIE offset
+        Asm->EmitInt32((*DI)->Die->getOffset());
+        // If we have multiple Atoms emit that info too.
+        // FIXME: A bit of a hack, we either emit only one atom or all info.
+        if (HeaderData.Atoms.size() > 1) {
+          Asm->EmitInt16((*DI)->Die->getTag());
+          Asm->EmitInt8((*DI)->Flags);
+        }
       }
       // Emit a 0 to terminate the data unless we have a hash collision.
       if (PrevHash != (*HI)->HashValue)
@@ -242,10 +256,10 @@
   HeaderData.print(O);
 
   O << "Entries: \n";
-  for (StringMap<DIEArray>::const_iterator
+  for (StringMap<DataArray>::const_iterator
          EI = Entries.begin(), EE = Entries.end(); EI != EE; ++EI) {
     O << "Name: " << (*EI).getKeyData() << "\n";
-    for (DIEArray::const_iterator DI = (*EI).second.begin(),
+    for (DataArray::const_iterator DI = (*EI).second.begin(),
            DE = (*EI).second.end();
          DI != DE; ++DI)
       (*DI)->print(O);