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

Filipe Cabecinhas via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 15 03:46:26 PST 2016


Yeah, it seems like Saleem didn't add "llvm-commits" as a subscriber,
so I guess only Eric and Marshall got the email (and whomever had
Herald configured to add them).

 Filipe


On Tue, Nov 15, 2016 at 7:48 AM, Diana Picus via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> I think it's this one: https://reviews.llvm.org/D26341
>
> On 15 November 2016 at 04:05, Rui Ueyama via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> What's the differential revision? At least for me I couldn't find one by
>> searching "llvm-strings" in my inbox.
>>
>> On Mon, Nov 14, 2016 at 6:03 PM, Saleem Abdulrasool
>> <compnerd at compnerd.org> wrote:
>>>
>>> It went through Phab. Did it get dropped from the list? :(
>>>
>>> On Mon, Nov 14, 2016 at 2:57 PM Rui Ueyama <ruiu at google.com> wrote:
>>>>
>>>> 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-strings/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-strings/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-strings/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
>>>>>
>>>>
>>
>>
>> _______________________________________________
>> 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
>


More information about the llvm-commits mailing list