Home | History | Annotate | Download | only in llvm-readobj
      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.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     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"
     19 
     20 namespace llvm {
     21 namespace object {
     22 namespace WindowsRes {
     23 
     24 std::string stripUTF16(const ArrayRef<UTF16> &UTF16Str) {
     25   std::string Result;
     26   Result.reserve(UTF16Str.size());
     27 
     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 += '?';
     36   }
     37   return Result;
     38 }
     39 
     40 Error Dumper::printData() {
     41   auto EntryPtrOrErr = WinRes->getHeadEntry();
     42   if (!EntryPtrOrErr)
     43     return EntryPtrOrErr.takeError();
     44   auto EntryPtr = *EntryPtrOrErr;
     45 
     46   bool IsEnd = false;
     47   while (!IsEnd) {
     48     printEntry(EntryPtr);
     49 
     50     if (auto Err = EntryPtr.moveNext(IsEnd))
     51       return Err;
     52   }
     53   return Error::success();
     54 }
     55 
     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());
     62 
     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());
     68 
     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";
     78 }
     79 
     80 } // namespace WindowsRes
     81 } // namespace object
     82 } // namespace llvm
     83