diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2016-06-29 22:27:42 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-06-29 22:27:42 +0000 |
commit | 8ec68fad33e4f5b9899f200b32a264df1a55be48 (patch) | |
tree | 7b8b55b7038cfad6543cc61a55f3c791f86fb44d /llvm/lib/LibDriver/LibDriver.cpp | |
parent | e1af3c635c545ed12e7253c0b866a84420a690ab (diff) | |
download | llvm-8ec68fad33e4f5b9899f200b32a264df1a55be48.zip llvm-8ec68fad33e4f5b9899f200b32a264df1a55be48.tar.gz llvm-8ec68fad33e4f5b9899f200b32a264df1a55be48.tar.bz2 |
Object: Replace NewArchiveIterator with a simpler NewArchiveMember class. NFCI.
The NewArchiveIterator class has a problem: it requires too much context. Any
memory buffers added to the archive must be stored within an Archive::Member,
which must have an associated Archive. This makes it harder than necessary
to create new archive members (or new archives entirely) from scratch using
memory buffers.
This patch replaces NewArchiveIterator with a NewArchiveMember class that
stores just the memory buffer and the information that goes into the archive
member header.
Differential Revision: http://reviews.llvm.org/D21721
llvm-svn: 274183
Diffstat (limited to 'llvm/lib/LibDriver/LibDriver.cpp')
-rw-r--r-- | llvm/lib/LibDriver/LibDriver.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/LibDriver/LibDriver.cpp b/llvm/lib/LibDriver/LibDriver.cpp index 671cc73..ea6d921 100644 --- a/llvm/lib/LibDriver/LibDriver.cpp +++ b/llvm/lib/LibDriver/LibDriver.cpp @@ -57,10 +57,10 @@ public: } static std::string getOutputPath(llvm::opt::InputArgList *Args, - const llvm::NewArchiveIterator &FirstMember) { + const llvm::NewArchiveMember &FirstMember) { if (auto *Arg = Args->getLastArg(OPT_out)) return Arg->getValue(); - SmallString<128> Val = FirstMember.getNew(); + SmallString<128> Val = StringRef(FirstMember.Buf->getBufferIdentifier()); llvm::sys::path::replace_extension(Val, ".lib"); return Val.str(); } @@ -128,14 +128,22 @@ int llvm::libDriverMain(llvm::ArrayRef<const char*> ArgsArr) { std::vector<StringRef> SearchPaths = getSearchPaths(&Args, Saver); - std::vector<llvm::NewArchiveIterator> Members; + std::vector<llvm::NewArchiveMember> Members; for (auto *Arg : Args.filtered(OPT_INPUT)) { Optional<std::string> Path = findInputFile(Arg->getValue(), SearchPaths); if (!Path.hasValue()) { llvm::errs() << Arg->getValue() << ": no such file or directory\n"; return 1; } - Members.emplace_back(Saver.save(*Path)); + Expected<NewArchiveMember> MOrErr = + NewArchiveMember::getFile(Saver.save(*Path), /*Deterministic=*/true); + if (!MOrErr) { + handleAllErrors(MOrErr.takeError(), [&](const llvm::ErrorInfoBase &EIB) { + llvm::errs() << Arg->getValue() << ": " << EIB.message() << "\n"; + }); + return 1; + } + Members.emplace_back(std::move(*MOrErr)); } std::pair<StringRef, std::error_code> Result = |