[PATCH] D51720: [COFF] don't mark lazy symbols as used in regular objects

Bob Haarman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 6 01:01:53 PDT 2018


inglorion created this revision.
inglorion added reviewers: ruiu, rnk, hans.
Herald added subscribers: sunfish, aheejin.

r338767 updated the COFF and wasm linker SymbolTable code to be
strutured more like the ELF linker's. That inadvertedly changed the
behavior of the COFF linker so that lazy symbols would be marked as
used in regular objects. This change adds an overload of the insert()
function, similar to the ELF linker, which does not perform that
marking.


https://reviews.llvm.org/D51720

Files:
  lld/COFF/SymbolTable.cpp
  lld/COFF/SymbolTable.h


Index: lld/COFF/SymbolTable.h
===================================================================
--- lld/COFF/SymbolTable.h
+++ lld/COFF/SymbolTable.h
@@ -111,6 +111,9 @@
   }
 
 private:
+  /// Inserts symbol if not already present.
+  std::pair<Symbol *, bool> insert(StringRef Name);
+  /// Same as insert(Name), but also sets IsUsedInRegularObj.
   std::pair<Symbol *, bool> insert(StringRef Name, InputFile *F);
   StringRef findByPrefix(StringRef Prefix);
 
Index: lld/COFF/SymbolTable.cpp
===================================================================
--- lld/COFF/SymbolTable.cpp
+++ lld/COFF/SymbolTable.cpp
@@ -255,20 +255,25 @@
   }
 }
 
-std::pair<Symbol *, bool> SymbolTable::insert(StringRef Name, InputFile *File) {
+std::pair<Symbol *, bool> SymbolTable::insert(StringRef Name) {
   bool Inserted = false;
   Symbol *&Sym = SymMap[CachedHashStringRef(Name)];
   if (!Sym) {
     Sym = reinterpret_cast<Symbol *>(make<SymbolUnion>());
     Sym->IsUsedInRegularObj = false;
     Sym->PendingArchiveLoad = false;
     Inserted = true;
   }
-  if (!File || !isa<BitcodeFile>(File))
-    Sym->IsUsedInRegularObj = true;
   return {Sym, Inserted};
 }
 
+std::pair<Symbol *, bool> SymbolTable::insert(StringRef Name, InputFile *File) {
+  std::pair<Symbol *, bool> Result = insert(Name);
+  if (!File || !isa<BitcodeFile>(File))
+    Result.first->IsUsedInRegularObj = true;
+  return Result;
+}
+
 Symbol *SymbolTable::addUndefined(StringRef Name, InputFile *F,
                                   bool IsWeakAlias) {
   Symbol *S;
@@ -291,7 +296,7 @@
   StringRef Name = Sym.getName();
   Symbol *S;
   bool WasInserted;
-  std::tie(S, WasInserted) = insert(Name, nullptr);
+  std::tie(S, WasInserted) = insert(Name);
   if (WasInserted) {
     replaceSymbol<Lazy>(S, F, Sym);
     return;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51720.164155.patch
Type: text/x-patch
Size: 1806 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180906/0c6d4477/attachment.bin>


More information about the llvm-commits mailing list