diff options
author | Nico Weber <nicolasweber@gmx.de> | 2019-02-09 17:33:04 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2019-02-09 17:33:04 +0000 |
commit | a2f60933e5c90bde4b383b2528ba1c142d920a01 (patch) | |
tree | 84650c503cdeee6065b9590a794664868b090b86 /llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | |
parent | 7467510453be40019a746aedfff85909776e7e4f (diff) | |
download | llvm-a2f60933e5c90bde4b383b2528ba1c142d920a01.zip llvm-a2f60933e5c90bde4b383b2528ba1c142d920a01.tar.gz llvm-a2f60933e5c90bde4b383b2528ba1c142d920a01.tar.bz2 |
llvm-lib: Implement /list flag
Differential Revision: https://reviews.llvm.org/D57952
llvm-svn: 353620
Diffstat (limited to 'llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp')
-rw-r--r-- | llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 4fe69e8..3a5b972 100644 --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -96,6 +96,47 @@ static std::string findInputFile(StringRef File, ArrayRef<StringRef> Paths) { return ""; } +static void fatalOpenError(llvm::Error E, Twine File) { + if (!E) + return; + handleAllErrors(std::move(E), [&](const llvm::ErrorInfoBase &EIB) { + llvm::errs() << "error opening '" << File << "': " << EIB.message() << '\n'; + exit(1); + }); +} + +static void doList(opt::InputArgList& Args) { + // lib.exe prints the contents of the first archive file. + std::unique_ptr<MemoryBuffer> B; + for (auto *Arg : Args.filtered(OPT_INPUT)) { + // Create or open the archive object. + ErrorOr<std::unique_ptr<MemoryBuffer>> MaybeBuf = + MemoryBuffer::getFile(Arg->getValue(), -1, false); + fatalOpenError(errorCodeToError(MaybeBuf.getError()), Arg->getValue()); + + if (identify_magic(MaybeBuf.get()->getBuffer()) == file_magic::archive) { + B = std::move(MaybeBuf.get()); + break; + } + } + + // lib.exe doesn't print an error if no .lib files are passed. + if (!B) + return; + + Error Err = Error::success(); + object::Archive Archive(B.get()->getMemBufferRef(), Err); + fatalOpenError(std::move(Err), B->getBufferIdentifier()); + + for (auto &C : Archive.children(Err)) { + Expected<StringRef> NameOrErr = C.getName(); + fatalOpenError(NameOrErr.takeError(), B->getBufferIdentifier()); + StringRef Name = NameOrErr.get(); + llvm::outs() << Name << '\n'; + } + fatalOpenError(std::move(Err), B->getBufferIdentifier()); +} + int llvm::libDriverMain(ArrayRef<const char *> ArgsArr) { BumpPtrAllocator Alloc; StringSaver Saver(Alloc); @@ -130,6 +171,11 @@ int llvm::libDriverMain(ArrayRef<const char *> ArgsArr) { if (!Args.hasArgNoClaim(OPT_INPUT)) return 0; + if (Args.hasArg(OPT_lst)) { + doList(Args); + return 0; + } + std::vector<StringRef> SearchPaths = getSearchPaths(&Args, Saver); // Create a NewArchiveMember for each input file. |