[lld] r275701 - Add a pointer to a source file to SymbolBody.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 16 20:11:46 PDT 2016
Author: ruiu
Date: Sat Jul 16 22:11:46 2016
New Revision: 275701
URL: http://llvm.org/viewvc/llvm-project?rev=275701&view=rev
Log:
Add a pointer to a source file to SymbolBody.
Previously, each subclass of SymbolBody had a pointer to a source
file from which it was created. So, there was no single way to get
a source file for a symbol. We had getSourceFile<ELFT>(), but the
function was a bit inconvenient as it's a template.
This patch makes SymbolBody have a pointer to a source file.
If a symbol is not created from a file, the pointer has a nullptr.
Modified:
lld/trunk/ELF/InputFiles.cpp
lld/trunk/ELF/LTO.cpp
lld/trunk/ELF/OutputSections.cpp
lld/trunk/ELF/Relocations.cpp
lld/trunk/ELF/SymbolTable.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=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Sat Jul 16 22:11:46 2016
@@ -352,7 +352,7 @@ SymbolBody *elf::ObjectFile<ELFT>::creat
if (Binding == STB_LOCAL) {
if (Sym->st_shndx == SHN_UNDEF)
return new (this->Alloc)
- Undefined(Sym->st_name, Sym->st_other, Sym->getType());
+ Undefined(Sym->st_name, Sym->st_other, Sym->getType(), this);
return new (this->Alloc) DefinedRegular<ELFT>(*Sym, Sec);
}
Modified: lld/trunk/ELF/LTO.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/LTO.cpp (original)
+++ lld/trunk/ELF/LTO.cpp Sat Jul 16 22:11:46 2016
@@ -147,7 +147,8 @@ BitcodeCompiler::BitcodeCompiler()
: Combined(new Module("ld-temp.o", Driver->Context)) {}
static void undefine(Symbol *S) {
- replaceBody<Undefined>(S, S->body()->getName(), STV_DEFAULT, S->body()->Type);
+ replaceBody<Undefined>(S, S->body()->getName(), STV_DEFAULT, S->body()->Type,
+ nullptr);
}
static void handleUndefinedAsmRefs(const BasicSymbolRef &Sym, GlobalValue *GV,
@@ -198,7 +199,7 @@ void BitcodeCompiler::add(BitcodeFile &F
continue;
}
auto *B = dyn_cast<DefinedBitcode>(S->body());
- if (!B || B->File != &F)
+ if (!B || B->file() != &F)
continue;
// We collect the set of symbols we want to internalize here
Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Sat Jul 16 22:11:46 2016
@@ -1570,7 +1570,7 @@ void VersionNeedSection<ELFT>::addSymbol
SS->symbol()->VersionId = VER_NDX_GLOBAL;
return;
}
- SharedFile<ELFT> *F = SS->File;
+ SharedFile<ELFT> *F = SS->file();
// If we don't already know that we need an Elf_Verneed for this DSO, prepare
// to create one by adding it to our needed list and creating a dynstr entry
// for the soname.
@@ -1582,7 +1582,7 @@ void VersionNeedSection<ELFT>::addSymbol
// dynstr entry for the version name.
if (NV.Index == 0) {
NV.StrTab = Out<ELFT>::DynStrTab->addString(
- SS->File->getStringTable().data() + SS->Verdef->getAux()->vda_name);
+ SS->file()->getStringTable().data() + SS->Verdef->getAux()->vda_name);
NV.Index = NextIndex++;
}
SS->symbol()->VersionId = NV.Index;
Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Sat Jul 16 22:11:46 2016
@@ -359,7 +359,7 @@ static RelExpr fromPlt(RelExpr Expr) {
template <class ELFT> static uint32_t getAlignment(SharedSymbol<ELFT> *SS) {
typedef typename ELFT::uint uintX_t;
- uintX_t SecAlign = SS->File->getSection(SS->Sym)->sh_addralign;
+ uintX_t SecAlign = SS->file()->getSection(SS->Sym)->sh_addralign;
uintX_t SymValue = SS->Sym.st_value;
int TrailingZeros =
std::min(countTrailingZeros(SecAlign), countTrailingZeros(SymValue));
@@ -385,11 +385,11 @@ template <class ELFT> static void addCop
// Look through the DSO's dynamic symbol table for aliases and create a
// dynamic symbol for each one. This causes the copy relocation to correctly
// interpose any aliases.
- for (const Elf_Sym &S : SS->File->getElfSymbols(true)) {
+ for (const Elf_Sym &S : SS->file()->getElfSymbols(true)) {
if (S.st_shndx != Shndx || S.st_value != Value)
continue;
auto *Alias = dyn_cast_or_null<SharedSymbol<ELFT>>(
- Symtab<ELFT>::X->find(check(S.getName(SS->File->getStringTable()))));
+ Symtab<ELFT>::X->find(check(S.getName(SS->file()->getStringTable()))));
if (!Alias)
continue;
Alias->OffsetInBss = Off;
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Sat Jul 16 22:11:46 2016
@@ -253,7 +253,7 @@ std::string SymbolTable<ELFT>::conflictM
std::string Sym = Existing->getName();
if (Config->Demangle)
Sym = demangle(Sym);
- return Sym + " in " + getFilename(Existing->getSourceFile<ELFT>()) + " and " +
+ return Sym + " in " + getFilename(Existing->File) + " and " +
getFilename(NewFile);
}
@@ -274,22 +274,21 @@ Symbol *SymbolTable<ELFT>::addUndefined(
/*IsUsedInRegularObj*/ !File || !isa<BitcodeFile>(File), File);
if (WasInserted) {
S->Binding = Binding;
- replaceBody<Undefined>(S, Name, StOther, Type);
- cast<Undefined>(S->body())->File = File;
+ replaceBody<Undefined>(S, Name, StOther, Type, File);
return S;
}
if (Binding != STB_WEAK) {
if (S->body()->isShared() || S->body()->isLazy())
S->Binding = Binding;
if (auto *SS = dyn_cast<SharedSymbol<ELFT>>(S->body()))
- SS->File->IsUsed = true;
+ SS->file()->IsUsed = true;
}
if (auto *L = dyn_cast<Lazy>(S->body())) {
// An undefined weak will not fetch archive members, but we have to remember
// its type. See also comment in addLazyArchive.
if (S->isWeak())
L->Type = Type;
- else if (auto F = L->getFile())
+ else if (auto F = L->fetch())
addFile(std::move(F));
}
return S;
@@ -535,7 +534,7 @@ void SymbolTable<ELFT>::addLazyObject(St
template <class ELFT> void SymbolTable<ELFT>::scanUndefinedFlags() {
for (StringRef S : Config->Undefined)
if (auto *L = dyn_cast_or_null<Lazy>(find(S)))
- if (std::unique_ptr<InputFile> File = L->getFile())
+ if (std::unique_ptr<InputFile> File = L->fetch())
addFile(std::move(File));
}
@@ -653,9 +652,9 @@ template <class ELFT> void SymbolTable<E
for (const auto &Symbol : Config->TraceSymbol)
if (SymbolBody *B = find(Symbol.getKey()))
if (B->isDefined() || B->isCommon())
- if (InputFile *File = B->getSourceFile<ELFT>())
- outs() << getFilename(File) << ": definition of "
- << B->getName() << "\n";
+ if (B->File)
+ outs() << getFilename(B->File) << ": definition of " << B->getName()
+ << "\n";
}
template class elf::SymbolTable<ELF32LE>;
Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Sat Jul 16 22:11:46 2016
@@ -142,18 +142,6 @@ template <class ELFT> bool SymbolBody::h
return false;
}
-template <class ELFT> InputFile *SymbolBody::getSourceFile() {
- if (auto *S = dyn_cast<DefinedRegular<ELFT>>(this))
- return S->Section ? S->Section->getFile() : nullptr;
- if (auto *S = dyn_cast<SharedSymbol<ELFT>>(this))
- return S->File;
- if (auto *S = dyn_cast<DefinedBitcode>(this))
- return S->File;
- if (auto *S = dyn_cast<Undefined>(this))
- return S->File;
- return nullptr;
-}
-
template <class ELFT>
typename ELFT::uint SymbolBody::getVA(typename ELFT::uint Addend) const {
typename ELFT::uint OutVA = getSymVA<ELFT>(*this, Addend);
@@ -207,17 +195,25 @@ Defined::Defined(Kind K, uint32_t NameOf
DefinedBitcode::DefinedBitcode(StringRef Name, uint8_t StOther, uint8_t Type,
BitcodeFile *F)
- : Defined(DefinedBitcodeKind, Name, StOther, Type), File(F) {}
+ : Defined(DefinedBitcodeKind, Name, StOther, Type) {
+ this->File = F;
+}
bool DefinedBitcode::classof(const SymbolBody *S) {
return S->kind() == DefinedBitcodeKind;
}
-Undefined::Undefined(StringRef Name, uint8_t StOther, uint8_t Type)
- : SymbolBody(SymbolBody::UndefinedKind, Name, StOther, Type) {}
+Undefined::Undefined(StringRef Name, uint8_t StOther, uint8_t Type,
+ InputFile *File)
+ : SymbolBody(SymbolBody::UndefinedKind, Name, StOther, Type) {
+ this->File = File;
+}
-Undefined::Undefined(uint32_t NameOffset, uint8_t StOther, uint8_t Type)
- : SymbolBody(SymbolBody::UndefinedKind, NameOffset, StOther, Type) {}
+Undefined::Undefined(uint32_t NameOffset, uint8_t StOther, uint8_t Type,
+ InputFile *File)
+ : SymbolBody(SymbolBody::UndefinedKind, NameOffset, StOther, Type) {
+ this->File = File;
+}
template <typename ELFT>
DefinedSynthetic<ELFT>::DefinedSynthetic(StringRef N, uintX_t Value,
@@ -230,24 +226,35 @@ DefinedCommon::DefinedCommon(StringRef N
: Defined(SymbolBody::DefinedCommonKind, N, StOther, Type),
Alignment(Alignment), Size(Size) {}
-std::unique_ptr<InputFile> Lazy::getFile() {
+std::unique_ptr<InputFile> Lazy::fetch() {
if (auto *S = dyn_cast<LazyArchive>(this))
- return S->getFile();
- return cast<LazyObject>(this)->getFile();
+ return S->fetch();
+ return cast<LazyObject>(this)->fetch();
}
-std::unique_ptr<InputFile> LazyArchive::getFile() {
- MemoryBufferRef MBRef = File.getMember(&Sym);
+LazyArchive::LazyArchive(ArchiveFile &File,
+ const llvm::object::Archive::Symbol S, uint8_t Type)
+ : Lazy(LazyArchiveKind, S.getName(), Type), Sym(S) {
+ this->File = &File;
+}
+
+LazyObject::LazyObject(StringRef Name, LazyObjectFile &File, uint8_t Type)
+ : Lazy(LazyObjectKind, Name, Type) {
+ this->File = &File;
+}
+
+std::unique_ptr<InputFile> LazyArchive::fetch() {
+ MemoryBufferRef MBRef = file()->getMember(&Sym);
// getMember returns an empty buffer if the member was already
// read from the library.
if (MBRef.getBuffer().empty())
return std::unique_ptr<InputFile>(nullptr);
- return createObjectFile(MBRef, File.getName());
+ return createObjectFile(MBRef, file()->getName());
}
-std::unique_ptr<InputFile> LazyObject::getFile() {
- MemoryBufferRef MBRef = File.getBuffer();
+std::unique_ptr<InputFile> LazyObject::fetch() {
+ MemoryBufferRef MBRef = file()->getBuffer();
if (MBRef.getBuffer().empty())
return std::unique_ptr<InputFile>(nullptr);
return createObjectFile(MBRef);
@@ -264,11 +271,6 @@ template bool SymbolBody::hasThunk<ELF32
template bool SymbolBody::hasThunk<ELF64LE>() const;
template bool SymbolBody::hasThunk<ELF64BE>() const;
-template InputFile *SymbolBody::template getSourceFile<ELF32LE>();
-template InputFile *SymbolBody::template getSourceFile<ELF32BE>();
-template InputFile *SymbolBody::template getSourceFile<ELF64LE>();
-template InputFile *SymbolBody::template getSourceFile<ELF64BE>();
-
template uint32_t SymbolBody::template getVA<ELF32LE>(uint32_t) const;
template uint32_t SymbolBody::template getVA<ELF32BE>(uint32_t) const;
template uint64_t SymbolBody::template getVA<ELF64LE>(uint64_t) const;
Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Sat Jul 16 22:11:46 2016
@@ -99,9 +99,8 @@ public:
template <class ELFT> typename ELFT::uint getThunkVA() const;
template <class ELFT> typename ELFT::uint getSize() const;
- // Returns the file from which the symbol was created.
- // For logging purpose only.
- template <class ELFT> InputFile *getSourceFile();
+ // The file from which this symbol was created.
+ InputFile *File = nullptr;
protected:
SymbolBody(Kind K, StringRef Name, uint8_t StOther, uint8_t Type);
@@ -163,8 +162,7 @@ class DefinedBitcode : public Defined {
public:
DefinedBitcode(StringRef Name, uint8_t StOther, uint8_t Type, BitcodeFile *F);
static bool classof(const SymbolBody *S);
-
- BitcodeFile *File;
+ BitcodeFile *file() { return (BitcodeFile *)this->File; }
};
class DefinedCommon : public Defined {
@@ -197,7 +195,10 @@ public:
: Defined(SymbolBody::DefinedRegularKind, Name, Sym.st_other,
Sym.getType()),
Value(Sym.st_value), Size(Sym.st_size),
- Section(Section ? Section->Repl : NullInputSection) {}
+ Section(Section ? Section->Repl : NullInputSection) {
+ if (Section)
+ this->File = Section->getFile();
+ }
DefinedRegular(const Elf_Sym &Sym, InputSectionBase<ELFT> *Section)
: Defined(SymbolBody::DefinedRegularKind, Sym.st_name, Sym.st_other,
@@ -205,6 +206,8 @@ public:
Value(Sym.st_value), Size(Sym.st_size),
Section(Section ? Section->Repl : NullInputSection) {
assert(isLocal());
+ if (Section)
+ this->File = Section->getFile();
}
DefinedRegular(StringRef Name, uint8_t StOther)
@@ -263,16 +266,14 @@ public:
class Undefined : public SymbolBody {
public:
- Undefined(StringRef Name, uint8_t StOther, uint8_t Type);
- Undefined(uint32_t NameOffset, uint8_t StOther, uint8_t Type);
+ Undefined(StringRef Name, uint8_t StOther, uint8_t Type, InputFile *F);
+ Undefined(uint32_t NameOffset, uint8_t StOther, uint8_t Type, InputFile *F);
static bool classof(const SymbolBody *S) {
return S->kind() == UndefinedKind;
}
- // The file this undefined symbol was created from.
- // For logging purpose only.
- InputFile *File = nullptr;
+ InputFile *file() { return this->File; }
};
template <class ELFT> class SharedSymbol : public Defined {
@@ -288,13 +289,16 @@ public:
SharedSymbol(SharedFile<ELFT> *F, StringRef Name, const Elf_Sym &Sym,
const Elf_Verdef *Verdef)
: Defined(SymbolBody::SharedKind, Name, Sym.st_other, Sym.getType()),
- File(F), Sym(Sym), Verdef(Verdef) {
+ Sym(Sym), Verdef(Verdef) {
// IFuncs defined in DSOs are treated as functions by the static linker.
if (isGnuIFunc())
Type = llvm::ELF::STT_FUNC;
+ this->File = F;
}
- SharedFile<ELFT> *File;
+ SharedFile<ELFT> *file() { return (SharedFile<ELFT> *)this->File; }
+
+public:
const Elf_Sym &Sym;
// This field is a pointer to the symbol's version definition.
@@ -323,24 +327,23 @@ public:
// Returns an object file for this symbol, or a nullptr if the file
// was already returned.
- std::unique_ptr<InputFile> getFile();
+ std::unique_ptr<InputFile> fetch();
};
// LazyArchive symbols represents symbols in archive files.
class LazyArchive : public Lazy {
public:
LazyArchive(ArchiveFile &File, const llvm::object::Archive::Symbol S,
- uint8_t Type)
- : Lazy(LazyArchiveKind, S.getName(), Type), File(File), Sym(S) {}
+ uint8_t Type);
static bool classof(const SymbolBody *S) {
return S->kind() == LazyArchiveKind;
}
- std::unique_ptr<InputFile> getFile();
+ ArchiveFile *file() { return (ArchiveFile *)this->File; }
+ std::unique_ptr<InputFile> fetch();
private:
- ArchiveFile &File;
const llvm::object::Archive::Symbol Sym;
};
@@ -348,17 +351,14 @@ private:
// --start-lib and --end-lib options.
class LazyObject : public Lazy {
public:
- LazyObject(StringRef Name, LazyObjectFile &File, uint8_t Type)
- : Lazy(LazyObjectKind, Name, Type), File(File) {}
+ LazyObject(StringRef Name, LazyObjectFile &File, uint8_t Type);
static bool classof(const SymbolBody *S) {
return S->kind() == LazyObjectKind;
}
- std::unique_ptr<InputFile> getFile();
-
-private:
- LazyObjectFile &File;
+ LazyObjectFile *file() { return (LazyObjectFile *)this->File; }
+ std::unique_ptr<InputFile> fetch();
};
// Some linker-generated symbols need to be created as
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=275701&r1=275700&r2=275701&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Sat Jul 16 22:11:46 2016
@@ -275,8 +275,8 @@ static void reportUndefined(SymbolTable<
return;
std::string Msg = "undefined symbol: " + Sym->getName().str();
- if (InputFile *File = Sym->getSourceFile<ELFT>())
- Msg += " in " + getFilename(File);
+ if (Sym->File)
+ Msg += " in " + getFilename(Sym->File);
if (Config->UnresolvedSymbols == UnresolvedPolicy::Warn)
warning(Msg);
else
@@ -715,7 +715,7 @@ template <class ELFT> void Writer<ELFT>:
if (isOutputDynamic() && S->includeInDynsym()) {
Out<ELFT>::DynSymTab->addSymbol(Body);
if (auto *SS = dyn_cast<SharedSymbol<ELFT>>(Body))
- if (SS->File->isNeeded())
+ if (SS->file()->isNeeded())
Out<ELFT>::VerNeed->addSymbol(SS);
}
}
More information about the llvm-commits
mailing list