diff options
Diffstat (limited to 'tools/llvm-readobj/WindowsResourceDumper.cpp')
| -rw-r--r-- | tools/llvm-readobj/WindowsResourceDumper.cpp | 82 | 
1 files changed, 82 insertions, 0 deletions
diff --git a/tools/llvm-readobj/WindowsResourceDumper.cpp b/tools/llvm-readobj/WindowsResourceDumper.cpp new file mode 100644 index 0000000000000..1f568a9636712 --- /dev/null +++ b/tools/llvm-readobj/WindowsResourceDumper.cpp @@ -0,0 +1,82 @@ +//===-- WindowsResourceDumper.cpp - Windows Resource printer --------------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Windows resource (.res) dumper for llvm-readobj. +// +//===----------------------------------------------------------------------===// + +#include "WindowsResourceDumper.h" +#include "Error.h" +#include "llvm/Object/WindowsResource.h" +#include "llvm/Support/ConvertUTF.h" +#include "llvm/Support/ScopedPrinter.h" + +namespace llvm { +namespace object { +namespace WindowsRes { + +std::string stripUTF16(const ArrayRef<UTF16> &UTF16Str) { +  std::string Result; +  Result.reserve(UTF16Str.size()); + +  for (UTF16 Ch : UTF16Str) { +    // UTF16Str will have swapped byte order in case of big-endian machines. +    // Swap it back in such a case. +    uint16_t ChValue = support::endian::byte_swap(Ch, support::little); +    if (ChValue <= 0xFF) +      Result += ChValue; +    else +      Result += '?'; +  } +  return Result; +} + +Error Dumper::printData() { +  auto EntryPtrOrErr = WinRes->getHeadEntry(); +  if (!EntryPtrOrErr) +    return EntryPtrOrErr.takeError(); +  auto EntryPtr = *EntryPtrOrErr; + +  bool IsEnd = false; +  while (!IsEnd) { +    printEntry(EntryPtr); + +    if (auto Err = EntryPtr.moveNext(IsEnd)) +      return Err; +  } +  return Error::success(); +} + +void Dumper::printEntry(const ResourceEntryRef &Ref) { +  if (Ref.checkTypeString()) { +    auto NarrowStr = stripUTF16(Ref.getTypeString()); +    SW.printString("Resource type (string)", NarrowStr); +  } else +    SW.printNumber("Resource type (int)", Ref.getTypeID()); + +  if (Ref.checkNameString()) { +    auto NarrowStr = stripUTF16(Ref.getNameString()); +    SW.printString("Resource name (string)", NarrowStr); +  } else +    SW.printNumber("Resource name (int)", Ref.getNameID()); + +  SW.printNumber("Data version", Ref.getDataVersion()); +  SW.printHex("Memory flags", Ref.getMemoryFlags()); +  SW.printNumber("Language ID", Ref.getLanguage()); +  SW.printNumber("Version (major)", Ref.getMajorVersion()); +  SW.printNumber("Version (minor)", Ref.getMinorVersion()); +  SW.printNumber("Characteristics", Ref.getCharacteristics()); +  SW.printNumber("Data size", (uint64_t)Ref.getData().size()); +  SW.printBinary("Data:", Ref.getData()); +  SW.startLine() << "\n"; +} + +} // namespace WindowsRes +} // namespace object +} // namespace llvm  | 
