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 /llvm/tools/llvm-ar/llvm-ar.cpp | |
parent | f42a6ea5ac541ad2b5863a0d406683f5e43a8106 (diff) | |
download | bcm5719-llvm-915fbb35901d21fd2e8234e6274738e085c16925.tar.gz bcm5719-llvm-915fbb35901d21fd2e8234e6274738e085c16925.zip |
MRI scripts: Add addlib support.
llvm-svn: 220346
Diffstat (limited to 'llvm/tools/llvm-ar/llvm-ar.cpp')
-rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
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; |