[InstCombine] Signed saturation tests. NFC
[llvm-complete.git] / tools / llvm-readobj / WindowsResourceDumper.cpp
bloba2fb6aac3f931fdb261d3327dbf09aa8a06e454c
1 //===-- WindowsResourceDumper.cpp - Windows Resource printer --------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the Windows resource (.res) dumper for llvm-readobj.
11 //===----------------------------------------------------------------------===//
13 #include "WindowsResourceDumper.h"
14 #include "Error.h"
15 #include "llvm/Object/WindowsResource.h"
16 #include "llvm/Support/ConvertUTF.h"
17 #include "llvm/Support/ScopedPrinter.h"
19 namespace llvm {
20 namespace object {
21 namespace WindowsRes {
23 std::string stripUTF16(const ArrayRef<UTF16> &UTF16Str) {
24 std::string Result;
25 Result.reserve(UTF16Str.size());
27 for (UTF16 Ch : UTF16Str) {
28 // UTF16Str will have swapped byte order in case of big-endian machines.
29 // Swap it back in such a case.
30 uint16_t ChValue = support::endian::byte_swap(Ch, support::little);
31 if (ChValue <= 0xFF)
32 Result += ChValue;
33 else
34 Result += '?';
36 return Result;
39 Error Dumper::printData() {
40 auto EntryPtrOrErr = WinRes->getHeadEntry();
41 if (!EntryPtrOrErr)
42 return EntryPtrOrErr.takeError();
43 auto EntryPtr = *EntryPtrOrErr;
45 bool IsEnd = false;
46 while (!IsEnd) {
47 printEntry(EntryPtr);
49 if (auto Err = EntryPtr.moveNext(IsEnd))
50 return Err;
52 return Error::success();
55 void Dumper::printEntry(const ResourceEntryRef &Ref) {
56 if (Ref.checkTypeString()) {
57 auto NarrowStr = stripUTF16(Ref.getTypeString());
58 SW.printString("Resource type (string)", NarrowStr);
59 } else {
60 SmallString<20> IDStr;
61 raw_svector_ostream OS(IDStr);
62 printResourceTypeName(Ref.getTypeID(), OS);
63 SW.printString("Resource type (int)", IDStr);
66 if (Ref.checkNameString()) {
67 auto NarrowStr = stripUTF16(Ref.getNameString());
68 SW.printString("Resource name (string)", NarrowStr);
69 } else
70 SW.printNumber("Resource name (int)", Ref.getNameID());
72 SW.printNumber("Data version", Ref.getDataVersion());
73 SW.printHex("Memory flags", Ref.getMemoryFlags());
74 SW.printNumber("Language ID", Ref.getLanguage());
75 SW.printNumber("Version (major)", Ref.getMajorVersion());
76 SW.printNumber("Version (minor)", Ref.getMinorVersion());
77 SW.printNumber("Characteristics", Ref.getCharacteristics());
78 SW.printNumber("Data size", (uint64_t)Ref.getData().size());
79 SW.printBinary("Data:", Ref.getData());
80 SW.startLine() << "\n";
83 } // namespace WindowsRes
84 } // namespace object
85 } // namespace llvm