[lld] r287737 - Allow calling getName() on local symbols.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 28 22:11:04 PST 2016


Thanks!

Rui Ueyama via llvm-commits <llvm-commits at lists.llvm.org> writes:

> Author: ruiu
> Date: Tue Nov 22 22:57:25 2016
> New Revision: 287737
>
> URL: http://llvm.org/viewvc/llvm-project?rev=287737&view=rev
> Log:
> Allow calling getName() on local symbols.
>
> Previously, we stored offsets in string tables to symbols, so
> you needed to pass a string table to get a symbol name. This patch
> stores const char pointers instead to eliminate the need to pass
> a string table.
>
> Modified:
>     lld/trunk/ELF/InputFiles.cpp
>     lld/trunk/ELF/Relocations.cpp
>     lld/trunk/ELF/Symbols.cpp
>     lld/trunk/ELF/Symbols.h
>     lld/trunk/ELF/Writer.cpp
>
> Modified: lld/trunk/ELF/InputFiles.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=287737&r1=287736&r2=287737&view=diff
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.cpp (original)
> +++ lld/trunk/ELF/InputFiles.cpp Tue Nov 22 22:57:25 2016
> @@ -441,10 +441,14 @@ SymbolBody *elf::ObjectFile<ELFT>::creat
>    if (Binding == STB_LOCAL) {
>      if (Sym->getType() == STT_FILE)
>        SourceFile = check(Sym->getName(this->StringTable));
> +
> +    if (this->StringTable.size() <= Sym->st_name)
> +      fatal(getFilename(this) + ": invalid symbol name offset");
> +
> +    const char *Name = this->StringTable.data() + Sym->st_name;
>      if (Sym->st_shndx == SHN_UNDEF)
> -      return new (BAlloc)
> -          Undefined(Sym->st_name, Sym->st_other, Sym->getType(), this);
> -    return new (BAlloc) DefinedRegular<ELFT>(*Sym, Sec);
> +      return new (BAlloc) Undefined(Name, Sym->st_other, Sym->getType(), this);
> +    return new (BAlloc) DefinedRegular<ELFT>(Name, *Sym, Sec);
>    }
>  
>    StringRef Name = check(Sym->getName(this->StringTable));
>
> Modified: lld/trunk/ELF/Relocations.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=287737&r1=287736&r2=287737&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Relocations.cpp (original)
> +++ lld/trunk/ELF/Relocations.cpp Tue Nov 22 22:57:25 2016
> @@ -443,7 +443,7 @@ static RelExpr adjustExpr(const elf::Obj
>    // only memory. We can hack around it if we are producing an executable and
>    // the refered symbol can be preemepted to refer to the executable.
>    if (Config->Shared || (Config->Pic && !isRelExpr(Expr))) {
> -    StringRef Name = getSymbolName(File.getStringTable(), Body);
> +    StringRef Name = Body.getName();
>      error(getLocation(S, RelOff) + ": can't create dynamic relocation " +
>            getRelName(Type) + " against " +
>            ((Name.empty() ? "local symbol in readonly segment"
> @@ -552,10 +552,8 @@ std::string getLocation(InputSectionBase
>  
>    // Find a symbol at a given location.
>    DefinedRegular<ELFT> *Encl = getSymbolAt(&S, Offset);
> -  if (Encl && Encl->Type == STT_FUNC) {
> -    StringRef Func = getSymbolName(File->getStringTable(), *Encl);
> -    return SrcFile + ":(function " + maybeDemangle(Func) + ")";
> -  }
> +  if (Encl && Encl->Type == STT_FUNC)
> +    return SrcFile + ":(function " + maybeDemangle(Encl->getName()) + ")";
>  
>    // If there's no symbol, print out the offset instead of a symbol name.
>    return (SrcFile + ":(" + S.Name + "+0x" + Twine::utohexstr(Offset) + ")")
>
> Modified: lld/trunk/ELF/Symbols.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=287737&r1=287736&r2=287737&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.cpp (original)
> +++ lld/trunk/ELF/Symbols.cpp Tue Nov 22 22:57:25 2016
> @@ -17,6 +17,7 @@
>  
>  #include "llvm/ADT/STLExtras.h"
>  #include "llvm/Support/Path.h"
> +#include <cstring>
>  
>  using namespace llvm;
>  using namespace llvm::object;
> @@ -90,20 +91,20 @@ static typename ELFT::uint getSymVA(cons
>    llvm_unreachable("invalid symbol kind");
>  }
>  
> -SymbolBody::SymbolBody(Kind K, uint32_t NameOffset, uint8_t StOther,
> -                       uint8_t Type)
> +SymbolBody::SymbolBody(Kind K, const char *Name, uint8_t StOther, uint8_t Type)
>      : SymbolKind(K), NeedsCopyOrPltAddr(false), IsLocal(true),
>        IsInGlobalMipsGot(false), Is32BitMipsGot(false), Type(Type),
> -      StOther(StOther), NameOffset(NameOffset) {}
> +      StOther(StOther), Name(Name) {}
>  
>  SymbolBody::SymbolBody(Kind K, StringRef Name, uint8_t StOther, uint8_t Type)
>      : SymbolKind(K), NeedsCopyOrPltAddr(false), IsLocal(false),
>        IsInGlobalMipsGot(false), Is32BitMipsGot(false), Type(Type),
> -      StOther(StOther), Name({Name.data(), Name.size()}) {}
> +      StOther(StOther), NameLen(Name.size()), Name(Name.data()) {}
>  
>  StringRef SymbolBody::getName() const {
> -  assert(!isLocal());
> -  return StringRef(Name.S, Name.Len);
> +  if (NameLen == (uint32_t)-1)
> +    NameLen = strlen(Name);
> +  return StringRef(Name, NameLen);
>  }
>  
>  // Returns true if a symbol can be replaced at load-time by a symbol
> @@ -192,8 +193,8 @@ template <class ELFT> typename ELFT::uin
>  Defined::Defined(Kind K, StringRef Name, uint8_t StOther, uint8_t Type)
>      : SymbolBody(K, Name, StOther, Type) {}
>  
> -Defined::Defined(Kind K, uint32_t NameOffset, uint8_t StOther, uint8_t Type)
> -    : SymbolBody(K, NameOffset, StOther, Type) {}
> +Defined::Defined(Kind K, const char *Name, uint8_t StOther, uint8_t Type)
> +    : SymbolBody(K, Name, StOther, Type) {}
>  
>  template <class ELFT> bool DefinedRegular<ELFT>::isMipsPIC() const {
>    if (!Section || !isFunc())
> @@ -208,9 +209,9 @@ Undefined::Undefined(StringRef Name, uin
>    this->File = File;
>  }
>  
> -Undefined::Undefined(uint32_t NameOffset, uint8_t StOther, uint8_t Type,
> +Undefined::Undefined(const char *Name, uint8_t StOther, uint8_t Type,
>                       InputFile *File)
> -    : SymbolBody(SymbolBody::UndefinedKind, NameOffset, StOther, Type) {
> +    : SymbolBody(SymbolBody::UndefinedKind, Name, StOther, Type) {
>    this->File = File;
>  }
>  
> @@ -282,14 +283,6 @@ void elf::printTraceSymbol(Symbol *Sym)
>    outs() << B->getName() << "\n";
>  }
>  
> -StringRef elf::getSymbolName(StringRef SymTab, SymbolBody &Body) {
> -  if (Body.isLocal() && Body.getNameOffset())
> -    return SymTab.data() + Body.getNameOffset();
> -  if (!Body.isLocal())
> -    return Body.getName();
> -  return "";
> -}
> -
>  template bool SymbolBody::hasThunk<ELF32LE>() const;
>  template bool SymbolBody::hasThunk<ELF32BE>() const;
>  template bool SymbolBody::hasThunk<ELF64LE>() const;
>
> Modified: lld/trunk/ELF/Symbols.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=287737&r1=287736&r2=287737&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.h (original)
> +++ lld/trunk/ELF/Symbols.h Tue Nov 22 22:57:25 2016
> @@ -72,11 +72,6 @@ public:
>  
>    StringRef getName() const;
>  
> -  uint32_t getNameOffset() const {
> -    assert(isLocal());
> -    return NameOffset;
> -  }
> -
>    uint8_t getVisibility() const { return StOther & 0x3; }
>  
>    bool isInGot() const { return GotIndex != -1U; }
> @@ -105,8 +100,7 @@ public:
>  
>  protected:
>    SymbolBody(Kind K, StringRef Name, uint8_t StOther, uint8_t Type);
> -
> -  SymbolBody(Kind K, uint32_t NameOffset, uint8_t StOther, uint8_t Type);
> +  SymbolBody(Kind K, const char *Name, uint8_t StOther, uint8_t Type);
>  
>    const unsigned SymbolKind : 8;
>  
> @@ -143,21 +137,17 @@ public:
>    bool isFile() const { return Type == llvm::ELF::STT_FILE; }
>  
>  protected:
> -  struct Str {
> -    const char *S;
> -    size_t Len;
> -  };
> -  union {
> -    Str Name;
> -    uint32_t NameOffset;
> -  };
> +  // Local symbols are not inserted to the symbol table, so we usually
> +  // don't need their names at all. We read symbol names lazily if possible.
> +  mutable uint32_t NameLen = (uint32_t)-1;
> +  const char *Name;
>  };
>  
>  // The base class for any defined symbols.
>  class Defined : public SymbolBody {
>  public:
>    Defined(Kind K, StringRef Name, uint8_t StOther, uint8_t Type);
> -  Defined(Kind K, uint32_t NameOffset, uint8_t StOther, uint8_t Type);
> +  Defined(Kind K, const char *Name, uint8_t StOther, uint8_t Type);
>    static bool classof(const SymbolBody *S) { return S->isDefined(); }
>  };
>  
> @@ -197,8 +187,9 @@ public:
>    DefinedRegular(StringRef Name, uint8_t StOther, uint8_t Type, BitcodeFile *F)
>        : DefinedRegular(Name, StOther, Type, 0, 0, NullInputSection, F) {}
>  
> -  DefinedRegular(const Elf_Sym &Sym, InputSectionBase<ELFT> *Section)
> -      : Defined(SymbolBody::DefinedRegularKind, Sym.st_name, Sym.st_other,
> +  DefinedRegular(const char *Name, const Elf_Sym &Sym,
> +                 InputSectionBase<ELFT> *Section)
> +      : Defined(SymbolBody::DefinedRegularKind, Name, Sym.st_other,
>                  Sym.getType()),
>          Value(Sym.st_value), Size(Sym.st_size),
>          Section(Section ? Section->Repl : NullInputSection) {
> @@ -262,7 +253,7 @@ public:
>  class Undefined : public SymbolBody {
>  public:
>    Undefined(StringRef Name, uint8_t StOther, uint8_t Type, InputFile *F);
> -  Undefined(uint32_t NameOffset, uint8_t StOther, uint8_t Type, InputFile *F);
> +  Undefined(const char *Name, uint8_t StOther, uint8_t Type, InputFile *F);
>  
>    static bool classof(const SymbolBody *S) {
>      return S->kind() == UndefinedKind;
> @@ -462,8 +453,6 @@ inline Symbol *SymbolBody::symbol() {
>                                      offsetof(Symbol, Body));
>  }
>  
> -StringRef getSymbolName(StringRef SymTab, SymbolBody &Body);
> -
>  } // namespace elf
>  } // namespace lld
>  
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=287737&r1=287736&r2=287737&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Tue Nov 22 22:57:25 2016
> @@ -374,7 +374,6 @@ template <class ELFT> void Writer<ELFT>:
>    if (!In<ELFT>::SymTab)
>      return;
>    for (elf::ObjectFile<ELFT> *F : Symtab<ELFT>::X->getObjectFiles()) {
> -    StringRef StrTab = F->getStringTable();
>      for (SymbolBody *B : F->getLocalSymbols()) {
>        if (!B->IsLocal)
>          fatal(getFilename(F) +
> @@ -385,17 +384,14 @@ template <class ELFT> void Writer<ELFT>:
>          continue;
>        if (!includeInSymtab<ELFT>(*B))
>          continue;
> -      if (B->getNameOffset() >= StrTab.size())
> -        fatal(getFilename(F) + ": invalid symbol name offset");
> -      StringRef SymName(StrTab.data() + B->getNameOffset());
>        InputSectionBase<ELFT> *Sec = DR->Section;
> -      if (!shouldKeepInSymtab<ELFT>(Sec, SymName, *B))
> +      if (!shouldKeepInSymtab<ELFT>(Sec, B->getName(), *B))
>          continue;
>        ++In<ELFT>::SymTab->NumLocals;
>        if (Config->Relocatable)
>          B->DynsymIndex = In<ELFT>::SymTab->NumLocals;
> -      F->KeptLocalSyms.push_back(
> -          std::make_pair(DR, In<ELFT>::SymTab->StrTabSec.addString(SymName)));
> +      F->KeptLocalSyms.push_back(std::make_pair(
> +          DR, In<ELFT>::SymTab->StrTabSec.addString(B->getName())));
>      }
>    }
>  }
> @@ -701,8 +697,8 @@ static void sortBySymbolsOrder(ArrayRef<
>        auto *D = dyn_cast<DefinedRegular<ELFT>>(Body);
>        if (!D || !D->Section)
>          continue;
> -      StringRef SymName = getSymbolName(File->getStringTable(), *Body);
> -      auto It = Config->SymbolOrderingFile.find(CachedHashString(SymName));
> +      auto It =
> +          Config->SymbolOrderingFile.find(CachedHashString(Body->getName()));
>        if (It == Config->SymbolOrderingFile.end())
>          continue;
>  
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list