From eeb22f825172246c8ff7fc38980b7b0a93d45400 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 25 Sep 2015 15:37:33 +0000 Subject: [PATCH] ELF2: Support reponse files. http://reviews.llvm.org/D13148 llvm-svn: 248575 --- lld/ELF/Driver.h | 3 +++ lld/ELF/DriverUtils.cpp | 10 +++++++++- lld/test/elf2/basic.s | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h index 1cc05302038a..8e243d9ac0b3 100644 --- a/lld/ELF/Driver.h +++ b/lld/ELF/Driver.h @@ -28,6 +28,9 @@ class ArgParser { public: // Parses command line options. llvm::opt::InputArgList parse(ArrayRef Args); + +private: + llvm::BumpPtrAllocator Alloc; }; class LinkerDriver { diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index 8d7ef5e73cfe..704d7c9ec124 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -16,6 +16,8 @@ #include "Driver.h" #include "Error.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/StringSaver.h" using namespace llvm; @@ -53,7 +55,13 @@ opt::InputArgList ArgParser::parse(ArrayRef Argv) { unsigned MissingIndex; unsigned MissingCount; - opt::InputArgList Args = Table.ParseArgs(Argv, MissingIndex, MissingCount); + // Expand response files. '@' is replaced by the file's contents. + SmallVector Vec(Argv.data(), Argv.data() + Argv.size()); + StringSaver Saver(Alloc); + llvm::cl::ExpandResponseFiles(Saver, llvm::cl::TokenizeGNUCommandLine, Vec); + + // Parse options and then do error checking. + opt::InputArgList Args = Table.ParseArgs(Vec, MissingIndex, MissingCount); if (MissingCount) error(Twine("missing arg value for \"") + Args.getArgString(MissingIndex) + "\", expected " + Twine(MissingCount) + diff --git a/lld/test/elf2/basic.s b/lld/test/elf2/basic.s index 15e7e2fcd26d..55bc61b14b72 100644 --- a/lld/test/elf2/basic.s +++ b/lld/test/elf2/basic.s @@ -176,6 +176,11 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: ] +# RUN: echo " -o %t2" > %t.responsefile +# RUN: lld -flavor gnu2 %t @%t.responsefile +# RUN: llvm-readobj -file-headers -sections -program-headers -symbols %t2 \ +# RUN: | FileCheck %s + # RUN: not lld -flavor gnu2 %t 2>&1 | FileCheck --check-prefix=NO_O %s # NO_O: -o must be specified.