Rework adding function names to the dwarf accelerator tables, allow
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfAccelTable.cpp
index 84a28390aa0ffe422402945e9d4eda34b2e23ccb..a3a24887615eab7a8ccd3eb0228c7cb314490178 100644 (file)
@@ -42,6 +42,11 @@ DwarfAccelTable::DwarfAccelTable(DwarfAccelTable::Atom atom) :
   HeaderData(atom) {
 }
 
+DwarfAccelTable::~DwarfAccelTable() {
+  for (size_t i = 0, e = Data.size() ; i < e; ++i)
+    delete Data[i];
+}
+
 void DwarfAccelTable::AddName(StringRef Name, DIE* die) {
   // If the string is in the list already then add this die to the list
   // otherwise add a new one.
@@ -53,7 +58,7 @@ void DwarfAccelTable::ComputeBucketCount(void) {
   // First get the number of unique hashes.
   std::vector<uint32_t> uniques;
   uniques.resize(Data.size());
-  for (size_t i = 0; i < Data.size(); ++i)
+  for (size_t i = 0, e = Data.size(); i < e; ++i)
     uniques[i] = Data[i]->HashValue;
   std::sort(uniques.begin(), uniques.end());
   std::vector<uint32_t>::iterator p =
@@ -70,9 +75,15 @@ void DwarfAccelTable::ComputeBucketCount(void) {
 
 void DwarfAccelTable::FinalizeTable(AsmPrinter *Asm, const char *Prefix) {
   // Create the individual hash data outputs.
-  for (StringMap<DIEArray>::const_iterator
+  for (StringMap<DIEArray>::iterator
          EI = Entries.begin(), EE = Entries.end(); EI != EE; ++EI) {
     struct HashData *Entry = new HashData((*EI).getKeyData());
+
+    // Unique the entries.
+    std::sort((*EI).second.begin(), (*EI).second.end());
+    (*EI).second.erase(std::unique((*EI).second.begin(), (*EI).second.end()),
+                       (*EI).second.end());
+
     for (DIEArray::const_iterator DI = (*EI).second.begin(),
            DE = (*EI).second.end();
          DI != DE; ++DI)
@@ -89,7 +100,7 @@ void DwarfAccelTable::FinalizeTable(AsmPrinter *Asm, const char *Prefix) {
 
   // Compute bucket contents and final ordering.
   Buckets.resize(Header.bucket_count);
-  for (size_t i = 0; i < Data.size(); ++i) {
+  for (size_t i = 0, e = Data.size(); i < e; ++i) {
     uint32_t bucket = Data[i]->HashValue % Header.bucket_count;
     Buckets[bucket].push_back(Data[i]);
     Data[i]->Sym = Asm->GetTempSymbol(Prefix, i);
@@ -127,9 +138,8 @@ void DwarfAccelTable::EmitHeader(AsmPrinter *Asm) {
 // like a list of numbers of how many elements are in each bucket.
 void DwarfAccelTable::EmitBuckets(AsmPrinter *Asm) {
   unsigned index = 0;
-  for (size_t i = 0; i < Buckets.size(); ++i) {
-    Twine Comment = Twine("Bucket ") + Twine(i);
-    Asm->OutStreamer.AddComment(Comment);
+  for (size_t i = 0, e = Buckets.size(); i < e; ++i) {
+    Asm->OutStreamer.AddComment("Bucket " + Twine(i));
     if (Buckets[i].size() != 0)
       Asm->EmitInt32(index);
     else
@@ -141,11 +151,10 @@ void DwarfAccelTable::EmitBuckets(AsmPrinter *Asm) {
 // Walk through the buckets and emit the individual hashes for each
 // bucket.
 void DwarfAccelTable::EmitHashes(AsmPrinter *Asm) {
-  for (size_t i = 0; i < Buckets.size(); ++i) {
+  for (size_t i = 0, e = Buckets.size(); i < e; ++i) {
     for (HashList::const_iterator HI = Buckets[i].begin(),
            HE = Buckets[i].end(); HI != HE; ++HI) {
-      Twine Comment = Twine("Hash in Bucket ") + Twine(i);
-      Asm->OutStreamer.AddComment(Comment);
+      Asm->OutStreamer.AddComment("Hash in Bucket " + Twine(i));
       Asm->EmitInt32((*HI)->HashValue);
     } 
   }
@@ -156,11 +165,10 @@ void DwarfAccelTable::EmitHashes(AsmPrinter *Asm) {
 // beginning of the section. The non-section symbol will be output later
 // when we emit the actual data.
 void DwarfAccelTable::EmitOffsets(AsmPrinter *Asm, MCSymbol *SecBegin) {
-  for (size_t i = 0; i < Buckets.size(); ++i) {
+  for (size_t i = 0, e = Buckets.size(); i < e; ++i) {
     for (HashList::const_iterator HI = Buckets[i].begin(),
            HE = Buckets[i].end(); HI != HE; ++HI) {
-      Twine Comment = Twine("Offset in Bucket ") + Twine(i);
-      Asm->OutStreamer.AddComment(Comment);
+      Asm->OutStreamer.AddComment("Offset in Bucket " + Twine(i));
       MCContext &Context = Asm->OutStreamer.getContext();
       const MCExpr *Sub =
         MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create((*HI)->Sym, Context),
@@ -176,7 +184,7 @@ void DwarfAccelTable::EmitOffsets(AsmPrinter *Asm, MCSymbol *SecBegin) {
 // Terminate each HashData bucket with 0.
 void DwarfAccelTable::EmitData(AsmPrinter *Asm, DwarfDebug *D) {
   uint64_t PrevHash = UINT64_MAX;
-  for (size_t i = 0; i < Buckets.size(); ++i) {
+  for (size_t i = 0, e = Buckets.size(); i < e; ++i) {
     for (HashList::const_iterator HI = Buckets[i].begin(),
            HE = Buckets[i].end(); HI != HE; ++HI) {
       // Remember to emit the label for our offset.
@@ -235,7 +243,7 @@ void DwarfAccelTable::print(raw_ostream &O) {
   }
 
   O << "Buckets and Hashes: \n";
-  for (size_t i = 0; i < Buckets.size(); ++i)
+  for (size_t i = 0, e = Buckets.size(); i < e; ++i)
     for (HashList::const_iterator HI = Buckets[i].begin(),
            HE = Buckets[i].end(); HI != HE; ++HI)
       (*HI)->print(O);