[llvm-objcopy] [COFF] Fix warnings abuilt missing field initialization. NFC.
[llvm-complete.git] / tools / llvm-readobj / WindowsResourceDumper.cpp
blob1f568a9636712efcfb053c278312b91033b4ab68
1 //===-- WindowsResourceDumper.cpp - Windows Resource printer --------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the Windows resource (.res) dumper for llvm-readobj.
12 //===----------------------------------------------------------------------===//
14 #include "WindowsResourceDumper.h"
15 #include "Error.h"
16 #include "llvm/Object/WindowsResource.h"
17 #include "llvm/Support/ConvertUTF.h"
18 #include "llvm/Support/ScopedPrinter.h"
20 namespace llvm {
21 namespace object {
22 namespace WindowsRes {
24 std::string stripUTF16(const ArrayRef<UTF16> &UTF16Str) {
25 std::string Result;
26 Result.reserve(UTF16Str.size());
28 for (UTF16 Ch : UTF16Str) {
29 // UTF16Str will have swapped byte order in case of big-endian machines.
30 // Swap it back in such a case.
31 uint16_t ChValue = support::endian::byte_swap(Ch, support::little);
32 if (ChValue <= 0xFF)
33 Result += ChValue;
34 else
35 Result += '?';
37 return Result;
40 Error Dumper::printData() {
41 auto EntryPtrOrErr = WinRes->getHeadEntry();
42 if (!EntryPtrOrErr)
43 return EntryPtrOrErr.takeError();
44 auto EntryPtr = *EntryPtrOrErr;
46 bool IsEnd = false;
47 while (!IsEnd) {
48 printEntry(EntryPtr);
50 if (auto Err = EntryPtr.moveNext(IsEnd))
51 return Err;
53 return Error::success();
56 void Dumper::printEntry(const ResourceEntryRef &Ref) {
57 if (Ref.checkTypeString()) {
58 auto NarrowStr = stripUTF16(Ref.getTypeString());
59 SW.printString("Resource type (string)", NarrowStr);
60 } else
61 SW.printNumber("Resource type (int)", Ref.getTypeID());
63 if (Ref.checkNameString()) {
64 auto NarrowStr = stripUTF16(Ref.getNameString());
65 SW.printString("Resource name (string)", NarrowStr);
66 } else
67 SW.printNumber("Resource name (int)", Ref.getNameID());
69 SW.printNumber("Data version", Ref.getDataVersion());
70 SW.printHex("Memory flags", Ref.getMemoryFlags());
71 SW.printNumber("Language ID", Ref.getLanguage());
72 SW.printNumber("Version (major)", Ref.getMajorVersion());
73 SW.printNumber("Version (minor)", Ref.getMinorVersion());
74 SW.printNumber("Characteristics", Ref.getCharacteristics());
75 SW.printNumber("Data size", (uint64_t)Ref.getData().size());
76 SW.printBinary("Data:", Ref.getData());
77 SW.startLine() << "\n";
80 } // namespace WindowsRes
81 } // namespace object
82 } // namespace llvm