[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