Fixing @llvm.memcpy not honoring volatile.
[llvm-core.git] / tools / llvm-readobj / WindowsResourceDumper.cpp
blob13989f696d9de2c93964af4bc51d8e2e3bec4ae3
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 SW.printNumber("Resource type (int)", Ref.getTypeID());
62 if (Ref.checkNameString()) {
63 auto NarrowStr = stripUTF16(Ref.getNameString());
64 SW.printString("Resource name (string)", NarrowStr);
65 } else
66 SW.printNumber("Resource name (int)", Ref.getNameID());
68 SW.printNumber("Data version", Ref.getDataVersion());
69 SW.printHex("Memory flags", Ref.getMemoryFlags());
70 SW.printNumber("Language ID", Ref.getLanguage());
71 SW.printNumber("Version (major)", Ref.getMajorVersion());
72 SW.printNumber("Version (minor)", Ref.getMinorVersion());
73 SW.printNumber("Characteristics", Ref.getCharacteristics());
74 SW.printNumber("Data size", (uint64_t)Ref.getData().size());
75 SW.printBinary("Data:", Ref.getData());
76 SW.startLine() << "\n";
79 } // namespace WindowsRes
80 } // namespace object
81 } // namespace llvm