143 lines
4.2 KiB
C++
143 lines
4.2 KiB
C++
//===-- NameToDIE.cpp -------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "NameToDIE.h"
|
|
#include "lldb/Core/ConstString.h"
|
|
#include "lldb/Core/Stream.h"
|
|
#include "lldb/Core/RegularExpression.h"
|
|
|
|
void
|
|
NameToDIE::Insert (const lldb_private::ConstString& name, const Info &info)
|
|
{
|
|
m_collection.insert (std::make_pair(name.AsCString(), info));
|
|
}
|
|
|
|
size_t
|
|
NameToDIE::Find (const lldb_private::ConstString &name, std::vector<Info> &info_array) const
|
|
{
|
|
const char *name_cstr = name.AsCString();
|
|
const size_t initial_info_array_size = info_array.size();
|
|
collection::const_iterator pos, end = m_collection.end();
|
|
for (pos = m_collection.lower_bound (name_cstr); pos != end && pos->first == name_cstr; ++pos)
|
|
{
|
|
info_array.push_back (pos->second);
|
|
}
|
|
return info_array.size() - initial_info_array_size;
|
|
}
|
|
|
|
size_t
|
|
NameToDIE::Find (const lldb_private::RegularExpression& regex, std::vector<Info> &info_array) const
|
|
{
|
|
const size_t initial_info_array_size = info_array.size();
|
|
collection::const_iterator pos, end = m_collection.end();
|
|
for (pos = m_collection.begin(); pos != end; ++pos)
|
|
{
|
|
if (regex.Execute(pos->first))
|
|
info_array.push_back (pos->second);
|
|
}
|
|
return info_array.size() - initial_info_array_size;
|
|
}
|
|
|
|
size_t
|
|
NameToDIE::FindAllEntriesForCompileUnitWithIndex (const uint32_t cu_idx, std::vector<Info> &info_array) const
|
|
{
|
|
const size_t initial_info_array_size = info_array.size();
|
|
collection::const_iterator pos, end = m_collection.end();
|
|
for (pos = m_collection.begin(); pos != end; ++pos)
|
|
{
|
|
if (cu_idx == pos->second.cu_idx)
|
|
info_array.push_back (pos->second);
|
|
}
|
|
return info_array.size() - initial_info_array_size;
|
|
}
|
|
|
|
void
|
|
NameToDIE::Dump (lldb_private::Stream *s)
|
|
{
|
|
collection::const_iterator pos, end = m_collection.end();
|
|
for (pos = m_collection.begin(); pos != end; ++pos)
|
|
{
|
|
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);
|
|
}
|
|
}
|