[PECOFF] Fix exported symbols in an import library.
authorRui Ueyama <ruiu@google.com>
Fri, 5 Dec 2014 21:52:02 +0000 (21:52 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 5 Dec 2014 21:52:02 +0000 (21:52 +0000)
Looks like if you have symbol foo in a module-definition file
(.def file), and if the actual symbol name to match that export
description is _foo@x (where x is an integer), the exported
symbol name becomes this.

  - foo in the .dll file
  - foo@x in the .lib file

I have checked in a few fixes recently for exported symbol name mangling.
I haven't found a simple rule that governs all the mangling rules.
There may not ever exist. For now, this is a patch to improve .lib
file compatibility.

llvm-svn: 223524

lld/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp
lld/test/pecoff/Inputs/exports2.def [new file with mode: 0644]
lld/test/pecoff/exportlib2.test

index d6081c1..fd3360f 100644 (file)
@@ -35,6 +35,8 @@ createModuleDefinitionFile(const PECOFFLinkingContext &ctx) {
     os << "  ";
     if (!desc.externalName.empty()) {
       os << desc.externalName;
+    } else if (!desc.mangledName.empty()) {
+      os << ctx.undecorateSymbol(desc.mangledName);
     } else {
       os << ctx.undecorateSymbol(desc.name);
     }
diff --git a/lld/test/pecoff/Inputs/exports2.def b/lld/test/pecoff/Inputs/exports2.def
new file mode 100644 (file)
index 0000000..1c95f42
--- /dev/null
@@ -0,0 +1,6 @@
+; This is a comment line
+
+EXPORTS
+  exportfn1 @5   ; foo
+  exportfn7
+  exportfn5=exportfn6 PRIVATE
index b2b070b..e846b0b 100644 (file)
@@ -1,8 +1,8 @@
 # RUN: yaml2obj %p/Inputs/export.obj.yaml > %t.obj
 #
 # RUN: lld -flavor link /out:%t.dll /dll /entry:init \
-# RUN:   /export:exportfn1 /export:exportfn2 /lldmoduledeffile:%t.def -- %t.obj
-# RUN: FileCheck -check-prefix=CHECK1 %s < %t.def
+# RUN:   /export:exportfn1 /export:exportfn2 /lldmoduledeffile:%t1.def -- %t.obj
+# RUN: FileCheck -check-prefix=CHECK1 %s < %t1.def
 
 CHECK1: LIBRARY "exportlib2.test.tmp.dll"
 CHECK1: EXPORTS
@@ -11,11 +11,11 @@ CHECK1:   exportfn2 @2
 CHECK1:   exportfn3@256 @3
 
 # RUN: lld -flavor link /out:%t.dll /dll /entry:init \
-# RUN:   /def:%p/Inputs/exports.def /lldmoduledeffile:%t.def -- %t.obj
-# RUN: FileCheck -check-prefix=CHECK2 %s < %t.def
+# RUN:   /def:%p/Inputs/exports2.def /lldmoduledeffile:%t2.def -- %t.obj
+# RUN: FileCheck -check-prefix=CHECK2 %s < %t2.def
 
 CHECK2: LIBRARY "exportlib2.test.tmp.dll"
 CHECK2: EXPORTS
 CHECK2:   exportfn1 @5
-CHECK2:   exportfn2 @6
-CHECK2:   exportfn3@256 @7
+CHECK2:   exportfn3@256 @6
+CHECK2:   exportfn7@8 @7