WindowsResourceDumper.cpp revision 360784
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. 10// 11//===----------------------------------------------------------------------===// 12 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" 18 19namespace llvm { 20namespace object { 21namespace WindowsRes { 22 23std::string stripUTF16(const ArrayRef<UTF16> &UTF16Str) { 24 std::string Result; 25 Result.reserve(UTF16Str.size()); 26 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 += '?'; 35 } 36 return Result; 37} 38 39Error Dumper::printData() { 40 auto EntryPtrOrErr = WinRes->getHeadEntry(); 41 if (!EntryPtrOrErr) 42 return EntryPtrOrErr.takeError(); 43 auto EntryPtr = *EntryPtrOrErr; 44 45 bool IsEnd = false; 46 while (!IsEnd) { 47 printEntry(EntryPtr); 48 49 if (auto Err = EntryPtr.moveNext(IsEnd)) 50 return Err; 51 } 52 return Error::success(); 53} 54 55void 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); 64 } 65 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()); 71 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"; 81} 82 83} // namespace WindowsRes 84} // namespace object 85} // namespace llvm 86