[lld] r329092 - Make fetchIfLazy only fetch an object file. NFC.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 3 11:01:19 PDT 2018


Author: ruiu
Date: Tue Apr  3 11:01:18 2018
New Revision: 329092

URL: http://llvm.org/viewvc/llvm-project?rev=329092&view=rev
Log:
Make fetchIfLazy only fetch an object file. NFC.

Previously, fetchIfLazy did more than the name says. Now, setting
to UsedInRegularObj is moved to another function.

Modified:
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/ELF/SymbolTable.h

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=329092&r1=329091&r2=329092&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Tue Apr  3 11:01:18 2018
@@ -1017,6 +1017,20 @@ static void excludeLibs(opt::InputArgLis
             Sym->VersionId = VER_NDX_LOCAL;
 }
 
+// Force Sym to be entered in the output. Used for -u or equivalent.
+template <class ELFT> static void handleUndefined(StringRef Name) {
+  Symbol *Sym = Symtab->find(Name);
+  if (!Sym)
+    return;
+
+  // Since symbol S may not be used inside the program, LTO may
+  // eliminate it. Mark the symbol as "used" to prevent it.
+  Sym->IsUsedInRegularObj = true;
+
+  if (Sym->isLazy())
+    Symtab->fetchLazy<ELFT>(Sym);
+}
+
 // Do actual linking. Note that when this function is called,
 // all linker scripts have already been parsed.
 template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
@@ -1081,16 +1095,12 @@ template <class ELFT> void LinkerDriver:
 
   // Handle the `--undefined <sym>` options.
   for (StringRef S : Config->Undefined)
-    if (Symbol *Sym = Symtab->find(S))
-      if (InputFile *F = Symtab->fetchIfLazy(Sym))
-        Symtab->addFile<ELFT>(F);
+    handleUndefined<ELFT>(S);
 
   // If an entry symbol is in a static archive, pull out that file now
   // to complete the symbol table. After this, no new names except a
   // few linker-synthesized ones will be added to the symbol table.
-  if (Symbol *Sym = Symtab->find(Config->Entry))
-    if (InputFile *F = Symtab->fetchIfLazy(Sym))
-      Symtab->addFile<ELFT>(F);
+  handleUndefined<ELFT>(Config->Entry);
 
   // Return if there were name resolution errors.
   if (errorCount())

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=329092&r1=329091&r2=329092&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Tue Apr  3 11:01:18 2018
@@ -314,8 +314,8 @@ Symbol *SymbolTable::addUndefined(String
     // Symbols.h for the details.
     if (Binding == STB_WEAK)
       S->Type = Type;
-    else if (InputFile *F = Symtab->fetchIfLazy(S))
-      addFile<ELFT>(F);
+    else
+      fetchLazy<ELFT>(S);
   }
   return S;
 }
@@ -574,15 +574,16 @@ void SymbolTable::addLazyObject(StringRe
     addFile<ELFT>(F);
 }
 
-InputFile *SymbolTable::fetchIfLazy(Symbol *Sym) {
-  // Mark the symbol not to be eliminated by LTO
-  // even if it is a bitcode symbol.
-  Sym->IsUsedInRegularObj = true;
-  if (LazyArchive *L = dyn_cast<LazyArchive>(Sym))
-    return L->fetch();
-  if (LazyObject *L = dyn_cast<LazyObject>(Sym))
-    return cast<LazyObjFile>(L->File)->fetch();
-  return nullptr;
+template <class ELFT> void SymbolTable::fetchLazy(Symbol *Sym) {
+  if (auto *S = dyn_cast<LazyArchive>(Sym)) {
+    if (InputFile *File = S->fetch())
+      addFile<ELFT>(File);
+    return;
+  }
+
+  auto *S = cast<LazyObject>(Sym);
+  if (InputFile *File = cast<LazyObjFile>(S->File)->fetch())
+    addFile<ELFT>(File);
 }
 
 // Initialize DemangledSyms with a map from demangled symbols to symbol

Modified: lld/trunk/ELF/SymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=329092&r1=329091&r2=329092&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.h (original)
+++ lld/trunk/ELF/SymbolTable.h Tue Apr  3 11:01:18 2018
@@ -77,7 +77,7 @@ public:
                                    uint8_t Visibility, bool CanOmitFromDynSym,
                                    InputFile *File);
 
-  InputFile *fetchIfLazy(Symbol *Sym);
+  template <class ELFT> void fetchLazy(Symbol *Sym);
 
   void scanVersionScript();
 




More information about the llvm-commits mailing list