[llvm] r286727 - llvm-strings: trivialise logic until we support more options

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 12 10:37:04 PST 2016


Author: compnerd
Date: Sat Nov 12 12:37:04 2016
New Revision: 286727

URL: http://llvm.org/viewvc/llvm-project?rev=286727&view=rev
Log:
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.

Added:
    llvm/trunk/test/tools/llvm-strings/nested-archives.test
Modified:
    llvm/trunk/tools/llvm-strings/llvm-strings.cpp

Added: llvm/trunk/test/tools/llvm-strings/nested-archives.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-strings/nested-archives.test?rev=286727&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-strings/nested-archives.test (added)
+++ llvm/trunk/test/tools/llvm-strings/nested-archives.test Sat Nov 12 12:37:04 2016
@@ -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: !<arch>
+CHECK: inner.a/        0           0     0     644     72        `
+CHECK: !<arch>
+CHECK: abcd/           0           0     0     644     4         `
+CHECK: abcd
+

Modified: llvm/trunk/tools/llvm-strings/llvm-strings.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-strings/llvm-strings.cpp?rev=286727&r1=286726&r2=286727&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-strings/llvm-strings.cpp (original)
+++ llvm/trunk/tools/llvm-strings/llvm-strings.cpp Sat Nov 12 12:37:04 2016
@@ -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<std::string> InputFileNa
                                             cl::desc("<input object files>"),
                                             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, String
     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<std::unique_ptr<Binary>> Child =
-              Element.getAsBinary(&Context)) {
-        dump(dyn_cast<ObjectFile>(&**Child));
-      } else {
-        if (auto E = isNotObjectErrorInvalidFileType(Child.takeError())) {
-          errs() << A->getFileName();
-          if (Expected<StringRef> Name = Element.getName())
-            errs() << '(' << *Name << ')';
-          logAllUnhandledErrors(std::move(E), errs(), "");
-          errs() << '\n';
-        }
-      }
-    }
-    (void)static_cast<bool>(E);
-  }
-
-public:
-  Strings(raw_ostream &S) : OS(S) {}
-
-  void scan(StringRef File) {
-    ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer =
-        MemoryBuffer::getFileOrSTDIN(File);
-    if (std::error_code EC = Buffer.getError()) {
-      errs() << File << ": " << EC.message() << '\n';
-      return;
-    }
-
-    if (Expected<std::unique_ptr<Binary>> B =
-            createBinary(Buffer.get()->getMemBufferRef(), &Context)) {
-      if (auto *A = dyn_cast<Archive>(&**B))
-        return dump(A);
-      if (auto *O = dyn_cast<ObjectFile>(&**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<std::unique_ptr<MemoryBuffer>> 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;
 }
-




More information about the llvm-commits mailing list