[lld] r242342 - COFF: Fix mangled dllexported names.

Rui Ueyama ruiu at google.com
Wed Jul 15 15:21:09 PDT 2015


Author: ruiu
Date: Wed Jul 15 17:21:08 2015
New Revision: 242342

URL: http://llvm.org/viewvc/llvm-project?rev=242342&view=rev
Log:
COFF: Fix mangled dllexported names.

If a symbol is exported as /export:foo, and foo is resolved as a
mangled name (_foo@<number> or ?foo@@Y...), that mangled name should
be written to the export table. Previously, we wrote the original
name to the export table.

Modified:
    lld/trunk/COFF/Driver.cpp
    lld/trunk/COFF/Driver.h
    lld/trunk/COFF/DriverUtils.cpp
    lld/trunk/COFF/ModuleDef.cpp
    lld/trunk/test/COFF/dll.test
    lld/trunk/test/COFF/export32.test

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=242342&r1=242341&r2=242342&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Wed Jul 15 17:21:08 2015
@@ -670,13 +670,12 @@ bool LinkerDriver::link(llvm::ArrayRef<c
 
   // Windows specific -- when we are creating a .dll file, we also
   // need to create a .lib file.
-  if (!Config->Exports.empty())
-    writeImportLibrary();
-
-  // Windows specific -- fix up dllexported symbols.
-  if (!Config->Exports.empty())
+  if (!Config->Exports.empty()) {
     if (fixupExports())
       return false;
+    writeImportLibrary();
+    assignExportOrdinals();
+  }
 
   // Windows specific -- Create a side-by-side manifest file.
   if (Config->Manifest == Configuration::SideBySide)

Modified: lld/trunk/COFF/Driver.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.h?rev=242342&r1=242341&r2=242342&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.h (original)
+++ lld/trunk/COFF/Driver.h Wed Jul 15 17:21:08 2015
@@ -150,6 +150,7 @@ std::error_code createSideBySideManifest
 // Used for dllexported symbols.
 ErrorOr<Export> parseExport(StringRef Arg);
 std::error_code fixupExports();
+void assignExportOrdinals();
 
 // Parses a string in the form of "key=value" and check
 // if value matches previous values for the key.

Modified: lld/trunk/COFF/DriverUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=242342&r1=242341&r2=242342&view=diff
==============================================================================
--- lld/trunk/COFF/DriverUtils.cpp (original)
+++ lld/trunk/COFF/DriverUtils.cpp Wed Jul 15 17:21:08 2015
@@ -16,6 +16,7 @@
 #include "Config.h"
 #include "Driver.h"
 #include "Error.h"
+#include "Symbols.h"
 #include "llvm/ADT/Optional.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringSwitch.h"
@@ -372,8 +373,6 @@ ErrorOr<Export> parseExport(StringRef Ar
     std::tie(E.ExtName, E.Name) = E.Name.split("=");
     if (E.Name.empty())
       goto err;
-  } else {
-    E.ExtName = E.Name;
   }
 
   while (!Rest.empty()) {
@@ -425,6 +424,15 @@ std::error_code fixupExports() {
     }
   }
 
+  for (Export &E : Config->Exports) {
+    if (!E.ExtName.empty())
+      continue;
+    StringRef S = E.Sym->repl()->getName();
+    if (!Config->is64() && S.startswith("_"))
+      S = S.substr(1);
+    E.ExtName = S;
+  }
+
   // Uniquefy by name.
   std::map<StringRef, Export *> Map;
   std::vector<Export> V;
@@ -447,7 +455,10 @@ std::error_code fixupExports() {
   std::sort(
       Config->Exports.begin(), Config->Exports.end(),
       [](const Export &A, const Export &B) { return A.ExtName < B.ExtName; });
+  return std::error_code();
+}
 
+void assignExportOrdinals() {
   // Assign unique ordinals if default (= 0).
   uint16_t Max = 0;
   for (Export &E : Config->Exports)
@@ -455,7 +466,6 @@ std::error_code fixupExports() {
   for (Export &E : Config->Exports)
     if (E.Ordinal == 0)
       E.Ordinal = ++Max;
-  return std::error_code();
 }
 
 // Parses a string in the form of "key=value" and check

Modified: lld/trunk/COFF/ModuleDef.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/ModuleDef.cpp?rev=242342&r1=242341&r2=242342&view=diff
==============================================================================
--- lld/trunk/COFF/ModuleDef.cpp (original)
+++ lld/trunk/COFF/ModuleDef.cpp Wed Jul 15 17:21:08 2015
@@ -195,7 +195,7 @@ private:
 
   std::error_code parseExport() {
     Export E;
-    E.ExtName = Tok.Value;
+    E.Name = Tok.Value;
     read();
     if (Tok.K == Equal) {
       read();
@@ -203,10 +203,10 @@ private:
         llvm::errs() << "identifier expected, but got " << Tok.Value << "\n";
         return make_error_code(LLDError::InvalidOption);
       }
+      E.ExtName = E.Name;
       E.Name = Tok.Value;
     } else {
       unget();
-      E.Name = E.ExtName;
     }
 
     if (!Config->is64() && !E.Name.startswith("_@?"))

Modified: lld/trunk/test/COFF/dll.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/dll.test?rev=242342&r1=242341&r2=242342&view=diff
==============================================================================
--- lld/trunk/test/COFF/dll.test (original)
+++ lld/trunk/test/COFF/dll.test Wed Jul 15 17:21:08 2015
@@ -9,10 +9,10 @@ EXPORT:      Export Table:
 EXPORT:      DLL name: dll.test.tmp.dll
 EXPORT:      Ordinal      RVA  Name
 EXPORT-NEXT:       0        0
-EXPORT-NEXT:       1   0x1008  exportfn1
-EXPORT-NEXT:       2   0x1010  exportfn2
-EXPORT-NEXT:       3   0x1010  exportfn3
-EXPORT-NEXT:       4   0x1010  mangled
+EXPORT-NEXT:       1   0x1010  ?mangled@@YAHXZ
+EXPORT-NEXT:       2   0x1008  exportfn1
+EXPORT-NEXT:       3   0x1010  exportfn2
+EXPORT-NEXT:       4   0x1010  exportfn3
 
 # RUN: yaml2obj < %p/Inputs/export2.yaml > %t5.obj
 # RUN: rm -f %t5.lib
@@ -24,8 +24,8 @@ EXPORT2:      Export Table:
 EXPORT2:      DLL name: dll.test.tmp5.dll
 EXPORT2:      Ordinal      RVA  Name
 EXPORT2-NEXT:       0        0
-EXPORT2-NEXT:       1   0x1010  exportfn3
-EXPORT2-NEXT:       2   0x101c  mangled2
+EXPORT2-NEXT:       1   0x101c  ?mangled2@@YAHXZ
+EXPORT2-NEXT:       2   0x1010  exportfn3
 
 # RUN: llvm-as -o %t.lto.obj %p/Inputs/export.ll
 # RUN: lld -flavor link2 /out:%t.lto.dll /dll %t.lto.obj /export:exportfn1 /export:exportfn2
@@ -39,10 +39,6 @@ EXPORT-LTO-NEXT:       1   0x1010  expor
 EXPORT-LTO-NEXT:       2   0x1020  exportfn2
 EXPORT-LTO-NEXT:       3   0x1030  exportfn3
 
-# RUN: yaml2obj < %p/Inputs/import.yaml > %t2.obj
-# RUN: lld -flavor link2 /out:%t2.exe /entry:main %t2.obj %t.lib
-# RUN: llvm-readobj -coff-imports %t2.exe | FileCheck -check-prefix=IMPORT %s
-
 # RUN: lld -flavor link2 /out:%t.dll /dll %t.obj /implib:%t2.lib \
 # RUN:   /export:exportfn1 /export:exportfn2
 # RUN: lld -flavor link2 /out:%t2.exe /entry:main %t2.obj %t2.lib

Modified: lld/trunk/test/COFF/export32.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/export32.test?rev=242342&r1=242341&r2=242342&view=diff
==============================================================================
--- lld/trunk/test/COFF/export32.test (original)
+++ lld/trunk/test/COFF/export32.test Wed Jul 15 17:21:08 2015
@@ -23,9 +23,9 @@ CHECK2-NEXT:       2        0
 CHECK2-NEXT:       3        0
 CHECK2-NEXT:       4        0
 CHECK2-NEXT:       5   0x1008  exportfn1
-CHECK2-NEXT:       6   0x1010  exportfn2
-CHECK2-NEXT:       7   0x1010  exportfn3
-CHECK2-NEXT:       8   0x1010  mangled
+CHECK2-NEXT:       6   0x1010  ?mangled@@YAHXZ
+CHECK2-NEXT:       7   0x1010  exportfn2
+CHECK2-NEXT:       8   0x1010  exportfn3
 
 # RUN: lld -flavor link2 /out:%t.dll /dll %t.obj /export:exportfn1, at 5,noname /export:exportfn2
 # RUN: llvm-objdump -p %t.dll | FileCheck -check-prefix=CHECK3 %s





More information about the llvm-commits mailing list