[lld] r319378 - Use Symbol::File directly.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 29 14:47:35 PST 2017
Author: rafael
Date: Wed Nov 29 14:47:35 2017
New Revision: 319378
URL: http://llvm.org/viewvc/llvm-project?rev=319378&view=rev
Log:
Use Symbol::File directly.
We are already paying the cost of storing a InputFile in every
Symbol, so use it uniformly.
Modified:
lld/trunk/ELF/InputFiles.cpp
lld/trunk/ELF/LTO.cpp
lld/trunk/ELF/MapFile.cpp
lld/trunk/ELF/Relocations.cpp
lld/trunk/ELF/SymbolTable.cpp
lld/trunk/ELF/Symbols.cpp
lld/trunk/ELF/Symbols.h
lld/trunk/ELF/SyntheticSections.cpp
lld/trunk/ELF/Writer.cpp
Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Wed Nov 29 14:47:35 2017
@@ -635,9 +635,9 @@ template <class ELFT> Symbol *ObjFile<EL
StringRefZ Name = this->StringTable.data() + Sym->st_name;
if (Sym->st_shndx == SHN_UNDEF)
- return make<Undefined>(Name, Binding, StOther, Type);
+ return make<Undefined>(this, Name, Binding, StOther, Type);
- return make<Defined>(Name, Binding, StOther, Type, Value, Size, Sec);
+ return make<Defined>(this, Name, Binding, StOther, Type, Value, Size, Sec);
}
StringRef Name = check(Sym->getName(this->StringTable), toString(this));
Modified: lld/trunk/ELF/LTO.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/LTO.cpp (original)
+++ lld/trunk/ELF/LTO.cpp Wed Nov 29 14:47:35 2017
@@ -145,7 +145,7 @@ void BitcodeCompiler::add(BitcodeFile &F
// flags an undefined in IR with a definition in ASM as prevailing.
// Once IRObjectFile is fixed to report only one symbol this hack can
// be removed.
- R.Prevailing = !ObjSym.isUndefined() && Sym->getFile() == &F;
+ R.Prevailing = !ObjSym.isUndefined() && Sym->File == &F;
// We ask LTO to preserve following global symbols:
// 1) All symbols when doing relocatable link, so that them can be used
Modified: lld/trunk/ELF/MapFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MapFile.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/MapFile.cpp (original)
+++ lld/trunk/ELF/MapFile.cpp Wed Nov 29 14:47:35 2017
@@ -52,7 +52,7 @@ static std::vector<Defined *> getSymbols
for (InputFile *File : ObjectFiles)
for (Symbol *B : File->getSymbols())
if (auto *DR = dyn_cast<Defined>(B))
- if (DR->getFile() == File && !DR->isSection() && DR->Section &&
+ if (DR->File == File && !DR->isSection() && DR->Section &&
DR->Section->Live)
V.push_back(DR);
return V;
Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Wed Nov 29 14:47:35 2017
@@ -73,7 +73,7 @@ template <class ELFT>
static std::string getLocation(InputSectionBase &S, const Symbol &Sym,
uint64_t Off) {
std::string Msg =
- "\n>>> defined in " + toString(Sym.getFile()) + "\n>>> referenced by ";
+ "\n>>> defined in " + toString(Sym.File) + "\n>>> referenced by ";
std::string Src = S.getSrcMsg<ELFT>(Sym, Off);
if (!Src.empty())
Msg += Src + "\n>>> ";
@@ -641,7 +641,7 @@ static RelExpr adjustExpr(Symbol &Sym, R
}
errorOrWarn("symbol '" + toString(Sym) + "' defined in " +
- toString(Sym.getFile()) + " has no type");
+ toString(Sym.File) + " has no type");
return Expr;
}
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Wed Nov 29 14:47:35 2017
@@ -421,8 +421,7 @@ static void warnOrError(const Twine &Msg
static void reportDuplicate(Symbol *Sym, InputFile *NewFile) {
warnOrError("duplicate symbol: " + toString(*Sym) + "\n>>> defined in " +
- toString(Sym->getFile()) + "\n>>> defined in " +
- toString(NewFile));
+ toString(Sym->File) + "\n>>> defined in " + toString(NewFile));
}
template <class ELFT>
Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Wed Nov 29 14:47:35 2017
@@ -93,7 +93,7 @@ static uint64_t getSymVA(const Symbol &S
if (D.isTls() && !Config->Relocatable) {
if (!Out::TlsPhdr)
- fatal(toString(D.getFile()) +
+ fatal(toString(D.File) +
" has an STT_TLS symbol but doesn't have an SHF_TLS section");
return VA - Out::TlsPhdr->p_vaddr;
}
@@ -123,17 +123,6 @@ bool Symbol::isUndefWeak() const {
return !isLocal() && isWeak() && (isUndefined() || isLazy());
}
-InputFile *Symbol::getFile() const {
- if (isLocal()) {
- const SectionBase *Sec = cast<Defined>(this)->Section;
- // Local absolute symbols actually have a file, but that is not currently
- // used. We could support that by having a mostly redundant InputFile in
- // Symbol, or having a special absolute section if needed.
- return Sec ? cast<InputSectionBase>(Sec)->File : nullptr;
- }
- return File;
-}
-
uint64_t Symbol::getVA(int64_t Addend) const {
uint64_t OutVA = getSymVA(*this, Addend);
return OutVA + Addend;
@@ -226,7 +215,7 @@ void Symbol::parseSymbolVersion() {
// but we may still want to override a versioned symbol from DSO,
// so we do not report error in this case.
if (Config->Shared)
- error(toString(getFile()) + ": symbol " + S + " has undefined version " +
+ error(toString(File) + ": symbol " + S + " has undefined version " +
Verstr);
}
@@ -236,9 +225,7 @@ InputFile *Lazy::fetch() {
return cast<LazyObject>(this)->fetch();
}
-ArchiveFile *LazyArchive::getFile() {
- return cast<ArchiveFile>(Symbol::getFile());
-}
+ArchiveFile *LazyArchive::getFile() { return cast<ArchiveFile>(File); }
InputFile *LazyArchive::fetch() {
std::pair<MemoryBufferRef, uint64_t> MBInfo = getFile()->getMember(&Sym);
@@ -250,9 +237,7 @@ InputFile *LazyArchive::fetch() {
return createObjectFile(MBInfo.first, getFile()->getName(), MBInfo.second);
}
-LazyObjFile *LazyObject::getFile() {
- return cast<LazyObjFile>(Symbol::getFile());
-}
+LazyObjFile *LazyObject::getFile() { return cast<LazyObjFile>(File); }
InputFile *LazyObject::fetch() { return getFile()->fetch(); }
Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Wed Nov 29 14:47:35 2017
@@ -85,7 +85,7 @@ public:
unsigned InVersionScript : 1;
// The file from which this symbol was created.
- InputFile *File = nullptr;
+ InputFile *File;
bool includeInDynsym() const;
uint8_t computeBinding() const;
@@ -104,7 +104,6 @@ public:
// all input files have been added.
bool isUndefWeak() const;
- InputFile *getFile() const;
StringRef getName() const { return Name; }
uint8_t getVisibility() const { return StOther & 0x3; }
void parseSymbolVersion();
@@ -129,9 +128,9 @@ public:
uint32_t GlobalDynIndex = -1;
protected:
- Symbol(Kind K, StringRefZ Name, uint8_t Binding, uint8_t StOther,
- uint8_t Type)
- : Binding(Binding), SymbolKind(K), NeedsPltAddr(false),
+ Symbol(Kind K, InputFile *File, StringRefZ Name, uint8_t Binding,
+ uint8_t StOther, uint8_t Type)
+ : Binding(Binding), File(File), SymbolKind(K), NeedsPltAddr(false),
IsInGlobalMipsGot(false), Is32BitMipsGot(false), IsInIplt(false),
IsInIgot(false), IsPreemptible(false), Used(!Config->GcSections),
Type(Type), StOther(StOther), Name(Name) {}
@@ -184,9 +183,9 @@ protected:
// Represents a symbol that is defined in the current output file.
class Defined : public Symbol {
public:
- Defined(StringRefZ Name, uint8_t Binding, uint8_t StOther, uint8_t Type,
- uint64_t Value, uint64_t Size, SectionBase *Section)
- : Symbol(DefinedKind, Name, Binding, StOther, Type), Value(Value),
+ Defined(InputFile *File, StringRefZ Name, uint8_t Binding, uint8_t StOther,
+ uint8_t Type, uint64_t Value, uint64_t Size, SectionBase *Section)
+ : Symbol(DefinedKind, File, Name, Binding, StOther, Type), Value(Value),
Size(Size), Section(Section) {}
static bool classof(const Symbol *S) { return S->isDefined(); }
@@ -198,8 +197,9 @@ public:
class Undefined : public Symbol {
public:
- Undefined(StringRefZ Name, uint8_t Binding, uint8_t StOther, uint8_t Type)
- : Symbol(UndefinedKind, Name, Binding, StOther, Type) {}
+ Undefined(InputFile *File, StringRefZ Name, uint8_t Binding, uint8_t StOther,
+ uint8_t Type)
+ : Symbol(UndefinedKind, File, Name, Binding, StOther, Type) {}
static bool classof(const Symbol *S) { return S->kind() == UndefinedKind; }
};
@@ -208,10 +208,10 @@ class SharedSymbol : public Symbol {
public:
static bool classof(const Symbol *S) { return S->kind() == SharedKind; }
- SharedSymbol(StringRef Name, uint8_t Binding, uint8_t StOther, uint8_t Type,
- uint64_t Value, uint64_t Size, uint32_t Alignment,
- const void *Verdef)
- : Symbol(SharedKind, Name, Binding, StOther, Type), Verdef(Verdef),
+ SharedSymbol(InputFile *File, StringRef Name, uint8_t Binding,
+ uint8_t StOther, uint8_t Type, uint64_t Value, uint64_t Size,
+ uint32_t Alignment, const void *Verdef)
+ : Symbol(SharedKind, File, Name, Binding, StOther, Type), Verdef(Verdef),
Value(Value), Size(Size), Alignment(Alignment) {
// GNU ifunc is a mechanism to allow user-supplied functions to
// resolve PLT slot values at load-time. This is contrary to the
@@ -234,7 +234,7 @@ public:
}
template <class ELFT> SharedFile<ELFT> *getFile() const {
- return cast<SharedFile<ELFT>>(Symbol::getFile());
+ return cast<SharedFile<ELFT>>(File);
}
// This field is a pointer to the symbol's version definition.
@@ -266,8 +266,9 @@ public:
InputFile *fetch();
protected:
- Lazy(Kind K, StringRef Name, uint8_t Type)
- : Symbol(K, Name, llvm::ELF::STB_GLOBAL, llvm::ELF::STV_DEFAULT, Type) {}
+ Lazy(Kind K, InputFile *File, StringRef Name, uint8_t Type)
+ : Symbol(K, File, Name, llvm::ELF::STB_GLOBAL, llvm::ELF::STV_DEFAULT,
+ Type) {}
};
// This class represents a symbol defined in an archive file. It is
@@ -276,8 +277,9 @@ protected:
// symbol.
class LazyArchive : public Lazy {
public:
- LazyArchive(const llvm::object::Archive::Symbol S, uint8_t Type)
- : Lazy(LazyArchiveKind, S.getName(), Type), Sym(S) {}
+ LazyArchive(InputFile *File, const llvm::object::Archive::Symbol S,
+ uint8_t Type)
+ : Lazy(LazyArchiveKind, File, S.getName(), Type), Sym(S) {}
static bool classof(const Symbol *S) { return S->kind() == LazyArchiveKind; }
@@ -292,7 +294,8 @@ private:
// --start-lib and --end-lib options.
class LazyObject : public Lazy {
public:
- LazyObject(StringRef Name, uint8_t Type) : Lazy(LazyObjectKind, Name, Type) {}
+ LazyObject(InputFile *File, StringRef Name, uint8_t Type)
+ : Lazy(LazyObjectKind, File, Name, Type) {}
static bool classof(const Symbol *S) { return S->kind() == LazyObjectKind; }
@@ -343,7 +346,7 @@ union SymbolUnion {
void printTraceSymbol(Symbol *Sym);
template <typename T, typename... ArgT>
-void replaceSymbol(Symbol *S, InputFile *File, ArgT &&... Arg) {
+void replaceSymbol(Symbol *S, ArgT &&... Arg) {
static_assert(sizeof(T) <= sizeof(SymbolUnion), "SymbolUnion too small");
static_assert(alignof(T) <= alignof(SymbolUnion),
"SymbolUnion not aligned enough");
@@ -353,7 +356,6 @@ void replaceSymbol(Symbol *S, InputFile
Symbol Sym = *S;
new (S) T(std::forward<ArgT>(Arg)...);
- S->File = File;
S->VersionId = Sym.VersionId;
S->Visibility = Sym.Visibility;
Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Wed Nov 29 14:47:35 2017
@@ -275,8 +275,8 @@ InputSection *elf::createInterpSection()
Symbol *elf::addSyntheticLocal(StringRef Name, uint8_t Type, uint64_t Value,
uint64_t Size, InputSectionBase *Section) {
- auto *S =
- make<Defined>(Name, STB_LOCAL, STV_DEFAULT, Type, Value, Size, Section);
+ auto *S = make<Defined>(Section->File, Name, STB_LOCAL, STV_DEFAULT, Type,
+ Value, Size, Section);
if (InX::SymTab)
InX::SymTab->addSymbol(S);
return S;
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=319378&r1=319377&r2=319378&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Wed Nov 29 14:47:35 2017
@@ -508,8 +508,9 @@ template <class ELFT> void Writer<ELFT>:
if (isa<SyntheticSection>(IS) && !(IS->Flags & SHF_MERGE))
continue;
- auto *Sym = make<Defined>("", STB_LOCAL, /*StOther=*/0, STT_SECTION,
- /*Value=*/0, /*Size=*/0, IS);
+ auto *Sym =
+ make<Defined>(IS->File, "", STB_LOCAL, /*StOther=*/0, STT_SECTION,
+ /*Value=*/0, /*Size=*/0, IS);
InX::SymTab->addSymbol(Sym);
}
}
More information about the llvm-commits
mailing list