[Lldb-commits] [lldb] r138620 - in /lldb/trunk/source/Plugins/SymbolFile/DWARF: NameToDIE.cpp NameToDIE.h

Greg Clayton gclayton at apple.com
Thu Aug 25 19:44:58 PDT 2011


Author: gclayton
Date: Thu Aug 25 21:44:58 2011
New Revision: 138620

URL: http://llvm.org/viewvc/llvm-project?rev=138620&view=rev
Log:
Added code to test hash bucket sizes for an DWARF index that we can write
to a file.


Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp?rev=138620&r1=138619&r2=138620&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp Thu Aug 25 21:44:58 2011
@@ -66,3 +66,77 @@
         s->Printf("%p: 0x%8.8x 0x%8.8x \"%s\"\n", pos->first, pos->second.cu_idx, pos->second.die_idx, pos->first);
     }
 }
+
+
+static uint32_t
+dl_new_hash (const char *s)
+{
+    uint32_t h = 5381;
+    
+    for (unsigned char c = *s; c; c = *++s)
+        h = ((h << 5) + h) + c;
+    
+    return h;
+}
+
+struct HashEntry
+{
+    uint32_t hash;
+    uint32_t cu_idx;
+    uint32_t die_idx;
+    const char *name;
+};
+
+typedef struct HashEntry HashEntryType;
+
+void
+NameToDIE::Hash (lldb_private::Stream *s)
+{
+    typedef std::vector<HashEntryType> hash_collection;
+    hash_collection hash_entries;
+    collection::const_iterator pos, end = m_collection.end();
+    for (pos = m_collection.begin(); pos != end; ++pos)
+    {
+        HashEntry entry = { dl_new_hash (pos->first), pos->second.cu_idx, pos->second.die_idx, pos->first };
+        hash_entries.push_back (entry); 
+    }
+    
+
+    const uint32_t hash_entries_size = hash_entries.size();
+    
+    uint32_t i;
+
+    for (uint32_t power_2 = 0x10; power_2 <= hash_entries_size; power_2 <<= 1)
+    {
+        const uint32_t size = power_2 - 1;
+        if (size > 0x10 && size > hash_entries_size)
+            break;
+
+        s->Printf ("\nTrying size of %u for %u items:\n", size, hash_entries_size);
+        std::vector<uint32_t> indexes(size, 0);
+        for (i=0; i<hash_entries_size; ++i)
+        {
+            indexes[hash_entries[i].hash % size]++;
+        }
+        const uint32_t indexes_size = indexes.size();
+        uint32_t empties = 0;
+        uint32_t good = 0;
+        uint32_t collisions = 0;
+        uint64_t total = 0;
+        for (i=0; i<indexes_size; ++i)
+        {
+            uint32_t c = indexes[i];
+            total += c;
+            if (c == 0)
+                ++empties;
+            else if (c == 1)
+                ++good;
+            else
+                ++collisions;
+        }
+        s->Printf ("good       = %u\n", good);
+        s->Printf ("empties    = %u\n", empties);
+        s->Printf ("collisions = %u\n", collisions);
+        s->Printf ("avg count  = %llu\n", total / indexes_size);
+    }
+}

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h?rev=138620&r1=138619&r2=138620&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/NameToDIE.h Thu Aug 25 21:44:58 2011
@@ -51,6 +51,9 @@
     FindAllEntriesForCompileUnitWithIndex (const uint32_t cu_idx, 
                                            std::vector<Info> &info_array) const;
 
+    void
+    Hash (lldb_private::Stream *s);
+
 protected:
     typedef std::multimap<const char *, Info> collection;
 





More information about the lldb-commits mailing list