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.
// 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 =
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)
// 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);
// 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
// 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);
}
}
// 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),
// 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.
}
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);