COFF: Don't add new undefined symbols for /alternatename.
authorRui Ueyama <ruiu@google.com>
Fri, 19 Jun 2015 19:23:43 +0000 (19:23 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 19 Jun 2015 19:23:43 +0000 (19:23 +0000)
Alternatename option is in the form of /alternatename:<from>=<to>.
It's effect is to resolve <from> as <to> if <from> is still undefined
at end of name resolution.

If <from> is not undefined but completely a new symbol, alternatename
shouldn't do anything. Previously, it introduced a new undefined
symbol for <from>, which resulted in undefined symbol error.

llvm-svn: 240161

lld/COFF/Driver.cpp
lld/COFF/SymbolTable.cpp
lld/test/COFF/alternatename.test

index d73a9ef..2926282 100644 (file)
@@ -525,12 +525,6 @@ bool LinkerDriver::link(int Argc, const char *Argv[]) {
   for (auto &P : Config->AlternateNames) {
     StringRef From = P.first;
     StringRef To = P.second;
-    // If From is already resolved to a Defined type, do nothing.
-    // Otherwise, rename it to see if To can be resolved instead.
-    if (Symtab.find(From))
-      continue;
-    if (Config->Verbose)
-      llvm::outs() << "/alternatename:" << From << "=" << To << "\n";
     if (auto EC = Symtab.rename(From, To)) {
       llvm::errs() << EC.message() << "\n";
       return false;
index 733afb6..0583ebd 100644 (file)
@@ -232,10 +232,19 @@ std::error_code SymbolTable::addUndefined(StringRef Name) {
 
 // Resolve To, and make From an alias to To.
 std::error_code SymbolTable::rename(StringRef From, StringRef To) {
+  // If From is not undefined, do nothing.
+  // Otherwise, rename it to see if To can be resolved instead.
+  auto It = Symtab.find(From);
+  if (It == Symtab.end())
+    return std::error_code();
+  Symbol *Sym = It->second;
+  if (!isa<Undefined>(Sym->Body))
+    return std::error_code();
   SymbolBody *Body = new (Alloc) Undefined(To);
   if (auto EC = resolve(Body))
     return EC;
-  Symtab[From]->Body = Body->getReplacement();
+  Sym->Body = Body->getReplacement();
+  Body->setBackref(Sym);
   return std::error_code();
 }
 
index d069a52..4b88d07 100644 (file)
@@ -4,6 +4,7 @@
 # RUN: lld -flavor link2 /entry:foo /subsystem:console \
 # RUN:   /alternatename:foo=mainCRTStartup \
 # RUN:   /alternatename:foo=mainCRTStartup \
+# RUN:   /alternatename:nosuchsym1=nosuchsym2 \
 # RUN:   /out:%t.exe %t.obj
 
 # RUN: yaml2obj < %s > %t.obj