[lld] r308407 - COFF: improve link conformance for import names

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 18 19:01:27 PDT 2017


Author: compnerd
Date: Tue Jul 18 19:01:27 2017
New Revision: 308407

URL: http://llvm.org/viewvc/llvm-project?rev=308407&view=rev
Log:
COFF: improve link conformance for import names

Improve the link conformance for the import name embedded into the
import library.  This requires the associated change to the LLVM portion
for the DEF file parser.  The import file generation embeds a different
name based on whether the driver is invoked as "link" or "lib".
Furthermore, the LIBRARY keyword in the DEF file influences the import
name.  The behaviour can be summarised according to the following table:

      | LIBRARY w/ ext |   LIBRARY w/o ext   | no LIBRARY
 -----+----------------+---------------------+------------------
 LINK | {value}        | {value}.{.dll/.exe} | {output name}
  LIB | {value}        | {value}.dll         | {output name}.dll

Added:
    lld/trunk/test/COFF/Inputs/default.def
    lld/trunk/test/COFF/Inputs/named.def
    lld/trunk/test/COFF/Inputs/object.s
    lld/trunk/test/COFF/implib-name.test
Modified:
    lld/trunk/COFF/Config.h
    lld/trunk/COFF/Driver.cpp

Modified: lld/trunk/COFF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=308407&r1=308406&r2=308407&view=diff
==============================================================================
--- lld/trunk/COFF/Config.h (original)
+++ lld/trunk/COFF/Config.h Tue Jul 18 19:01:27 2017
@@ -82,6 +82,7 @@ struct Configuration {
   SymbolBody *Entry = nullptr;
   bool NoEntry = false;
   std::string OutputFile;
+  std::string ImportName;
   bool ColorDiagnostics;
   bool DoGC = true;
   bool DoICF = true;

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=308407&r1=308406&r2=308407&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Tue Jul 18 19:01:27 2017
@@ -429,7 +429,32 @@ static std::string getImplibPath() {
   return Out.str();
 }
 
-static void createImportLibrary() {
+//
+// The import name is caculated as the following:
+//
+//        | LIBRARY w/ ext |   LIBRARY w/o ext   | no LIBRARY
+//   -----+----------------+---------------------+------------------
+//   LINK | {value}        | {value}.{.dll/.exe} | {output name}
+//    LIB | {value}        | {value}.dll         | {output name}.dll
+//
+static std::string getImportName(bool AsLib) {
+  SmallString<128> Out;
+
+  if (Config->ImportName.empty()) {
+    Out.assign(sys::path::filename(Config->OutputFile));
+    if (AsLib)
+      sys::path::replace_extension(Out, ".dll");
+  } else {
+    Out.assign(Config->ImportName);
+    if (!sys::path::has_extension(Out))
+      sys::path::replace_extension(Out,
+                                   (Config->DLL || AsLib) ? ".dll" : ".exe");
+  }
+
+  return Out.str();
+}
+
+static void createImportLibrary(bool AsLib) {
   std::vector<COFFShortExport> Exports;
   for (Export &E1 : Config->Exports) {
     COFFShortExport E2;
@@ -444,9 +469,8 @@ static void createImportLibrary() {
     Exports.push_back(E2);
   }
 
-  std::string DLLName = sys::path::filename(Config->OutputFile);
-  std::string Path = getImplibPath();
-  writeImportLibrary(DLLName, Path, Exports, Config->Machine);
+  writeImportLibrary(getImportName(AsLib), getImplibPath(), Exports,
+                     Config->Machine);
 }
 
 static void parseModuleDefs(StringRef Path) {
@@ -457,6 +481,7 @@ static void parseModuleDefs(StringRef Pa
 
   if (Config->OutputFile.empty())
     Config->OutputFile = Saver.save(M.OutputFile);
+  Config->ImportName = Saver.save(M.ImportName);
   if (M.ImageBase)
     Config->ImageBase = M.ImageBase;
   if (M.StackReserve)
@@ -992,7 +1017,7 @@ void LinkerDriver::link(ArrayRef<const c
   // Handle generation of import library from a def file.
   if (!Args.hasArgNoClaim(OPT_INPUT)) {
     fixupExports();
-    createImportLibrary();
+    createImportLibrary(/*AsLib=*/true);
     exit(0);
   }
 
@@ -1117,7 +1142,7 @@ void LinkerDriver::link(ArrayRef<const c
   // need to create a .lib file.
   if (!Config->Exports.empty() || Config->DLL) {
     fixupExports();
-    createImportLibrary();
+    createImportLibrary(/*AsLib=*/false);
     assignExportOrdinals();
   }
 

Added: lld/trunk/test/COFF/Inputs/default.def
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/default.def?rev=308407&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/default.def (added)
+++ lld/trunk/test/COFF/Inputs/default.def Tue Jul 18 19:01:27 2017
@@ -0,0 +1,2 @@
+EXPORTS
+  f

Added: lld/trunk/test/COFF/Inputs/named.def
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/named.def?rev=308407&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/named.def (added)
+++ lld/trunk/test/COFF/Inputs/named.def Tue Jul 18 19:01:27 2017
@@ -0,0 +1,3 @@
+LIBRARY library
+EXPORTS
+  f

Added: lld/trunk/test/COFF/Inputs/object.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/object.s?rev=308407&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/object.s (added)
+++ lld/trunk/test/COFF/Inputs/object.s Tue Jul 18 19:01:27 2017
@@ -0,0 +1,13 @@
+
+	.text
+
+	.def f
+		.scl 2
+		.type 32
+	.endef
+	.global f
+f:
+	retq $0
+
+	.section .drectve,"rd"
+	.ascii " /EXPORT:f"

Added: lld/trunk/test/COFF/implib-name.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/implib-name.test?rev=308407&view=auto
==============================================================================
--- lld/trunk/test/COFF/implib-name.test (added)
+++ lld/trunk/test/COFF/implib-name.test Tue Jul 18 19:01:27 2017
@@ -0,0 +1,71 @@
+# RUN: mkdir -p %T
+# RUN: llvm-mc -triple x86_64-unknown-windows-msvc -filetype obj -o %T/object.obj %S/Inputs/object.s
+
+# RUN: lld-link /dll /machine:x64 /def:%S/Inputs/named.def /out:%T/library.dll %T/object.obj /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/library.lib | FileCheck %s -check-prefix CHECK-DEFAULT-DLL-EXT
+
+# RUN: lld-link /machine:x64 /def:%S/Inputs/named.def /out:%T/library.lib
+# RUN: llvm-ar t %T/library.lib | FileCheck %s -check-prefix CHECK-DEFAULT-DLL-EXT
+
+CHECK-DEFAULT-DLL-EXT: library.dll
+CHECK-DEFAULT-DLL-EXT: library.dll
+CHECK-DEFAULT-DLL-EXT: library.dll
+CHECK-DEFAULT-DLL-EXT: library.dll
+
+# RUN: lld-link /machine:x64 /def:%S/Inputs/named.def /out:%T/library.exe %T/object.obj /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/library.lib | FileCheck %s -check-prefix CHECK-DEFAULT-EXE-EXT
+
+CHECK-DEFAULT-EXE-EXT: library.exe
+CHECK-DEFAULT-EXE-EXT: library.exe
+CHECK-DEFAULT-EXE-EXT: library.exe
+CHECK-DEFAULT-EXE-EXT: library.exe
+
+# RUN: lld-link /dll /machine:x64 /def:%S/Inputs/extension.def /out:%T/extension.dll /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/extension.lib | FileCheck %s -check-prefix CHECK-EXTENSION
+
+# RUN: lld-link /machine:x64 /def:%S/Inputs/extension.def /out:%T/extension.exe /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/extension.lib | FileCheck %s -check-prefix CHECK-EXTENSION
+
+# RUN: lld-link /machine:x64 /def:%S/Inputs/extension.def /out:%T/extension.lib
+# RUN: llvm-ar t %T/extension.lib | FileCheck %s -check-prefix CHECK-EXTENSION
+
+CHECK-EXTENSION: library.ext
+CHECK-EXTENSION: library.ext
+CHECK-EXTENSION: library.ext
+CHECK-EXTENSION: library.ext
+
+# RUN: lld-link /dll /machine:x64 /def:%S/Inputs/default.def /out:%T/default.dll /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-OUTPUT-NAME-DLL
+
+# RUN: lld-link /machine:x64 /def:%S/Inputs/default.def /out:%T/default.lib
+# RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-OUTPUT-NAME-DLL
+
+CHECK-OUTPUT-NAME-DLL: default.dll
+CHECK-OUTPUT-NAME-DLL: default.dll
+CHECK-OUTPUT-NAME-DLL: default.dll
+CHECK-OUTPUT-NAME-DLL: default.dll
+
+# RUN: lld-link /machine:x64 /def:%S/Inputs/default.def /out:%T/default.exe %T/object.obj /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-OUTPUT-NAME-EXE
+
+CHECK-OUTPUT-NAME-EXE: default.exe
+CHECK-OUTPUT-NAME-EXE: default.exe
+CHECK-OUTPUT-NAME-EXE: default.exe
+CHECK-OUTPUT-NAME-EXE: default.exe
+
+# RUN: lld-link /machine:x64 /out:%T/default.exe %T/object.obj /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-NODEF-EXE
+
+CHECK-NODEF-EXE: default.exe
+CHECK-NODEF-EXE: default.exe
+CHECK-NODEF-EXE: default.exe
+CHECK-NODEF-EXE: default.exe
+
+# RUN: lld-link /machine:x64 /dll /out:%T/default.dll %T/object.obj /entry:f /subsystem:CONSOLE
+# RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-NODEF-DLL
+
+CHECK-NODEF-DLL: default.dll
+CHECK-NODEF-DLL: default.dll
+CHECK-NODEF-DLL: default.dll
+CHECK-NODEF-DLL: default.dll
+




More information about the llvm-commits mailing list