aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2019-02-09 17:33:04 +0000
committerNico Weber <nicolasweber@gmx.de>2019-02-09 17:33:04 +0000
commita2f60933e5c90bde4b383b2528ba1c142d920a01 (patch)
tree84650c503cdeee6065b9590a794664868b090b86 /llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
parent7467510453be40019a746aedfff85909776e7e4f (diff)
downloadllvm-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.cpp46
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.