From b4ba74c4c47b359f044515563acc663631e5dc31 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 12 Nov 2016 18:37:04 +0000 Subject: [PATCH] llvm-strings: trivialise logic until we support more options Until we have handling for ignoring unloaded sections, simplify the logic to the point of triviality. This fixes the scanning of archives, particularly when embedded in archives. llvm-svn: 286727 --- test/tools/llvm-strings/nested-archives.test | 13 ++++ tools/llvm-strings/llvm-strings.cpp | 76 +++----------------- 2 files changed, 23 insertions(+), 66 deletions(-) create mode 100644 test/tools/llvm-strings/nested-archives.test diff --git a/test/tools/llvm-strings/nested-archives.test b/test/tools/llvm-strings/nested-archives.test new file mode 100644 index 00000000000..c3a95f2fd60 --- /dev/null +++ b/test/tools/llvm-strings/nested-archives.test @@ -0,0 +1,13 @@ +RUN: echo -n abcd > %T/abcd +RUN: rm -f %T/inner.ar +RUN: llvm-ar crs %T/inner.a %T/abcd +RUN: rm -f %T/outer.ar +RUN: llvm-ar crs %T/outer.a %T/inner.a +RUN: llvm-strings %T/outer.a | FileCheck %s + +CHECK: ! +CHECK: inner.a/ 0 0 0 644 72 ` +CHECK: ! +CHECK: abcd/ 0 0 0 644 4 ` +CHECK: abcd + diff --git a/tools/llvm-strings/llvm-strings.cpp b/tools/llvm-strings/llvm-strings.cpp index dbabf08a52f..6e5e2f298c3 100644 --- a/tools/llvm-strings/llvm-strings.cpp +++ b/tools/llvm-strings/llvm-strings.cpp @@ -12,10 +12,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/IR/LLVMContext.h" -#include "llvm/Object/Archive.h" #include "llvm/Object/Binary.h" -#include "llvm/Object/ObjectFile.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Error.h" #include "llvm/Support/MemoryBuffer.h" @@ -32,7 +29,7 @@ static cl::list InputFileNames(cl::Positional, cl::desc(""), cl::ZeroOrMore); -static void dump(raw_ostream &OS, StringRef Contents) { +static void strings(raw_ostream &OS, StringRef Contents) { const char *P = nullptr, *E = nullptr, *S = nullptr; for (P = Contents.begin(), E = Contents.end(); P < E; ++P) { if (std::isgraph(*P) || std::isblank(*P)) { @@ -48,64 +45,6 @@ static void dump(raw_ostream &OS, StringRef Contents) { OS << StringRef(S, E - S) << '\n'; } -namespace { -class Strings { - LLVMContext Context; - raw_ostream &OS; - - void dump(const ObjectFile *O) { - for (const auto &S : O->sections()) { - StringRef Contents; - if (!S.getContents(Contents)) - ::dump(OS, Contents); - } - } - - void dump(const Archive *A) { - Error E = Error::success(); - for (auto &Element : A->children(E)) { - if (Expected> Child = - Element.getAsBinary(&Context)) { - dump(dyn_cast(&**Child)); - } else { - if (auto E = isNotObjectErrorInvalidFileType(Child.takeError())) { - errs() << A->getFileName(); - if (Expected Name = Element.getName()) - errs() << '(' << *Name << ')'; - logAllUnhandledErrors(std::move(E), errs(), ""); - errs() << '\n'; - } - } - } - (void)static_cast(E); - } - -public: - Strings(raw_ostream &S) : OS(S) {} - - void scan(StringRef File) { - ErrorOr> Buffer = - MemoryBuffer::getFileOrSTDIN(File); - if (std::error_code EC = Buffer.getError()) { - errs() << File << ": " << EC.message() << '\n'; - return; - } - - if (Expected> B = - createBinary(Buffer.get()->getMemBufferRef(), &Context)) { - if (auto *A = dyn_cast(&**B)) - return dump(A); - if (auto *O = dyn_cast(&**B)) - return dump(O); - ::dump(OS, Buffer.get()->getMemBufferRef().getBuffer()); - } else { - consumeError(B.takeError()); - ::dump(OS, Buffer.get()->getMemBufferRef().getBuffer()); - } - } -}; -} - int main(int argc, char **argv) { sys::PrintStackTraceOnErrorSignal(argv[0]); PrettyStackTraceProgram X(argc, argv); @@ -115,9 +54,14 @@ int main(int argc, char **argv) { if (InputFileNames.empty()) InputFileNames.push_back("-"); - Strings S(llvm::outs()); - std::for_each(InputFileNames.begin(), InputFileNames.end(), - [&S](StringRef F) { S.scan(F); }); + for (const auto &File : InputFileNames) { + ErrorOr> Buffer = + MemoryBuffer::getFileOrSTDIN(File); + if (std::error_code EC = Buffer.getError()) + errs() << File << ": " << EC.message() << '\n'; + else + strings(llvm::outs(), Buffer.get()->getMemBufferRef().getBuffer()); + } + return EXIT_SUCCESS; } -