[lld] r205038 - [ELF] Support response file.
Reid Kleckner
rnk at google.com
Fri Mar 28 13:37:23 PDT 2014
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?
> + 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/89c720e5/attachment.html>
More information about the llvm-commits
mailing list