summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-ar/llvm-ar.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-10-21 23:18:51 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-10-21 23:18:51 +0000
commit915fbb35901d21fd2e8234e6274738e085c16925 (patch)
treea90bddb72b5d32c85be6287772a3e11f2854be69 /llvm/tools/llvm-ar/llvm-ar.cpp
parentf42a6ea5ac541ad2b5863a0d406683f5e43a8106 (diff)
downloadbcm5719-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.cpp21
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;
OpenPOWER on IntegriCloud