[llvm] r286556 - llvm-strings: introduce basic strings tool

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 14 14:57:17 PST 2016


I was wondering that, too.

On Mon, Nov 14, 2016 at 2:48 PM, Michael Spencer via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Was there a review thread for this? I was at the C++ standards meeting all
> last week so I may have missed it.
>
> - Michael Spencer
>
> On Thu, Nov 10, 2016 at 7:44 PM, Saleem Abdulrasool via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: compnerd
>> Date: Thu Nov 10 21:44:12 2016
>> New Revision: 286556
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=286556&view=rev
>> Log:
>> llvm-strings: introduce basic strings tool
>>
>> This is a replacement to binutils' string tool.  It prints strings found
>> in a
>> binary (object file, executable, or archive library).  It is rather bare
>> and
>> not functionally equivalent, however, it lays the groundwork necessary
>> for the
>> strings tool, enabling iterative development of features to reach feature
>> parity.
>>
>> Added:
>>     llvm/trunk/tools/llvm-strings/
>>     llvm/trunk/tools/llvm-strings/CMakeLists.txt
>>     llvm/trunk/tools/llvm-strings/LLVMBuild.txt
>>     llvm/trunk/tools/llvm-strings/llvm-strings.cpp
>>
>> Added: llvm/trunk/tools/llvm-strings/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-st
>> rings/CMakeLists.txt?rev=286556&view=auto
>> ============================================================
>> ==================
>> --- llvm/trunk/tools/llvm-strings/CMakeLists.txt (added)
>> +++ llvm/trunk/tools/llvm-strings/CMakeLists.txt Thu Nov 10 21:44:12 2016
>> @@ -0,0 +1,8 @@
>> +set(LLVM_LINK_COMPONENTS
>> +  Object
>> +  )
>> +
>> +add_llvm_tool(llvm-strings
>> +  llvm-strings.cpp
>> +  )
>> +
>>
>> Added: llvm/trunk/tools/llvm-strings/LLVMBuild.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-st
>> rings/LLVMBuild.txt?rev=286556&view=auto
>> ============================================================
>> ==================
>> --- llvm/trunk/tools/llvm-strings/LLVMBuild.txt (added)
>> +++ llvm/trunk/tools/llvm-strings/LLVMBuild.txt Thu Nov 10 21:44:12 2016
>> @@ -0,0 +1,22 @@
>> +;===- ./tools/llvm-strings/LLVMBuild.txt -----------------------*- Conf
>> -*--===;
>> +;
>> +;                     The LLVM Compiler Infrastructure
>> +;
>> +; This file is distributed under the University of Illinois Open Source
>> +; License. See LICENSE.TXT for details.
>> +;
>> +;===-------------------------------------------------------
>> -----------------===;
>> +;
>> +; This is an LLVMBuild description file for the components in this
>> subdirectory.
>> +;
>> +; For more information on the LLVMBuild system, please see:
>> +;
>> +;   http://llvm.org/docs/LLVMBuild.html
>> +;
>> +;===-------------------------------------------------------
>> -----------------===;
>> +
>> +[component_0]
>> +type = Tool
>> +name = llvm-strings
>> +parent = Tools
>> +required_libraries = Archive Object
>>
>> Added: llvm/trunk/tools/llvm-strings/llvm-strings.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-st
>> rings/llvm-strings.cpp?rev=286556&view=auto
>> ============================================================
>> ==================
>> --- llvm/trunk/tools/llvm-strings/llvm-strings.cpp (added)
>> +++ llvm/trunk/tools/llvm-strings/llvm-strings.cpp Thu Nov 10 21:44:12
>> 2016
>> @@ -0,0 +1,120 @@
>> +//===-- llvm-strings.cpp - Printable String dumping utility
>> ---------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===------------------------------------------------------
>> ----------------===//
>> +//
>> +// This program is a utility that works like binutils "strings", that
>> is, it
>> +// prints out printable strings in a binary, objdump, or archive file.
>> +//
>> +//===------------------------------------------------------
>> ----------------===//
>> +
>> +#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"
>> +#include "llvm/Support/PrettyStackTrace.h"
>> +#include "llvm/Support/Program.h"
>> +#include "llvm/Support/Signals.h"
>> +#include <string>
>> +
>> +using namespace llvm;
>> +using namespace llvm::object;
>> +
>> +static cl::list<std::string> InputFileNames(cl::Positional,
>> +                                            cl::desc("<input object
>> files>"),
>> +                                            cl::ZeroOrMore);
>> +
>> +static void dump(raw_ostream &OS, StringRef Contents) {
>> +  const char *S = nullptr;
>> +  for (const char *P = Contents.begin(), *E = Contents.end(); P < E;
>> ++P) {
>> +    if (std::isgraph(*P) || std::isblank(*P)) {
>> +      if (S == nullptr)
>> +        S = P;
>> +    } else if (S) {
>> +      if (P - S > 3)
>> +        OS << StringRef(S, P - S) << '\n';
>> +      S = nullptr;
>> +    }
>> +  }
>> +}
>> +
>> +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;
>> +    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';
>> +        }
>> +      }
>> +    }
>> +    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);
>> +
>> +  cl::ParseCommandLineOptions(argc, argv, "llvm string dumper\n");
>> +
>> +  if (InputFileNames.empty())
>> +    InputFileNames.push_back("-");
>> +
>> +  Strings S(llvm::outs());
>> +  std::for_each(InputFileNames.begin(), InputFileNames.end(),
>> +                [&S](StringRef F) { S.scan(F); });
>> +  return EXIT_SUCCESS;
>> +}
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161114/cf5e1d6f/attachment.html>


More information about the llvm-commits mailing list