[llvm] r207281 - DwarfAccelTable: Store the string symbol in the accelerator table to avoid duplicate lookup.
NAKAMURA Takumi
geek4civic at gmail.com
Sun Apr 27 05:11:14 PDT 2014
2014-04-26 7:21 GMT+09:00 David Blaikie <dblaikie at gmail.com>:
> Author: dblaikie
> Date: Fri Apr 25 17:21:35 2014
> New Revision: 207281
>
> URL: http://llvm.org/viewvc/llvm-project?rev=207281&view=rev
> Log:
> DwarfAccelTable: Store the string symbol in the accelerator table to avoid duplicate lookup.
>
> This also avoids the need for subtly side-effecting calls to manifest
> strings in the string table at the point where items are added to the
> accelerator tables.
>
> Modified:
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp?rev=207281&r1=207280&r2=207281&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.cpp Fri Apr 25 17:21:35 2014
> @@ -29,12 +29,15 @@ DwarfAccelTable::DwarfAccelTable(ArrayRe
> : Header(8 + (atomList.size() * 4)), HeaderData(atomList),
> Entries(Allocator) {}
>
> -void DwarfAccelTable::AddName(StringRef Name, const DIE *die, char Flags) {
> +void DwarfAccelTable::AddName(StringRef Name, MCSymbol *StrSym, const DIE *die,
> + char Flags) {
> assert(Data.empty() && "Already finalized!");
> // If the string is in the list already then add this die to the list
> // otherwise add a new one.
> DataArray &DIEs = Entries[Name];
> - DIEs.push_back(new (Allocator) HashDataContents(die, Flags));
> + assert(!DIEs.StrSym || DIEs.StrSym == StrSym);
.
DIEs.StrSym might not be zero-initialized, at least on msvc. Fixed in r207356
> + DIEs.StrSym = StrSym;
> + DIEs.Values.push_back(new (Allocator) HashDataContents(die, Flags));
> }
>
> void DwarfAccelTable::ComputeBucketCount(void) {
> @@ -70,9 +73,10 @@ void DwarfAccelTable::FinalizeTable(AsmP
> EI != EE; ++EI) {
>
> // Unique the entries.
> - std::stable_sort(EI->second.begin(), EI->second.end(), compareDIEs);
> - EI->second.erase(std::unique(EI->second.begin(), EI->second.end()),
> - EI->second.end());
> + std::stable_sort(EI->second.Values.begin(), EI->second.Values.end(), compareDIEs);
> + EI->second.Values.erase(
> + std::unique(EI->second.Values.begin(), EI->second.Values.end()),
> + EI->second.Values.end());
>
> HashData *Entry = new (Allocator) HashData(EI->getKey(), EI->second);
> Data.push_back(Entry);
> @@ -179,21 +183,18 @@ void DwarfAccelTable::EmitData(AsmPrinte
> // Remember to emit the label for our offset.
> Asm->OutStreamer.EmitLabel((*HI)->Sym);
> Asm->OutStreamer.AddComment((*HI)->Str);
> - Asm->EmitSectionOffset(D->getStringPool().getSymbol(*Asm, (*HI)->Str),
> + Asm->EmitSectionOffset((*HI)->Data.StrSym,
> D->getStringPool().getSectionSymbol());
> Asm->OutStreamer.AddComment("Num DIEs");
> - Asm->EmitInt32((*HI)->Data.size());
> - for (ArrayRef<HashDataContents *>::const_iterator
> - DI = (*HI)->Data.begin(),
> - DE = (*HI)->Data.end();
> - DI != DE; ++DI) {
> + Asm->EmitInt32((*HI)->Data.Values.size());
> + for (HashDataContents *HD : (*HI)->Data.Values) {
> // Emit the DIE offset
> - Asm->EmitInt32((*DI)->Die->getOffset());
> + Asm->EmitInt32(HD->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);
> + Asm->EmitInt16(HD->Die->getTag());
> + Asm->EmitInt8(HD->Flags);
> }
> }
> // Emit a 0 to terminate the data unless we have a hash collision.
> @@ -233,10 +234,8 @@ void DwarfAccelTable::print(raw_ostream
> EE = Entries.end();
> EI != EE; ++EI) {
> O << "Name: " << EI->getKeyData() << "\n";
> - for (DataArray::const_iterator DI = EI->second.begin(),
> - DE = EI->second.end();
> - DI != DE; ++DI)
> - (*DI)->print(O);
> + for (HashDataContents *HD : EI->second.Values)
> + HD->print(O);
> }
>
> O << "Buckets and Hashes: \n";
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.h?rev=207281&r1=207280&r2=207281&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfAccelTable.h Fri Apr 25 17:21:35 2014
> @@ -179,12 +179,18 @@ public:
> };
>
> private:
> + // String Data
> + struct DataArray {
> + MCSymbol *StrSym;
> + std::vector<HashDataContents *> Values;
> + };
> + friend struct HashData;
> struct HashData {
> StringRef Str;
> uint32_t HashValue;
> MCSymbol *Sym;
> - ArrayRef<HashDataContents *> Data; // offsets
> - HashData(StringRef S, ArrayRef<HashDataContents *> Data)
> + DwarfAccelTable::DataArray &Data; // offsets
> + HashData(StringRef S, DwarfAccelTable::DataArray &Data)
> : Str(S), Data(Data) {
> HashValue = DwarfAccelTable::HashDJB(S);
> }
> @@ -198,10 +204,10 @@ private:
> else
> O << "<none>";
> O << "\n";
> - for (size_t i = 0; i < Data.size(); i++) {
> - O << " Offset: " << Data[i]->Die->getOffset() << "\n";
> - O << " Tag: " << dwarf::TagString(Data[i]->Die->getTag()) << "\n";
> - O << " Flags: " << Data[i]->Flags << "\n";
> + for (HashDataContents *C : Data.Values) {
> + O << " Offset: " << C->Die->getOffset() << "\n";
> + O << " Tag: " << dwarf::TagString(C->Die->getTag()) << "\n";
> + O << " Flags: " << C->Flags << "\n";
> }
> }
> void dump() { print(dbgs()); }
> @@ -226,8 +232,6 @@ private:
> TableHeaderData HeaderData;
> std::vector<HashData *> Data;
>
> - // String Data
> - typedef std::vector<HashDataContents *> DataArray;
> typedef StringMap<DataArray, BumpPtrAllocator &> StringEntries;
> StringEntries Entries;
>
> @@ -240,7 +244,8 @@ private:
> // Public Implementation
> public:
> DwarfAccelTable(ArrayRef<DwarfAccelTable::Atom>);
> - void AddName(StringRef, const DIE *, char = 0);
> + void AddName(StringRef Name, MCSymbol *StrSym, const DIE *Die,
> + char Flags = 0);
> void FinalizeTable(AsmPrinter *, StringRef);
> void Emit(AsmPrinter *, MCSymbol *, DwarfFile *);
> #ifndef NDEBUG
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=207281&r1=207280&r2=207281&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Fri Apr 25 17:21:35 2014
> @@ -2545,27 +2545,27 @@ void DwarfDebug::attachLowHighPC(DwarfCo
> void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
> if (!useDwarfAccelTables())
> return;
> - InfoHolder.getStringPool().getSymbol(*Asm, Name);
> - AccelNames.AddName(Name, &Die);
> + AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
> + &Die);
> }
>
> void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
> if (!useDwarfAccelTables())
> return;
> - InfoHolder.getStringPool().getSymbol(*Asm, Name);
> - AccelObjC.AddName(Name, &Die);
> + AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
> + &Die);
> }
>
> void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
> if (!useDwarfAccelTables())
> return;
> - InfoHolder.getStringPool().getSymbol(*Asm, Name);
> - AccelNamespace.AddName(Name, &Die);
> + AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
> + &Die);
> }
>
> void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
> if (!useDwarfAccelTables())
> return;
> - InfoHolder.getStringPool().getSymbol(*Asm, Name);
> - AccelTypes.AddName(Name, &Die, Flags);
> + AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
> + &Die);
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list