<div dir="ltr">This looks like an endianness issue, the chinese characters displayed have the same UTF-16 codes as the expected characters, but in reverse byte order.  Will take a look at this.</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 8, 2017 at 4:53 PM, Bill Seurer <span dir="ltr"><<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This revision causes a test case failure on powerpc BE:<br>
<br>
<a href="http://lab.llvm.org:8011/builders/clang-ppc64be-linux/builds/7622/steps/ninja%20check%201/logs/FAIL%3A%20LLVM%3A%3Aresources.test" rel="noreferrer" target="_blank">http://lab.llvm.org:8011/build<wbr>ers/clang-ppc64be-linux/builds<wbr>/7622/steps/ninja%20check%201/<wbr>logs/FAIL%3A%20LLVM%3A%<wbr>3Aresources.test</a><br>
<br>
******************** TEST 'LLVM :: tools/llvm-readobj/resources.t<wbr>est' FAILED ********************<br>
Script:<br>
--<br>
/home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/stage1/./bi<wbr>n/llvm-readobj -coff-resources -section-data /home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/llvm/test/t<wbr>ools/llvm-readobj/Inputs/zero-<wbr>string-table.obj.coff-i386    | /home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/stage1/./bi<wbr>n/FileCheck /home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/llvm/test/t<wbr>ools/llvm-readobj/resources.te<wbr>st -check-prefix ZERO<br>
/home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/stage1/./bi<wbr>n/llvm-readobj -coff-resources /home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/llvm/test/t<wbr>ools/llvm-readobj/Inputs/resou<wbr>rces/test_resource.obj.coff    | /home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/stage1/./bi<wbr>n/FileCheck /home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/llvm/test/t<wbr>ools/llvm-readobj/resources.te<wbr>st -check-prefix TEST_RES<br>
--<br>
Exit Code: 1<br>
<br>
Command Output (stderr):<br>
--<br>
/home/buildbots/ppc64be-clang-<wbr>test/clang-ppc64be/llvm/test/t<wbr>ools/llvm-readobj/resources.te<wbr>st:36:16: error: expected string not found in input<br>
TEST_RES-NEXT: Name: CURSOR [<br>
               ^<br>
<stdin>:12:2: note: scanning from here<br>
 Name: 䌀唀刀匀伀刀 [<br>
<br>
--<br>
<br>
********************<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
<br>
On 05/07/2017 09:47 PM, Eric Beckmann via llvm-commits wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: ecbeckmann<br>
Date: Sun May  7 21:47:07 2017<br>
New Revision: 302399<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=302399&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=302399&view=rev</a><br>
Log:<br>
Update llvm-readobj -coff-resources to display tree structure.<br>
<br>
Summary: Continue making updates to llvm-readobj to display resource sections.  This is necessary for testing the up and coming cvtres tool.<br>
<br>
Reviewers: zturner<br>
<br>
Subscribers: llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D32609" rel="noreferrer" target="_blank">https://reviews.llvm.org/D3260<wbr>9</a><br>
<br>
Added:<br>
    llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/cursor_<wbr>small.bmp   (with props)<br>
    llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/okay_sma<wbr>ll.bmp   (with props)<br>
    llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/test_res<wbr>ource.rc<br>
    llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/test_res<wbr>ource.res   (with props)<br>
Modified:<br>
    llvm/trunk/include/llvm/Object<wbr>/COFF.h<br>
    llvm/trunk/include/llvm/Suppor<wbr>t/COFF.h<br>
    llvm/trunk/lib/Object/COFFObje<wbr>ctFile.cpp<br>
    llvm/trunk/test/tools/llvm-rea<wbr>dobj/resources.test<br>
    llvm/trunk/tools/llvm-readobj/<wbr>COFFDumper.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Object<wbr>/COFF.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=302399&r1=302398&r2=302399&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Object/COFF.h?rev=302399&r1=<wbr>302398&r2=302399&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/Object<wbr>/COFF.h (original)<br>
+++ llvm/trunk/include/llvm/Object<wbr>/COFF.h Sun May  7 21:47:07 2017<br>
@@ -20,6 +20,7 @@<br>
 #include "llvm/Object/Binary.h"<br>
 #include "llvm/Object/Error.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/Support/BinaryByteStream<wbr>.h"<br>
 #include "llvm/Support/COFF.h"<br>
 #include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
@@ -40,6 +41,7 @@ class DelayImportDirectoryEntryRef;<br>
 class ExportDirectoryEntryRef;<br>
 class ImportDirectoryEntryRef;<br>
 class ImportedSymbolRef;<br>
+class ResourceSectionRef;<br>
<br>
 using import_directory_iterator = content_iterator<ImportDirecto<wbr>ryEntryRef>;<br>
 using delay_import_directory_iterato<wbr>r =<br>
@@ -623,6 +625,26 @@ struct coff_base_reloc_block_entry {<br>
   int getOffset() const { return Data & ((1 << 12) - 1); }<br>
 };<br>
<br>
+struct coff_resource_dir_entry {<br>
+  union {<br>
+    support::ulittle32_t NameOffset;<br>
+    support::ulittle32_t ID;<br>
+    uint32_t getNameOffset() const {<br>
+      return maskTrailingOnes<uint32_t>(31) & NameOffset;<br>
+    }<br>
+  } Identifier;<br>
+  union {<br>
+    support::ulittle32_t DataEntryOffset;<br>
+    support::ulittle32_t SubdirOffset;<br>
+<br>
+    bool isSubDir() const { return SubdirOffset >> 31; }<br>
+    uint32_t value() const {<br>
+      return maskTrailingOnes<uint32_t>(31) & SubdirOffset;<br>
+    }<br>
+<br>
+  } Offset;<br>
+};<br>
+<br>
 struct coff_resource_dir_table {<br>
   support::ulittle32_t Characteristics;<br>
   support::ulittle32_t TimeDateStamp;<br>
@@ -1047,6 +1069,23 @@ private:<br>
   const COFFObjectFile *OwningObject = nullptr;<br>
 };<br>
<br>
+class ResourceSectionRef {<br>
+public:<br>
+  ResourceSectionRef() = default;<br>
+  explicit ResourceSectionRef(StringRef Ref) : BBS(Ref, support::little) {}<br>
+<br>
+  ErrorOr<StringRef> getEntryNameString(const coff_resource_dir_entry &Entry);<br>
+  ErrorOr<const coff_resource_dir_table &><br>
+  getEntrySubDir(const coff_resource_dir_entry &Entry);<br>
+  ErrorOr<const coff_resource_dir_table &> getBaseTable();<br>
+<br>
+private:<br>
+  BinaryByteStream BBS;<br>
+<br>
+  ErrorOr<const coff_resource_dir_table &> getTableAtOffset(uint32_t Offset);<br>
+  ErrorOr<StringRef> getDirStringAtOffset(uint32_t Offset);<br>
+};<br>
+<br>
 // Corresponds to `_FPO_DATA` structure in the PE/COFF spec.<br>
 struct FpoData {<br>
   support::ulittle32_t Offset; // ulOffStart: Offset 1st byte of function code<br>
<br>
Modified: llvm/trunk/include/llvm/Suppor<wbr>t/COFF.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/COFF.h?rev=302399&r1=302398&r2=302399&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Support/COFF.h?rev=302399&r1=<wbr>302398&r2=302399&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/Suppor<wbr>t/COFF.h (original)<br>
+++ llvm/trunk/include/llvm/Suppor<wbr>t/COFF.h Sun May  7 21:47:07 2017<br>
@@ -152,6 +152,30 @@ namespace COFF {<br>
     IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000<br>
   };<br>
<br>
+  enum ResourceTypeID {<br>
+    RID_Cursor = 1,<br>
+    RID_Bitmap = 2,<br>
+    RID_Icon = 3,<br>
+    RID_Menu = 4,<br>
+    RID_Dialog = 5,<br>
+    RID_String = 6,<br>
+    RID_FontDir = 7,<br>
+    RID_Font = 8,<br>
+    RID_Accelerator = 9,<br>
+    RID_RCData = 10,<br>
+    RID_MessageTable = 11,<br>
+    RID_Group_Cursor = 12,<br>
+    RID_Group_Icon = 14,<br>
+    RID_Version = 16,<br>
+    RID_DLGInclude = 17,<br>
+    RID_PlugPlay = 19,<br>
+    RID_VXD = 20,<br>
+    RID_AniCursor = 21,<br>
+    RID_AniIcon = 22,<br>
+    RID_HTML = 23,<br>
+    RID_Manifest = 24,<br>
+  };<br>
+<br>
   struct symbol {<br>
     char     Name[NameSize];<br>
     uint32_t Value;<br>
<br>
Modified: llvm/trunk/lib/Object/COFFObje<wbr>ctFile.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=302399&r1=302398&r2=302399&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Object/CO<wbr>FFObjectFile.cpp?rev=302399&r1<wbr>=302398&r2=302399&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/COFFObje<wbr>ctFile.cpp (original)<br>
+++ llvm/trunk/lib/Object/COFFObje<wbr>ctFile.cpp Sun May  7 21:47:07 2017<br>
@@ -19,7 +19,9 @@<br>
 #include "llvm/Object/COFF.h"<br>
 #include "llvm/Object/Error.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/Support/BinaryStreamRead<wbr>er.h"<br>
 #include "llvm/Support/COFF.h"<br>
+#include "llvm/Support/ConvertUTF.h"<br>
 #include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/Error.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
@@ -159,8 +161,7 @@ void COFFObjectFile::moveSymbolNext<wbr>(Data<br>
 Expected<StringRef> COFFObjectFile::getSymbolName(<wbr>DataRefImpl Ref) const {<br>
   COFFSymbolRef Symb = getCOFFSymbol(Ref);<br>
   StringRef Result;<br>
-  std::error_code EC = getSymbolName(Symb, Result);<br>
-  if (EC)<br>
+  if (std::error_code EC = getSymbolName(Symb, Result))<br>
     return errorCodeToError(EC);<br>
   return Result;<br>
 }<br>
@@ -1591,3 +1592,47 @@ std::error_code BaseRelocRef::getRVA(uin<br>
   Result = Header->PageRVA + Entry[Index].getOffset();<br>
   return std::error_code();<br>
 }<br>
+<br>
+#define RETURN_IF_ERROR(X)                                                     \<br>
+  if (auto EC = errorToErrorCode(X))                                           \<br>
+    return EC;<br>
+<br>
+ErrorOr<StringRef> ResourceSectionRef::getDirStri<wbr>ngAtOffset(uint32_t Offset) {<br>
+  BinaryStreamReader Reader = BinaryStreamReader(BBS);<br>
+  Reader.setOffset(Offset);<br>
+  uint16_t Length;<br>
+  RETURN_IF_ERROR(Reader.readInt<wbr>eger(Length));<br>
+  ArrayRef<UTF16> RawDirString;<br>
+  // Strings are stored as 2-byte aligned unicode characters but readFixedString<br>
+  // assumes byte string, so we double length.<br>
+  RETURN_IF_ERROR(Reader.readArr<wbr>ay(RawDirString, Length));<br>
+  std::string DirString;<br>
+  if (!llvm::convertUTF16ToUTF8Stri<wbr>ng(RawDirString, DirString))<br>
+    return object_error::parse_failed;<br>
+  return DirString;<br>
+}<br>
+<br>
+ErrorOr<StringRef><br>
+ResourceSectionRef::getEntryN<wbr>ameString(const coff_resource_dir_entry &Entry) {<br>
+  return getDirStringAtOffset(Entry.Ide<wbr>ntifier.getNameOffset());<br>
+}<br>
+<br>
+ErrorOr<const coff_resource_dir_table &><br>
+ResourceSectionRef::getTableA<wbr>tOffset(uint32_t Offset) {<br>
+  const coff_resource_dir_table *Table = nullptr;<br>
+<br>
+  BinaryStreamReader Reader(BBS);<br>
+  Reader.setOffset(Offset);<br>
+  RETURN_IF_ERROR(Reader.readObj<wbr>ect(Table));<br>
+  assert(Table != nullptr);<br>
+  return *Table;<br>
+}<br>
+<br>
+ErrorOr<const coff_resource_dir_table &><br>
+ResourceSectionRef::getEntryS<wbr>ubDir(const coff_resource_dir_entry &Entry) {<br>
+  return getTableAtOffset(Entry.Offset.<wbr>value());<br>
+}<br>
+<br>
+ErrorOr<const coff_resource_dir_table &> ResourceSectionRef::getBaseTab<wbr>le() {<br>
+  return getTableAtOffset(0);<br>
+}<br>
<br>
Added: llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/cursor_<wbr>small.bmp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/Inputs/resources/cursor_small.bmp?rev=302399&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-readobj/Inputs/resources/cu<wbr>rsor_small.bmp?rev=302399&view<wbr>=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/cursor_<wbr>small.bmp<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/okay_sma<wbr>ll.bmp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/Inputs/resources/okay_small.bmp?rev=302399&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-readobj/Inputs/resources/ok<wbr>ay_small.bmp?rev=302399&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/okay_sma<wbr>ll.bmp<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/test_res<wbr>ource.rc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/Inputs/resources/test_resource.rc?rev=302399&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-readobj/Inputs/resources/te<wbr>st_resource.rc?rev=302399&view<wbr>=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/test_res<wbr>ource.rc (added)<br>
+++ llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/test_res<wbr>ource.rc Sun May  7 21:47:07 2017<br>
@@ -0,0 +1,44 @@<br>
+#include "windows.h"<br>
+<br>
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US<br>
+<br>
+myaccelerators ACCELERATORS<br>
+{<br>
+       "^C", 999, VIRTKEY, ALT<br>
+       "D", 1100, VIRTKEY, CONTROL, SHIFT<br>
+       "^R", 444, ASCII, NOINVERT<br>
+}<br>
+<br>
+cursor BITMAP "cursor_small.bmp"<br>
+okay BITMAP "okay_small.bmp"<br>
+<br>
+14432 MENU<br>
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED<br>
+{<br>
+       MENUITEM "yu", 100<br>
+       MENUITEM "shala", 101<br>
+       MENUITEM "kaoya", 102<br>
+}<br>
+<br>
+testdialog DIALOG 10, 10, 200, 300<br>
+STYLE WS_POPUP | WS_BORDER<br>
+CAPTION "Test"<br>
+{<br>
+       CTEXT "Continue:", 1, 10, 10, 230, 14<br>
+       PUSHBUTTON "&OK", 2, 66, 134, 161, 13<br>
+}<br>
+<br>
+12 ACCELERATORS<br>
+{<br>
+       "X", 164, VIRTKEY, ALT<br>
+       "H", 5678, VIRTKEY, CONTROL, SHIFT<br>
+       "^R", 444, ASCII, NOINVERT<br>
+}<br>
+<br>
+"eat" MENU<br>
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS<br>
+{<br>
+       MENUITEM "fish", 100<br>
+       MENUITEM "salad", 101<br>
+       MENUITEM "duck", 102<br>
+}<br>
<br>
Added: llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/test_res<wbr>ource.res<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/Inputs/resources/test_resource.res?rev=302399&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-readobj/Inputs/resources/te<wbr>st_resource.res?rev=302399&vie<wbr>w=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-rea<wbr>dobj/Inputs/resources/test_res<wbr>ource.res<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Modified: llvm/trunk/test/tools/llvm-rea<wbr>dobj/resources.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/resources.test?rev=302399&r1=302398&r2=302399&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-readobj/resources.test?rev=<wbr>302399&r1=302398&r2=302399&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-rea<wbr>dobj/resources.test (original)<br>
+++ llvm/trunk/test/tools/llvm-rea<wbr>dobj/resources.test Sun May  7 21:47:07 2017<br>
@@ -1,19 +1,111 @@<br>
-RUN: llvm-readobj -coff-resources %p/Inputs/zero-string-table.ob<wbr>j.coff-i386 \<br>
-RUN:   | FileCheck %s -check-prefix RESOURCE<br>
+// Check dumping of the .rsrc section(s)<br>
+// The input was generated with the following commands, using the original Windows<br>
+// rc.exe and cvtres.exe:<br>
+// > rc /fo test_resource.res /nologo test_resource.rc<br>
+// > cvtres /machine:X86 /readonly /nologo /out:test_resource.o test_resource.res<br>
<br>
-RESOURCE:      Resources [<br>
-RESOURCE-NEXT:   Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
-RESOURCE-NEXT:   .rsrc$01 Data (<br>
-RESOURCE-NEXT:     0000: 00000000 00000000 00000000 00000100  |................|<br>
-RESOURCE-NEXT:     0010: 06000000 18000080 00000000 00000000  |................|<br>
-RESOURCE-NEXT:     0020: 00000000 00000100 01000000 30000080  |............0...|<br>
-RESOURCE-NEXT:     0030: 00000000 00000000 00000000 00000100  |................|<br>
-RESOURCE-NEXT:     0040: 09040000 48000000 00000000 2A000000  |....H.......*...|<br>
-RESOURCE-NEXT:     0050: 00000000 00000000                    |........|<br>
-RESOURCE-NEXT:   )<br>
-RESOURCE-NEXT:   .rsrc$02 Data (<br>
-RESOURCE-NEXT:     0000: 00000500 48006500 6C006C00 6F000000  |....H.e.l.l.o...|<br>
-RESOURCE-NEXT:     0010: 00000000 00000000 00000000 00000000  |................|<br>
-RESOURCE-NEXT:     0020: 00000000 00000000 00000000 00000000  |................|<br>
-RESOURCE-NEXT:   )<br>
-RESOURCE-NEXT: ]<br>
+RUN: llvm-readobj -coff-resources -section-data %p/Inputs/zero-string-table.ob<wbr>j.coff-i386 \<br>
+RUN:   | FileCheck %s -check-prefix ZERO<br>
+RUN: llvm-readobj -coff-resources %p/Inputs/resources/test_resou<wbr>rce.o \<br>
+RUN:   | FileCheck %s -check-prefix TEST_RES<br>
+<br>
+ZERO:      Resources [<br>
+ZERO-NEXT:   String Name Entries: 0<br>
+ZERO-NEXT:   ID Entries: 1<br>
+ZERO-NEXT:   Type: kRT_STRING (ID 6) [<br>
+ZERO-NEXT:     String Name Entries: 0<br>
+ZERO-NEXT:     ID Entries: 1<br>
+ZERO-NEXT:     Name: (ID 1) [<br>
+ZERO-NEXT:       String Name Entries: 0<br>
+ZERO-NEXT:       ID Entries: 1<br>
+ZERO-NEXT:       Language: (ID 1033) [<br>
+ZERO-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+ZERO-NEXT:         Major Version: 0<br>
+ZERO-NEXT:         Minor Version: 0<br>
+ZERO-NEXT:       ]<br>
+ZERO-NEXT:     ]<br>
+ZERO-NEXT:   ]<br>
+<br>
+<br>
+TEST_RES:           Resources [<br>
+TEST_RES-NEXT:   String Name Entries: 0<br>
+TEST_RES-NEXT:   ID Entries: 4<br>
+TEST_RES-NEXT:   Type: kRT_BITMAP (ID 2) [<br>
+TEST_RES-NEXT:     String Name Entries: 2<br>
+TEST_RES-NEXT:     ID Entries: 0<br>
+TEST_RES-NEXT:     Name: CURSOR [<br>
+TEST_RES-NEXT:       String Name Entries: 0<br>
+TEST_RES-NEXT:       ID Entries: 1<br>
+TEST_RES-NEXT:       Language: (ID 1033) [<br>
+TEST_RES-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+TEST_RES-NEXT:         Major Version: 0<br>
+TEST_RES-NEXT:         Minor Version: 0<br>
+TEST_RES-NEXT:       ]<br>
+TEST_RES-NEXT:     ]<br>
+TEST_RES-NEXT:     Name: OKAY [<br>
+TEST_RES-NEXT:       String Name Entries: 0<br>
+TEST_RES-NEXT:       ID Entries: 1<br>
+TEST_RES-NEXT:       Language: (ID 1033) [<br>
+TEST_RES-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+TEST_RES-NEXT:         Major Version: 0<br>
+TEST_RES-NEXT:         Minor Version: 0<br>
+TEST_RES-NEXT:       ]<br>
+TEST_RES-NEXT:     ]<br>
+TEST_RES-NEXT:   ]<br>
+TEST_RES-NEXT:   Type: kRT_MENU (ID 4) [<br>
+TEST_RES-NEXT:     String Name Entries: 1<br>
+TEST_RES-NEXT:     ID Entries: 1<br>
+TEST_RES-NEXT:     Name: "EAT" [<br>
+TEST_RES-NEXT:       String Name Entries: 0<br>
+TEST_RES-NEXT:       ID Entries: 1<br>
+TEST_RES-NEXT:       Language: (ID 3081) [<br>
+TEST_RES-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+TEST_RES-NEXT:         Major Version: 0<br>
+TEST_RES-NEXT:         Minor Version: 0<br>
+TEST_RES-NEXT:       ]<br>
+TEST_RES-NEXT:     ]<br>
+TEST_RES-NEXT:     Name: (ID 14432) [<br>
+TEST_RES-NEXT:       String Name Entries: 0<br>
+TEST_RES-NEXT:       ID Entries: 1<br>
+TEST_RES-NEXT:       Language: (ID 2052) [<br>
+TEST_RES-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+TEST_RES-NEXT:         Major Version: 0<br>
+TEST_RES-NEXT:         Minor Version: 0<br>
+TEST_RES-NEXT:       ]<br>
+TEST_RES-NEXT:     ]<br>
+TEST_RES-NEXT:   ]<br>
+TEST_RES-NEXT:   Type: kRT_DIALOG (ID 5) [<br>
+TEST_RES-NEXT:     String Name Entries: 1<br>
+TEST_RES-NEXT:     ID Entries: 0<br>
+TEST_RES-NEXT:     Name: TESTDIALOG [<br>
+TEST_RES-NEXT:       String Name Entries: 0<br>
+TEST_RES-NEXT:       ID Entries: 1<br>
+TEST_RES-NEXT:       Language: (ID 1033) [<br>
+TEST_RES-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+TEST_RES-NEXT:         Major Version: 0<br>
+TEST_RES-NEXT:         Minor Version: 0<br>
+TEST_RES-NEXT:       ]<br>
+TEST_RES-NEXT:     ]<br>
+TEST_RES-NEXT:   ]<br>
+TEST_RES-NEXT:   Type: kRT_ACCELERATOR (ID 9) [<br>
+TEST_RES-NEXT:     String Name Entries: 1<br>
+TEST_RES-NEXT:     ID Entries: 1<br>
+TEST_RES-NEXT:     Name: MYACCELERATORS [<br>
+TEST_RES-NEXT:       String Name Entries: 0<br>
+TEST_RES-NEXT:       ID Entries: 1<br>
+TEST_RES-NEXT:       Language: (ID 1033) [<br>
+TEST_RES-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+TEST_RES-NEXT:         Major Version: 0<br>
+TEST_RES-NEXT:         Minor Version: 0<br>
+TEST_RES-NEXT:       ]<br>
+TEST_RES-NEXT:     ]<br>
+TEST_RES-NEXT:     Name: (ID 12) [<br>
+TEST_RES-NEXT:       String Name Entries: 0<br>
+TEST_RES-NEXT:       ID Entries: 1<br>
+TEST_RES-NEXT:       Language: (ID 1033) [<br>
+TEST_RES-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)<br>
+TEST_RES-NEXT:         Major Version: 0<br>
+TEST_RES-NEXT:         Minor Version: 0<br>
+TEST_RES-NEXT:       ]<br>
+TEST_RES-NEXT:     ]<br>
+TEST_RES-NEXT:   ]<br>
<br>
Modified: llvm/trunk/tools/llvm-readobj/<wbr>COFFDumper.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=302399&r1=302398&r2=302399&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/tools/llvm-re<wbr>adobj/COFFDumper.cpp?rev=30239<wbr>9&r1=302398&r2=302399&view=<wbr>diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-readobj/<wbr>COFFDumper.cpp (original)<br>
+++ llvm/trunk/tools/llvm-readobj/<wbr>COFFDumper.cpp Sun May  7 21:47:07 2017<br>
@@ -121,6 +121,10 @@ private:<br>
                            uint32_t RelocOffset, uint32_t Offset,<br>
                            StringRef *RelocSym = nullptr);<br>
<br>
+  void printResourceDirectoryTable(Re<wbr>sourceSectionRef RSF,<br>
+                                   const coff_resource_dir_table &Table,<br>
+                                   StringRef Level);<br>
+<br>
   void printBinaryBlockWithRelocs(Str<wbr>ingRef Label, const SectionRef &Sec,<br>
                                   StringRef SectionContents, StringRef Block);<br>
<br>
@@ -140,6 +144,9 @@ private:<br>
   void printDelayImportedSymbols(<br>
       const DelayImportDirectoryEntryRef &I,<br>
       iterator_range<imported_symbo<wbr>l_iterator> Range);<br>
+  ErrorOr<const coff_resource_dir_entry &><br>
+  getResourceDirectoryTableEntry<wbr>(const coff_resource_dir_table &Table,<br>
+                                 uint32_t Index);<br>
<br>
   typedef DenseMap<const coff_section*, std::vector<RelocationRef> > RelocMapTy;<br>
<br>
@@ -534,6 +541,29 @@ static const EnumEntry<uint8_t> FileChec<br>
   LLVM_READOBJ_ENUM_CLASS_ENT(F<wbr>ileChecksumKind, SHA256),<br>
 };<br>
<br>
+static const EnumEntry<COFF::ResourceTypeID<wbr>> ResourceTypeNames[]{<br>
+    {"kRT_CURSOR (ID 1)", COFF::RID_Cursor},<br>
+    {"kRT_BITMAP (ID 2)", COFF::RID_Bitmap},<br>
+    {"kRT_ICON (ID 3)", COFF::RID_Icon},<br>
+    {"kRT_MENU (ID 4)", COFF::RID_Menu},<br>
+    {"kRT_DIALOG (ID 5)", COFF::RID_Dialog},<br>
+    {"kRT_STRING (ID 6)", COFF::RID_String},<br>
+    {"kRT_FONTDIR (ID 7)", COFF::RID_FontDir},<br>
+    {"kRT_FONT (ID 8)", COFF::RID_Font},<br>
+    {"kRT_ACCELERATOR (ID 9)", COFF::RID_Accelerator},<br>
+    {"kRT_RCDATA (ID 10)", COFF::RID_RCData},<br>
+    {"kRT_MESSAGETABLE (ID 11)", COFF::RID_MessageTable},<br>
+    {"kRT_GROUP_CURSOR (ID 12)", COFF::RID_Group_Cursor},<br>
+    {"kRT_GROUP_ICON (ID 14)", COFF::RID_Group_Icon},<br>
+    {"kRT_VERSION (ID 16)", COFF::RID_Version},<br>
+    {"kRT_DLGINCLUDE (ID 17)", COFF::RID_DLGInclude},<br>
+    {"kRT_PLUGPLAY (ID 19)", COFF::RID_PlugPlay},<br>
+    {"kRT_VXD (ID 20)", COFF::RID_VXD},<br>
+    {"kRT_ANICURSOR (ID 21)", COFF::RID_AniCursor},<br>
+    {"kRT_ANIICON (ID 22)", COFF::RID_AniIcon},<br>
+    {"kRT_HTML (ID 23)", COFF::RID_HTML},<br>
+    {"kRT_MANIFEST (ID 24)", COFF::RID_Manifest}};<br>
+<br>
 template <typename T><br>
 static std::error_code getSymbolAuxData(const COFFObjectFile *Obj,<br>
                                         COFFSymbolRef Symbol,<br>
@@ -1503,18 +1533,73 @@ void COFFDumper::printCOFFResources<wbr>() {<br>
     error(S.getContents(Ref));<br>
<br>
     if ((Name == ".rsrc") || (Name == ".rsrc$01")) {<br>
-      auto Table =<br>
-          reinterpret_cast<const coff_resource_dir_table *>(Ref.data());<br>
-      char FormattedTime[20];<br>
-      time_t TDS = time_t(Table->TimeDateStamp);<br>
-      strftime(FormattedTime, sizeof(FormattedTime), "%Y-%m-%d %H:%M:%S",<br>
-               gmtime(&TDS));<br>
-      W.printHex("Time/Date Stamp", FormattedTime, Table->TimeDateStamp);<br>
+      ResourceSectionRef RSF(Ref);<br>
+      auto &BaseTable = unwrapOrError(RSF.getBaseTable<wbr>());<br>
+      printResourceDirectoryTable(RS<wbr>F, BaseTable, "Type");<br>
+    }<br>
+    if (opts::SectionData)<br>
+      W.printBinaryBlock(Name.str() + " Data", Ref);<br>
+  }<br>
+}<br>
+<br>
+void COFFDumper::printResourceDirec<wbr>toryTable(<br>
+    ResourceSectionRef RSF, const coff_resource_dir_table &Table,<br>
+    StringRef Level) {<br>
+  W.printNumber("String Name Entries", Table.NumberOfNameEntries);<br>
+  W.printNumber("ID Entries", Table.NumberOfIDEntries);<br>
+<br>
+  char FormattedTime[20] = {};<br>
+  time_t TDS = time_t(Table.TimeDateStamp);<br>
+  strftime(FormattedTime, 20, "%Y-%m-%d %H:%M:%S", gmtime(&TDS));<br>
+<br>
+  // Iterate through level in resource directory tree.<br>
+  for (int i = 0; i < Table.NumberOfNameEntries + Table.NumberOfIDEntries;<br>
+       i++) {<br>
+    auto Entry = unwrapOrError(getResourceDirec<wbr>toryTableEntry(Table, i));<br>
+    StringRef Name;<br>
+    SmallString<20> IDStr;<br>
+    raw_svector_ostream OS(IDStr);<br>
+    if (i < Table.NumberOfNameEntries) {<br>
+      StringRef EntryNameString = unwrapOrError(RSF.getEntryName<wbr>String(Entry));<br>
+      OS << ": ";<br>
+      OS << EntryNameString.str();<br>
+    } else {<br>
+      if (Level == "Type") {<br>
+        ScopedPrinter Printer(OS);<br>
+        Printer.printEnum("", <a href="http://Entry.Identifier.ID" rel="noreferrer" target="_blank">Entry.Identifier.ID</a>,<br>
+                          makeArrayRef(ResourceTypeNames<wbr>));<br>
+        IDStr = IDStr.slice(0, IDStr.find_first_of(")", 0) + 1);<br>
+      } else {<br>
+        OS << ": (ID " << <a href="http://Entry.Identifier.ID" rel="noreferrer" target="_blank">Entry.Identifier.ID</a> << ")";<br>
+      }<br>
+    }<br>
+    Name = StringRef(IDStr);<br>
+    ListScope ResourceType(W, Level.str() + Name.str());<br>
+    if (Entry.Offset.isSubDir()) {<br>
+      StringRef NextLevel;<br>
+      if (Level == "Name")<br>
+        NextLevel = "Language";<br>
+      else<br>
+        NextLevel = "Name";<br>
+      auto &NextTable = unwrapOrError(RSF.getEntrySubD<wbr>ir(Entry));<br>
+      printResourceDirectoryTable(RS<wbr>F, NextTable, NextLevel);<br>
+    } else {<br>
+      W.printHex("Time/Date Stamp", FormattedTime, Table.TimeDateStamp);<br>
+      W.printNumber("Major Version", Table.MajorVersion);<br>
+      W.printNumber("Minor Version", Table.MinorVersion);<br>
     }<br>
-    W.printBinaryBlock(Name.str() + " Data", Ref);<br>
   }<br>
 }<br>
<br>
+ErrorOr<const coff_resource_dir_entry &><br>
+COFFDumper::getResourceDirect<wbr>oryTableEntry(const coff_resource_dir_table &Table,<br>
+                                           uint32_t Index) {<br>
+  if (Index >= Table.NumberOfNameEntries + Table.NumberOfIDEntries)<br>
+    return object_error::parse_failed;<br>
+  auto TablePtr = reinterpret_cast<const coff_resource_dir_entry *>(&Table + 1);<br>
+  return TablePtr[Index];<br>
+}<br>
+<br>
 void COFFDumper::printStackMap() const {<br>
   object::SectionRef StackMapSection;<br>
   for (auto Sec : Obj->sections()) {<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
<br>
</blockquote>
<br>
<br></div></div><span class="HOEnZb"><font color="#888888">
-- <br>
<br>
-Bill Seurer<br>
<br>
</font></span></blockquote></div><br></div>