[lld] r232646 - PECOFF: Do not copy all undefined symbols to a set. NFC.

Rui Ueyama ruiu at google.com
Wed Mar 18 09:28:34 PDT 2015


Author: ruiu
Date: Wed Mar 18 11:28:33 2015
New Revision: 232646

URL: http://llvm.org/viewvc/llvm-project?rev=232646&view=rev
Log:
PECOFF: Do not copy all undefined symbols to a set. NFC.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp

Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=232646&r1=232645&r2=232646&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Wed Mar 18 11:28:33 2015
@@ -439,7 +439,6 @@ void FileCOFF::createAbsoluteAtoms(const
       continue;
     auto *atom = new (_alloc) SimpleAbsoluteAtom(*this, _symbolName[sym],
                                                  getScope(sym), sym.getValue());
-
     result.push_back(atom);
     _symbolAtom[sym] = atom;
   }
@@ -455,15 +454,12 @@ void FileCOFF::createAbsoluteAtoms(const
 std::error_code
 FileCOFF::createUndefinedAtoms(const SymbolVectorT &symbols,
                                std::vector<const UndefinedAtom *> &result) {
-  // Sort out undefined symbols from all symbols.
-  std::set<llvm::object::COFFSymbolRef> undefines;
   std::map<llvm::object::COFFSymbolRef, llvm::object::COFFSymbolRef>
       weakExternal;
+  std::set<llvm::object::COFFSymbolRef> fallback;
   for (llvm::object::COFFSymbolRef sym : symbols) {
     if (sym.getSectionNumber() != llvm::COFF::IMAGE_SYM_UNDEFINED)
       continue;
-    undefines.insert(sym);
-
     // Create a mapping from sym1 to sym2, if the undefined symbol has
     // auxiliary data.
     auto iter = _auxSymbol.find(sym);
@@ -476,16 +472,16 @@ FileCOFF::createUndefinedAtoms(const Sym
     if (std::error_code ec = sym2.getError())
       return ec;
     weakExternal[sym] = *sym2;
+    fallback.insert(*sym2);
   }
 
-  // Sort out sym1s from sym2s. Sym2s shouldn't be added to the undefined atom
-  // list because they shouldn't be resolved unless sym1 is failed to
-  // be resolved.
-  for (auto i : weakExternal)
-    undefines.erase(i.second);
-
   // Create atoms for the undefined symbols.
-  for (llvm::object::COFFSymbolRef sym : undefines) {
+  for (llvm::object::COFFSymbolRef sym : symbols) {
+    if (sym.getSectionNumber() != llvm::COFF::IMAGE_SYM_UNDEFINED)
+      continue;
+    if (fallback.count(sym) > 0)
+      continue;
+
     // If the symbol has sym2, create an undefiend atom for sym2, so that we
     // can pass it as a fallback atom.
     UndefinedAtom *fallback = nullptr;





More information about the llvm-commits mailing list