diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp index 643e3c65c3df..c29ddfa209c5 100644 --- a/lld/COFF/DriverUtils.cpp +++ b/lld/COFF/DriverUtils.cpp @@ -32,6 +32,8 @@ using namespace llvm::COFF; using namespace llvm; +using llvm::cl::ExpandResponseFiles; +using llvm::cl::TokenizeWindowsCommandLine; using llvm::sys::Process; namespace lld { @@ -216,26 +218,14 @@ std::vector ArgParser::tokenize(StringRef S) { return V; } -// Creates a new command line by replaceing options starting with '@' +// Creates a new command line by replacing options starting with '@' // character. '@' is replaced by the file's contents. ErrorOr> ArgParser::replaceResponseFiles(std::vector Argv) { - std::vector V; - for (const char *S : Argv) { - if (S[0] != '@') { - V.push_back(S); - continue; - } - StringRef Path = S + 1; - auto BufOrErr = MemoryBuffer::getFile(Path); - if (auto EC = BufOrErr.getError()) - return EC; - std::unique_ptr Buf = std::move(BufOrErr.get()); - StringRef Str = Alloc.save(Buf->getBuffer()); - std::vector Tokens = tokenize(Str); - V.insert(V.end(), Tokens.begin(), Tokens.end()); - } - return V; + SmallVector Tokens(&Argv[0], &Argv[0] + Argv.size()); + BumpPtrStringSaver Saver(&Alloc); + ExpandResponseFiles(Saver, TokenizeWindowsCommandLine, Tokens); + return std::vector(Tokens.begin(), Tokens.end()); } void printHelp(const char *Argv0) {