From fe08b5f6b20ef3de930cd5283f0b7051de2c896e Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 8 Jul 2015 19:00:46 +0000 Subject: [PATCH] LibDriver: Fix output path inference. The inferred output file name is based on the first input file, not the first one with extension .obj. The output file was also being written to the wrong directory; it needs to be written to whichever directory on the libpath it was found in. This change fixes both issues. llvm-svn: 241710 --- lib/LibDriver/LibDriver.cpp | 18 +++++++----------- test/LibDriver/infer-output-path.test | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 test/LibDriver/infer-output-path.test diff --git a/lib/LibDriver/LibDriver.cpp b/lib/LibDriver/LibDriver.cpp index cb3278c716e..bc3ed46040c 100644 --- a/lib/LibDriver/LibDriver.cpp +++ b/lib/LibDriver/LibDriver.cpp @@ -56,17 +56,13 @@ public: } -static std::string getOutputPath(llvm::opt::InputArgList *Args) { +static std::string getOutputPath(llvm::opt::InputArgList *Args, + const llvm::NewArchiveIterator &FirstMember) { if (auto *Arg = Args->getLastArg(OPT_out)) return Arg->getValue(); - for (auto *Arg : Args->filtered(OPT_INPUT)) { - if (!StringRef(Arg->getValue()).endswith_lower(".obj")) - continue; - SmallString<128> Val = StringRef(Arg->getValue()); - llvm::sys::path::replace_extension(Val, ".lib"); - return Val.str(); - } - llvm_unreachable("internal error"); + SmallString<128> Val = FirstMember.getNew(); + llvm::sys::path::replace_extension(Val, ".lib"); + return Val.str(); } static std::vector getSearchPaths(llvm::opt::InputArgList *Args, @@ -143,8 +139,8 @@ int llvm::libDriverMain(llvm::ArrayRef ArgsArr) { llvm::sys::path::filename(Arg->getValue())); } - std::pair Result = - llvm::writeArchive(getOutputPath(&Args), Members, /*WriteSymtab=*/true); + std::pair Result = llvm::writeArchive( + getOutputPath(&Args, Members[0]), Members, /*WriteSymtab=*/true); if (Result.second) { if (Result.first.empty()) Result.first = ArgsArr[0]; diff --git a/test/LibDriver/infer-output-path.test b/test/LibDriver/infer-output-path.test new file mode 100644 index 00000000000..7a1bbcbbd18 --- /dev/null +++ b/test/LibDriver/infer-output-path.test @@ -0,0 +1,15 @@ +RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/a.obj %S/Inputs/a.s +RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/b.o %S/Inputs/b.s +RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/c %S/Inputs/b.s + +RUN: rm -f %T/a.lib +RUN: llvm-lib %T/a.obj +RUN: test -e %T/a.lib + +RUN: rm -f %T/b.lib +RUN: llvm-lib /libpath:%T b.o +RUN: test -e %T/b.lib + +RUN: rm -f %T/c.lib +RUN: llvm-lib /libpath:%T c +RUN: test -e %T/c.lib