[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