[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