[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