[lld] r230702 - PECOFF: allow more than one /alternatename for the same symbol.

Rui Ueyama ruiu at google.com
Thu Feb 26 15:43:04 PST 2015


Author: ruiu
Date: Thu Feb 26 17:43:04 2015
New Revision: 230702

URL: http://llvm.org/viewvc/llvm-project?rev=230702&view=rev
Log:
PECOFF: allow more than one /alternatename for the same symbol.

Previously we have a string -> string map to keep the weak alias
symbol mapping. Naturally we can't define more than one weak alias
with that data structure.

This patch is to allow multiple aliases for the same symbol by
changing the map type to string -> set of string map.

Modified:
    lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
    lld/trunk/lib/Driver/WinLinkDriver.cpp
    lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
    lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
    lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp

Modified: lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=230702&r1=230701&r2=230702&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h Thu Feb 26 17:43:04 2015
@@ -257,11 +257,13 @@ public:
   bool addSectionRenaming(raw_ostream &diagnostics,
                           StringRef from, StringRef to);
 
-  StringRef getAlternateName(StringRef def) const;
-  const std::map<std::string, std::string> &alternateNames() {
-    return _alternateNames;
+  const std::set<std::string> &getAlternateNames(StringRef name) {
+    return _alternateNames[name];
+  }
+
+  void addAlternateName(StringRef weak, StringRef def) {
+    _alternateNames[def].insert(weak);
   }
-  void setAlternateName(StringRef def, StringRef weak);
 
   void addNoDefaultLib(StringRef path) {
     if (path.endswith_lower(".lib"))
@@ -423,7 +425,7 @@ private:
   std::unique_ptr<Writer> _writer;
 
   // A map for weak aliases.
-  std::map<std::string, std::string> _alternateNames;
+  std::map<std::string, std::set<std::string>> _alternateNames;
 
   // A map for section renaming. For example, if there is an entry in the map
   // whose value is .rdata -> .text, the section contens of .rdata will be

Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=230702&r1=230701&r2=230702&view=diff
==============================================================================
--- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)
+++ lld/trunk/lib/Driver/WinLinkDriver.cpp Thu Feb 26 17:43:04 2015
@@ -954,7 +954,7 @@ bool WinLinkDriver::parse(int argc, cons
     StringRef weak, def;
     if (!parseAlternateName(arg->getValue(), weak, def, diag))
       return false;
-    ctx.setAlternateName(weak, def);
+    ctx.addAlternateName(weak, def);
   }
 
   // Parse /base command line option. The argument for the parameter is in

Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=230702&r1=230701&r2=230702&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Thu Feb 26 17:43:04 2015
@@ -215,17 +215,6 @@ bool PECOFFLinkingContext::addSectionRen
   return true;
 }
 
-StringRef PECOFFLinkingContext::getAlternateName(StringRef def) const {
-  auto it = _alternateNames.find(def);
-  if (it == _alternateNames.end())
-    return "";
-  return it->second;
-}
-
-void PECOFFLinkingContext::setAlternateName(StringRef weak, StringRef def) {
-  _alternateNames[def] = weak;
-}
-
 /// Try to find the input library file from the search paths and append it to
 /// the input file list. Returns true if the library file is found.
 StringRef PECOFFLinkingContext::searchLibraryFile(StringRef filename) const {

Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=230702&r1=230701&r2=230702&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Thu Feb 26 17:43:04 2015
@@ -112,7 +112,7 @@ public:
     _undefinedAtoms._atoms.push_back(new (_alloc) COFFUndefinedAtom(*this, sym));
   }
 
-  AliasAtom *createAlias(StringRef name, const DefinedAtom *target);
+  AliasAtom *createAlias(StringRef name, const DefinedAtom *target, int cnt);
   void createAlternateNameAtoms();
   std::error_code parseDirectiveSection(
     StringRef directives, std::set<StringRef> *undefinedSymbols);
@@ -860,24 +860,24 @@ std::error_code FileCOFF::getSectionCont
   return std::error_code();
 }
 
-AliasAtom *FileCOFF::createAlias(StringRef name,
-                                 const DefinedAtom *target) {
+AliasAtom *
+FileCOFF::createAlias(StringRef name, const DefinedAtom *target, int cnt) {
   AliasAtom *alias = new (_alloc) AliasAtom(*this, name);
   alias->addReference(Reference::KindNamespace::all, Reference::KindArch::all,
                       Reference::kindLayoutAfter, 0, target, 0);
   alias->setMerge(DefinedAtom::mergeAsWeak);
   if (target->contentType() == DefinedAtom::typeCode)
     alias->setDeadStrip(DefinedAtom::deadStripNever);
-  alias->setOrdinal(target->ordinal() - 1);
+  alias->setOrdinal(target->ordinal() - cnt);
   return alias;
 }
 
 void FileCOFF::createAlternateNameAtoms() {
   std::vector<AliasAtom *> aliases;
   for (const DefinedAtom *atom : defined()) {
-    auto it = _ctx.alternateNames().find(atom->name());
-    if (it != _ctx.alternateNames().end())
-      aliases.push_back(createAlias(it->second, atom));
+    int cnt = 1;
+    for (StringRef alias : _ctx.getAlternateNames(atom->name()))
+      aliases.push_back(createAlias(alias, atom, cnt++));
   }
   for (AliasAtom *alias : aliases)
     _definedAtoms._atoms.push_back(alias);

Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=230702&r1=230701&r2=230702&view=diff
==============================================================================
--- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)
+++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Thu Feb 26 17:43:04 2015
@@ -149,9 +149,13 @@ TEST_F(WinLinkParserTest, InputOrder) {
 //
 
 TEST_F(WinLinkParserTest, AlternateName) {
-  EXPECT_TRUE(parse("link.exe", "/alternatename:sym1=sym2", "a.out", nullptr));
-  EXPECT_EQ("sym1", _ctx.getAlternateName("sym2"));
-  EXPECT_EQ("", _ctx.getAlternateName("foo"));
+  EXPECT_TRUE(parse("link.exe", "/alternatename:sym1=sym",
+                    "/alternatename:sym2=sym", "a.out", nullptr));
+  const std::set<std::string> &aliases = _ctx.getAlternateNames("sym");
+  EXPECT_EQ(2U, aliases.size());
+  auto it = aliases.begin();
+  EXPECT_EQ("sym1", *it++);
+  EXPECT_EQ("sym2", *it++);
 }
 
 TEST_F(WinLinkParserTest, Export) {





More information about the llvm-commits mailing list