summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-06-18 20:27:09 +0000
committerRui Ueyama <ruiu@google.com>2015-06-18 20:27:09 +0000
commitb95188cb2c820ca6e124ec993b62176355d6f2af (patch)
tree79676a6f952d9ed0aca8633c6647a079ea59b4d5
parent98d7803291aaac19cd37805db35664454552943d (diff)
downloadbcm5719-llvm-b95188cb2c820ca6e124ec993b62176355d6f2af.tar.gz
bcm5719-llvm-b95188cb2c820ca6e124ec993b62176355d6f2af.zip
COFF: Add /implib option.
llvm-svn: 240045
-rw-r--r--lld/COFF/Config.h1
-rw-r--r--lld/COFF/Driver.cpp4
-rw-r--r--lld/COFF/DriverUtils.cpp10
-rw-r--r--lld/test/COFF/dll.test4
4 files changed, 16 insertions, 3 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index 46db6de33f6..5b8d414bc84 100644
--- a/lld/COFF/Config.h
+++ b/lld/COFF/Config.h
@@ -55,6 +55,7 @@ struct Configuration {
// True if we are creating a DLL.
bool DLL = false;
+ StringRef Implib;
std::vector<Export> Exports;
// Options for manifest files.
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index adf682675cf..83457285d5f 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -338,6 +338,10 @@ bool LinkerDriver::link(int Argc, const char *Argv[]) {
if (parseAlternateName(Arg->getValue()))
return false;
+ // Handle /implib
+ if (auto *Arg = Args->getLastArg(OPT_implib))
+ Config->Implib = Arg->getValue();
+
// Handle /opt
for (auto *Arg : Args->filtered(OPT_opt)) {
std::string S = StringRef(Arg->getValue()).lower();
diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp
index 05dd62fcd9b..e9fc3ed095c 100644
--- a/lld/COFF/DriverUtils.cpp
+++ b/lld/COFF/DriverUtils.cpp
@@ -507,14 +507,18 @@ std::error_code writeImportLibrary() {
std::string Contents = createModuleDefinitionFile();
std::string Def = writeToTempFile(Contents);
llvm::FileRemover TempFile(Def);
- SmallString<128> Out = StringRef(Config->OutputFile);
- sys::path::replace_extension(Out, ".lib");
Executor E("lib.exe");
E.add("/nologo");
E.add("/machine:x64");
E.add(Twine("/def:") + Def);
- E.add("/out:" + Out);
+ if (Config->Implib.empty()) {
+ SmallString<128> Out = StringRef(Config->OutputFile);
+ sys::path::replace_extension(Out, ".lib");
+ E.add("/out:" + Out);
+ } else {
+ E.add("/out:" + Config->Implib);
+ }
return E.run();
}
diff --git a/lld/test/COFF/dll.test b/lld/test/COFF/dll.test
index 70962a3c2bc..dcf3b58792b 100644
--- a/lld/test/COFF/dll.test
+++ b/lld/test/COFF/dll.test
@@ -28,6 +28,10 @@ EXPORT-LTO-NEXT: 3 0x1030 exportfn3
# RUN: lld -flavor link2 /out:%t2.exe %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 /export:exportfn1 /export:exportfn2
+# RUN: lld -flavor link2 /out:%t2.exe %t2.obj %t2.lib
+# RUN: llvm-readobj -coff-imports %t2.exe | FileCheck -check-prefix=IMPORT %s
+
# RUN: lld -flavor link2 /out:%t2.lto.exe %t2.obj %t.lto.lib
# RUN: llvm-readobj -coff-imports %t2.lto.exe | FileCheck -check-prefix=IMPORT %s
OpenPOWER on IntegriCloud