[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