diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-10-21 23:18:51 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-10-21 23:18:51 +0000 |
| commit | 915fbb35901d21fd2e8234e6274738e085c16925 (patch) | |
| tree | a90bddb72b5d32c85be6287772a3e11f2854be69 | |
| parent | f42a6ea5ac541ad2b5863a0d406683f5e43a8106 (diff) | |
| download | bcm5719-llvm-915fbb35901d21fd2e8234e6274738e085c16925.tar.gz bcm5719-llvm-915fbb35901d21fd2e8234e6274738e085c16925.zip | |
MRI scripts: Add addlib support.
llvm-svn: 220346
| -rw-r--r-- | llvm/test/Object/mri-addlib.test | 17 | ||||
| -rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 21 |
2 files changed, 37 insertions, 1 deletions
diff --git a/llvm/test/Object/mri-addlib.test b/llvm/test/Object/mri-addlib.test new file mode 100644 index 00000000000..5af09e36907 --- /dev/null +++ b/llvm/test/Object/mri-addlib.test @@ -0,0 +1,17 @@ +; RUN: echo create %t.a > %t.mri +; RUN: echo addlib %p/Inputs/GNU.a >> %t.mri +; RUN: echo addlib %p/Inputs/archive-test.a-gnu-minimal >> %t.mri +; RUN: echo save >> %t.mri +; RUN: echo end >> %t.mri + +; RUN: llvm-ar -M < %t.mri +; RUN: llvm-ar t %t.a | FileCheck %s + +; CHECK: evenlen +; CHECK-NEXT: oddlen +; CHECK-NEXT: very_long_bytecode_file_name.bc +; CHECK-NEXT: IsNAN.o +; CHECK-NEXT: test + +; line_iterator is incompatible to CRLF. +; REQUIRES: shell diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index aff8a04cce5..8411a1dad47 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -947,19 +947,22 @@ static int performOperation(ArchiveOperation Operation, } static void runMRIScript() { - enum class MRICommand { AddMod, Create, Save, End, Invalid }; + 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<NewArchiveIterator> NewMembers; + std::vector<std::unique_ptr<MemoryBuffer>> ArchiveBuffers; + std::vector<std::unique_ptr<object::Archive>> Archives; for (line_iterator I(Ref, /*SkipBlanks*/ true, ';'), E; I != E; ++I) { StringRef Line = *I; StringRef CommandStr, Rest; std::tie(CommandStr, Rest) = Line.split(' '); auto Command = StringSwitch<MRICommand>(CommandStr.lower()) + .Case("addlib", MRICommand::AddLib) .Case("addmod", MRICommand::AddMod) .Case("create", MRICommand::Create) .Case("save", MRICommand::Save) @@ -967,6 +970,22 @@ static void runMRIScript() { .Default(MRICommand::Invalid); switch (Command) { + case MRICommand::AddLib: { + auto BufOrErr = MemoryBuffer::getFile(Rest, -1, false); + failIfError(BufOrErr.getError(), "Could not open library"); + ArchiveBuffers.push_back(std::move(*BufOrErr)); + auto LibOrErr = + object::Archive::create(ArchiveBuffers.back()->getMemBufferRef()); + failIfError(LibOrErr.getError(), "Could not parse library"); + Archives.push_back(std::move(*LibOrErr)); + object::Archive &Lib = *Archives.back(); + for (auto &Member : Lib.children()) { + ErrorOr<StringRef> NameOrErr = Member.getName(); + failIfError(NameOrErr.getError()); + addMember(NewMembers, Member, *NameOrErr); + } + break; + } case MRICommand::AddMod: addMember(NewMembers, Rest, sys::path::filename(Rest)); break; |

