[PATCH] D43986: Allow MRI scripts as file input on cmd line
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 2 09:31:58 PST 2018
This is an extension over gnu ar, no? What is the justification for it?
Cheers,
Rafael
Dmitry Mikulin via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:
> dmikulin created this revision.
> dmikulin added a reviewer: Bigcheese.
>
> With -M option llvm-ar expects input from stdin. Change it to optionally take file name for an MRI script as input to -M.
>
>
> https://reviews.llvm.org/D43986
>
> Files:
> llvm/test/Object/mri5.test
> llvm/test/tools/llvm-ar/mri.test
> llvm/tools/llvm-ar/llvm-ar.cpp
>
>
> Index: llvm/tools/llvm-ar/llvm-ar.cpp
> ===================================================================
> --- llvm/tools/llvm-ar/llvm-ar.cpp
> +++ llvm/tools/llvm-ar/llvm-ar.cpp
> @@ -193,16 +193,28 @@
> Members.push_back(Arg);
> }
>
> -static void runMRIScript();
> +static void runMRIScript(const MemoryBuffer &Ref);
>
> // Parse the command line options as presented and return the operation
> // specified. Process all modifiers and check to make sure that constraints on
> // modifier/operation pairs have not been violated.
> static ArchiveOperation parseCommandLine() {
> if (MRI) {
> - if (!RestOfArgs.empty())
> - fail("Cannot mix -M and other options");
> - runMRIScript();
> + std::string MRIScriptName;
> + if (!RestOfArgs.empty()) {
> + MRIScriptName = RestOfArgs[0];
> + RestOfArgs.erase(RestOfArgs.begin());
> +
> + if (!RestOfArgs.empty())
> + fail("Cannot mix -M and other options");
> + }
> +
> + ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr = MRIScriptName.empty() ?
> + MemoryBuffer::getSTDIN() : MemoryBuffer::getFile(MRIScriptName);
> +
> + if (!MemBufOrErr)
> + fail("Cannot read MRI script '" + MRIScriptName + "'");
> + runMRIScript(*MemBufOrErr.get());
> }
>
> getOptions();
> @@ -757,12 +769,9 @@
> return 0;
> }
>
> -static void runMRIScript() {
> +static void runMRIScript(const MemoryBuffer &Ref) {
> enum class MRICommand { AddLib, AddMod, Create, Save, End, Invalid };
>
> - ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getSTDIN();
> - failIfError(Buf.getError());
> - const MemoryBuffer &Ref = *Buf.get();
> bool Saved = false;
> std::vector<NewArchiveMember> NewMembers;
> std::vector<std::unique_ptr<MemoryBuffer>> ArchiveBuffers;
> Index: llvm/test/tools/llvm-ar/mri.test
> ===================================================================
> --- /dev/null
> +++ llvm/test/tools/llvm-ar/mri.test
> @@ -0,0 +1,16 @@
> +RUN: yaml2obj %S/Inputs/elf.yaml -o %t.o
> +RUN: rm -f %t.ar
> +
> +RUN: echo "create %t.ar" > %t.mri
> +RUN: echo "addmod %t.o" >> %t.mri
> +RUN: echo "save" >> %t.mri
> +RUN: echo "end" >> %t.mri
> +
> +RUN: llvm-ar -M < %t.mri
> +RUN: llvm-ar tv %t.ar | FileCheck %s
> +
> +RUN: rm -f %t.ar
> +RUN: llvm-ar -M %t.mri
> +RUN: llvm-ar tv %t.ar | FileCheck %s
> +
> +CHECK: mri.test{{.*}}.o
> Index: llvm/test/Object/mri5.test
> ===================================================================
> --- llvm/test/Object/mri5.test
> +++ llvm/test/Object/mri5.test
> @@ -1,2 +1,4 @@
> -; RUN: not llvm-ar -M t < %s 2>&1 | FileCheck %s
> +; RUN: not llvm-ar -M t x 2>&1 | FileCheck %s
> +; RUN: not llvm-ar -M t < %s 2>&1 | FileCheck %s --check-prefix CHECK-FILE
> ; CHECK: Cannot mix -M and other options.
> +; CHECK-FILE: Cannot read MRI script 't'
>
>
> Index: llvm/tools/llvm-ar/llvm-ar.cpp
> ===================================================================
> --- llvm/tools/llvm-ar/llvm-ar.cpp
> +++ llvm/tools/llvm-ar/llvm-ar.cpp
> @@ -193,16 +193,28 @@
> Members.push_back(Arg);
> }
>
> -static void runMRIScript();
> +static void runMRIScript(const MemoryBuffer &Ref);
>
> // Parse the command line options as presented and return the operation
> // specified. Process all modifiers and check to make sure that constraints on
> // modifier/operation pairs have not been violated.
> static ArchiveOperation parseCommandLine() {
> if (MRI) {
> - if (!RestOfArgs.empty())
> - fail("Cannot mix -M and other options");
> - runMRIScript();
> + std::string MRIScriptName;
> + if (!RestOfArgs.empty()) {
> + MRIScriptName = RestOfArgs[0];
> + RestOfArgs.erase(RestOfArgs.begin());
> +
> + if (!RestOfArgs.empty())
> + fail("Cannot mix -M and other options");
> + }
> +
> + ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr = MRIScriptName.empty() ?
> + MemoryBuffer::getSTDIN() : MemoryBuffer::getFile(MRIScriptName);
> +
> + if (!MemBufOrErr)
> + fail("Cannot read MRI script '" + MRIScriptName + "'");
> + runMRIScript(*MemBufOrErr.get());
> }
>
> getOptions();
> @@ -757,12 +769,9 @@
> return 0;
> }
>
> -static void runMRIScript() {
> +static void runMRIScript(const MemoryBuffer &Ref) {
> enum class MRICommand { AddLib, AddMod, Create, Save, End, Invalid };
>
> - ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getSTDIN();
> - failIfError(Buf.getError());
> - const MemoryBuffer &Ref = *Buf.get();
> bool Saved = false;
> std::vector<NewArchiveMember> NewMembers;
> std::vector<std::unique_ptr<MemoryBuffer>> ArchiveBuffers;
> Index: llvm/test/tools/llvm-ar/mri.test
> ===================================================================
> --- /dev/null
> +++ llvm/test/tools/llvm-ar/mri.test
> @@ -0,0 +1,16 @@
> +RUN: yaml2obj %S/Inputs/elf.yaml -o %t.o
> +RUN: rm -f %t.ar
> +
> +RUN: echo "create %t.ar" > %t.mri
> +RUN: echo "addmod %t.o" >> %t.mri
> +RUN: echo "save" >> %t.mri
> +RUN: echo "end" >> %t.mri
> +
> +RUN: llvm-ar -M < %t.mri
> +RUN: llvm-ar tv %t.ar | FileCheck %s
> +
> +RUN: rm -f %t.ar
> +RUN: llvm-ar -M %t.mri
> +RUN: llvm-ar tv %t.ar | FileCheck %s
> +
> +CHECK: mri.test{{.*}}.o
> Index: llvm/test/Object/mri5.test
> ===================================================================
> --- llvm/test/Object/mri5.test
> +++ llvm/test/Object/mri5.test
> @@ -1,2 +1,4 @@
> -; RUN: not llvm-ar -M t < %s 2>&1 | FileCheck %s
> +; RUN: not llvm-ar -M t x 2>&1 | FileCheck %s
> +; RUN: not llvm-ar -M t < %s 2>&1 | FileCheck %s --check-prefix CHECK-FILE
> ; CHECK: Cannot mix -M and other options.
> +; CHECK-FILE: Cannot read MRI script 't'
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list