[lld] r205038 - [ELF] Support response file.

Rui Ueyama ruiu at google.com
Fri Mar 28 13:51:11 PDT 2014


On Fri, Mar 28, 2014 at 1:37 PM, Reid Kleckner <rnk at google.com> wrote:

> On Fri, Mar 28, 2014 at 12:34 PM, Rui Ueyama <ruiu at google.com> wrote:
>
>> Author: ruiu
>> Date: Fri Mar 28 14:34:34 2014
>> New Revision: 205038
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=205038&view=rev
>> Log:
>> [ELF] Support response file.
>>
>> Response file is a command line argument in the form of @file. The GNU-
>> compatible driver expands the file contents, replacing @file argument.
>>
>> Differential Revision: http://llvm-reviews.chandlerc.com/D3210
>>
>> Added:
>>     lld/trunk/test/elf/Inputs/responsefile
>>     lld/trunk/test/elf/responsefile.test
>> Modified:
>>     lld/trunk/lib/Driver/GnuLdDriver.cpp
>>
>> Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=205038&r1=205037&r2=205038&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
>> +++ lld/trunk/lib/Driver/GnuLdDriver.cpp Fri Mar 28 14:34:34 2014
>> @@ -32,8 +32,13 @@
>>  #include "llvm/Support/raw_ostream.h"
>>  #include "llvm/Support/Signals.h"
>>
>> +#include <cstring>
>> +#include <tuple>
>> +
>>  using namespace lld;
>>
>> +using llvm::BumpPtrAllocator;
>> +
>>  namespace {
>>
>>  // Create enum with OPT_xxx values for each option in GnuLdOptions.td
>> @@ -68,8 +73,49 @@ public:
>>    GnuLdOptTable() : OptTable(infoTable,
>> llvm::array_lengthof(infoTable)){}
>>  };
>>
>> +class DriverStringSaver : public llvm::cl::StringSaver {
>> +public:
>> +  DriverStringSaver(BumpPtrAllocator &alloc) : _alloc(alloc) {}
>> +
>> +  const char *SaveString(const char *s) override {
>> +    char *p = _alloc.Allocate<char>(strlen(s) + 1);
>> +    strcpy(p, s);
>> +    return p;
>> +  }
>> +
>> +private:
>> +  BumpPtrAllocator &_alloc;
>> +};
>> +
>>  } // anonymous namespace
>>
>> +// If a command line option starts with "@", the driver reads its suffix
>> as a
>> +// file, parse its contents as a list of command line options, and
>> insert them
>> +// at the original @file position. If file cannot be read, @file is not
>> expanded
>> +// and left unmodified. @file can appear in a response file, so it's a
>> recursive
>> +// process.
>> +static std::tuple<int, const char **>
>> +maybeExpandResponseFiles(int argc, const char **argv, BumpPtrAllocator
>> &alloc) {
>> +  // Expand response files.
>> +  SmallVector<const char *, 256> smallvec;
>> +  for (int i = 0; i < argc; ++i)
>> +    smallvec.push_back(argv[i]);
>> +  DriverStringSaver saver(alloc);
>> +  llvm::cl::ExpandResponseFiles(saver, llvm::cl::TokenizeGNUCommandLine,
>> smallvec);
>> +
>> +  // Pack the results to a C-array.
>> +  argc = smallvec.size();
>> +  std::vector<const char *> result;
>> +  for (size_t i = 0, e = smallvec.size(); i < e; ++i)
>> +    result.push_back(smallvec[i]);
>> +  result.push_back(nullptr);  // terminate ARGV with NULL
>>
>
> Why do you need an intermediate std::vector here?  It looks unused.
>
>
>> +
>> +  // Allocate memory for the result and return it.
>> +  const char **copy = alloc.Allocate<const char *>(argc + 1);
>> +  std::copy(smallvec.begin(), smallvec.end(), copy);
>>
>
> Do you need to append a null pointer to this?
>

These are issues indeed. Will address in a followup patch.


> +  return std::make_tuple(argc, copy);
>> +}
>> +
>>  // Get the Input file magic for creating appropriate InputGraph nodes.
>>  static error_code getFileMagic(ELFLinkingContext &ctx, StringRef path,
>>                                 llvm::sys::fs::file_magic &magic) {
>> @@ -118,6 +164,8 @@ std::string ELFFileNode::errStr(error_co
>>
>>  bool GnuLdDriver::linkELF(int argc, const char *argv[],
>>                            raw_ostream &diagnostics) {
>> +  BumpPtrAllocator alloc;
>> +  std::tie(argc, argv) = maybeExpandResponseFiles(argc, argv, alloc);
>>    std::unique_ptr<ELFLinkingContext> options;
>>    if (!parse(argc, argv, options, diagnostics))
>>      return false;
>> @@ -133,7 +181,6 @@ bool GnuLdDriver::linkELF(int argc, cons
>>    if (options->allowLinkWithDynamicLibraries())
>>      options->registry().addSupportELFDynamicSharedObjects(
>>          options->useShlibUndefines(), options->targetHandler());
>> -
>>    return link(*options, diagnostics);
>>  }
>>
>>
>> Added: lld/trunk/test/elf/Inputs/responsefile
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Inputs/responsefile?rev=205038&view=auto
>>
>> ==============================================================================
>> --- lld/trunk/test/elf/Inputs/responsefile (added)
>> +++ lld/trunk/test/elf/Inputs/responsefile Fri Mar 28 14:34:34 2014
>> @@ -0,0 +1 @@
>> +--inresponsefile
>>
>> Added: lld/trunk/test/elf/responsefile.test
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/responsefile.test?rev=205038&view=auto
>>
>> ==============================================================================
>> --- lld/trunk/test/elf/responsefile.test (added)
>> +++ lld/trunk/test/elf/responsefile.test Fri Mar 28 14:34:34 2014
>> @@ -0,0 +1,6 @@
>> +# RUN: not lld -flavor gnu --abc @%p/Inputs/responsefile --baz >& %t.log
>> +# RUN: FileCheck %s < %t.log
>> +
>> +CHECK: warning: ignoring unknown argument: --abc
>> +CHECK: warning: ignoring unknown argument: --inresponsefile
>> +CHECK: warning: ignoring unknown argument: --baz
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140328/ab0fbec9/attachment.html>


More information about the llvm-commits mailing list