diff options
Diffstat (limited to 'lld/COFF/Driver.cpp')
| -rw-r--r-- | lld/COFF/Driver.cpp | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index cdfefde52df..07b5f8bea06 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -422,6 +422,46 @@ static std::string getMapFile(const opt::InputArgList &Args) { return (OutFile.substr(0, OutFile.rfind('.')) + ".map").str(); } +static bool isBitcodeFile(StringRef Path) { + std::unique_ptr<MemoryBuffer> MB = check( + MemoryBuffer::getFile(Path, -1, false, true), "could not open " + Path); + StringRef Buf = MB->getBuffer(); + return sys::fs::identify_magic(Buf) == sys::fs::file_magic::bitcode; +} + +// Create response file contents and invoke the MSVC linker. +void LinkerDriver::invokeMSVC(opt::InputArgList &Args) { + std::string Rsp = "/nologo "; + + for (auto *Arg : Args) { + switch (Arg->getOption().getID()) { + case OPT_linkrepro: + case OPT_lldmap: + case OPT_lldmap_file: + case OPT_msvclto: + // LLD-specific options are stripped. + break; + case OPT_opt: + if (!StringRef(Arg->getValue()).startswith("lld")) + Rsp += toString(Arg) + " "; + break; + case OPT_INPUT: + // Bitcode files are stripped as they've been compiled to + // native object files. + if (Optional<StringRef> Path = doFindFile(Arg->getValue())) + if (isBitcodeFile(*Path)) + break; + Rsp += quote(Arg->getValue()) + " "; + break; + default: + Rsp += toString(Arg) + " "; + } + } + + std::vector<StringRef> ObjectFiles = Symtab.compileBitcodeFiles(); + runMSVCLinker(Rsp, ObjectFiles); +} + void LinkerDriver::enqueueTask(std::function<void()> Task) { TaskQueue.push_back(std::move(Task)); } @@ -820,8 +860,7 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) { // If /msvclto is given, we use the MSVC linker to link LTO output files. // This is useful because MSVC link.exe can generate complete PDBs. if (Args.hasArg(OPT_msvclto)) { - std::vector<StringRef> ObjectFiles = Symtab.compileBitcodeFiles(); - runMSVCLinker(Args, ObjectFiles); + invokeMSVC(Args); exit(0); } |

