diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-11-12 18:37:04 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-11-12 18:37:04 +0000 |
commit | be3a2919f42e8323f65c126138f263578bfb9a7e (patch) | |
tree | cf956a00db6a58f150a051f35ed5316f14be8d03 /llvm/tools/llvm-strings/llvm-strings.cpp | |
parent | 22a2628f18094a4f7c1b40b90ec280739805768b (diff) | |
download | bcm5719-llvm-be3a2919f42e8323f65c126138f263578bfb9a7e.tar.gz bcm5719-llvm-be3a2919f42e8323f65c126138f263578bfb9a7e.zip |
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
Diffstat (limited to 'llvm/tools/llvm-strings/llvm-strings.cpp')
-rw-r--r-- | llvm/tools/llvm-strings/llvm-strings.cpp | 76 |
1 files changed, 10 insertions, 66 deletions
diff --git a/llvm/tools/llvm-strings/llvm-strings.cpp b/llvm/tools/llvm-strings/llvm-strings.cpp index dbabf08a52f..6e5e2f298c3 100644 --- a/llvm/tools/llvm-strings/llvm-strings.cpp +++ b/llvm/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<std::string> InputFileNames(cl::Positional, 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, 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<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; } - |