<div dir="ltr">This seems to be the cause of:<br>/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Object/WindowsResource.cpp:21:19: error: variable 'ResourceMagic' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration]<br>static const char ResourceMagic[] = {<br>                  ^<br>/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Object/WindowsResource.cpp:25:19: error: variable 'NullEntry' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration]<br>static const char NullEntry[16] = {'\0'};<br>                  ^<br>2 errors generated.<br><br>More info:<br><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/2003">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/2003</a></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 19, 2017 at 9:49 PM, Eric Beckmann via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ecbeckmann<br>
Date: Fri May 19 20:49:19 2017<br>
New Revision: 303480<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=303480&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=303480&view=rev</a><br>
Log:<br>
Add functionality to cvtres to parse all entries in res file.<br>
<br>
Summary: Added the new modules in the Object/ folder.  Updated the<br>
llvm-cvtres interface as well, and added additional tests.<br>
<br>
Subscribers: llvm-commits, mgorny<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D33180" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D33180</a><br>
<br>
Added:<br>
    llvm/trunk/include/llvm/<wbr>Object/WindowsResource.h<br>
    llvm/trunk/lib/Object/<wbr>WindowsResource.cpp<br>
    llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/<br>
    llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/cursor_small.bmp   (with props)<br>
    llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/okay_small.bmp   (with props)<br>
    llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/test_resource.rc<br>
    llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/test_resource.<wbr>res   (with props)<br>
    llvm/trunk/test/tools/llvm-<wbr>cvtres/resource.test<br>
Modified:<br>
    llvm/trunk/include/llvm/<wbr>Object/Binary.h<br>
    llvm/trunk/include/llvm/<wbr>Support/BinaryStreamReader.h<br>
    llvm/trunk/include/llvm/<wbr>Support/FileSystem.h<br>
    llvm/trunk/lib/Object/Binary.<wbr>cpp<br>
    llvm/trunk/lib/Object/<wbr>CMakeLists.txt<br>
    llvm/trunk/tools/llvm-cvtres/<wbr>CMakeLists.txt<br>
    llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.cpp<br>
    llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.h<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>Object/Binary.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Binary.h?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Object/Binary.h?rev=<wbr>303480&r1=303479&r2=303480&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Object/Binary.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>Object/Binary.h Fri May 19 20:49:19 2017<br>
@@ -57,6 +57,8 @@ protected:<br>
     ID_MachO64L, // MachO 64-bit, little endian<br>
     ID_MachO64B, // MachO 64-bit, big endian<br>
<br>
+    ID_WinRes, // Windows resource (.res) file.<br>
+<br>
     ID_Wasm,<br>
<br>
     ID_EndObjects<br>
@@ -132,6 +134,8 @@ public:<br>
              TypeID == ID_MachO32B || TypeID == ID_MachO64B);<br>
   }<br>
<br>
+  bool isWinRes() const { return TypeID == ID_WinRes; }<br>
+<br>
   Triple::ObjectFormatType getTripleObjectFormat() const {<br>
     if (isCOFF())<br>
       return Triple::COFF;<br>
<br>
Added: llvm/trunk/include/llvm/<wbr>Object/WindowsResource.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/WindowsResource.h?rev=303480&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Object/WindowsResource.h?<wbr>rev=303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Object/WindowsResource.h (added)<br>
+++ llvm/trunk/include/llvm/<wbr>Object/WindowsResource.h Fri May 19 20:49:19 2017<br>
@@ -0,0 +1,82 @@<br>
+//===-- WindowsResource.h ------------------------------<wbr>---------*- C++-*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>---------------===//<br>
+//<br>
+// This file declares the .res file class.  .res files are intermediate<br>
+// products of the typical resource-compilation process on Windows.  This<br>
+// process is as follows:<br>
+//<br>
+// .rc file(s) ---(rc.exe)---> .res file(s) ---(cvtres.exe)---> COFF file<br>
+//<br>
+// .rc files are human-readable scripts that list all resources a program uses.<br>
+//<br>
+// They are compiled into .res files, which are a list of the resources in<br>
+// binary form.<br>
+//<br>
+// Finally the data stored in the .res is compiled into a COFF file, where it<br>
+// is organized in a directory tree structure for optimized access by the<br>
+// program during runtime.<br>
+//<br>
+// Ref: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms648007(v=vs.85).aspx" rel="noreferrer" target="_blank">msdn.microsoft.com/en-us/<wbr>library/windows/desktop/<wbr>ms648007(v=vs.85).aspx</a><br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>---------------===//<br>
+<br>
+#ifndef LLVM_INCLUDE_LLVM_OBJECT_<wbr>RESFILE_H<br>
+#define LLVM_INCLUDE_LLVM_OBJECT_<wbr>RESFILE_H<br>
+<br>
+#include "llvm/ADT/ArrayRef.h"<br>
+#include "llvm/Object/Binary.h"<br>
+#include "llvm/Support/<wbr>BinaryByteStream.h"<br>
+#include "llvm/Support/<wbr>BinaryStreamReader.h"<br>
+#include "llvm/Support/Endian.h"<br>
+#include "llvm/Support/Error.h"<br>
+<br>
+namespace llvm {<br>
+namespace object {<br>
+<br>
+class WindowsResource;<br>
+<br>
+class ResourceEntryRef {<br>
+public:<br>
+  Error moveNext(bool &End);<br>
+<br>
+private:<br>
+  friend class WindowsResource;<br>
+<br>
+  ResourceEntryRef(<wbr>BinaryStreamRef Ref, const WindowsResource *Owner,<br>
+                   Error &Err);<br>
+  Error loadNext();<br>
+<br>
+  BinaryStreamReader Reader;<br>
+  BinaryStreamRef HeaderBytes;<br>
+  BinaryStreamRef DataBytes;<br>
+  const WindowsResource *OwningRes = nullptr;<br>
+};<br>
+<br>
+class WindowsResource : public Binary {<br>
+public:<br>
+  ~WindowsResource() override;<br>
+  Expected<ResourceEntryRef> getHeadEntry();<br>
+<br>
+  static bool classof(const Binary *V) { return V->isWinRes(); }<br>
+<br>
+  static Expected<std::unique_ptr<<wbr>WindowsResource>><br>
+  createWindowsResource(<wbr>MemoryBufferRef Source);<br>
+<br>
+private:<br>
+  friend class ResourceEntryRef;<br>
+<br>
+  WindowsResource(<wbr>MemoryBufferRef Source);<br>
+<br>
+  BinaryByteStream BBS;<br>
+};<br>
+<br>
+} // namespace object<br>
+} // namespace llvm<br>
+<br>
+#endif<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>Support/BinaryStreamReader.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/BinaryStreamReader.h?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Support/<wbr>BinaryStreamReader.h?rev=<wbr>303480&r1=303479&r2=303480&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Support/BinaryStreamReader.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>Support/BinaryStreamReader.h Fri May 19 20:49:19 2017<br>
@@ -16,7 +16,6 @@<br>
 #include "llvm/Support/BinaryStreamRef.<wbr>h"<br>
 #include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/Error.h"<br>
-#include "llvm/Support/MathExtras.h"<br>
 #include "llvm/Support/type_traits.h"<br>
<br>
 #include <string><br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>Support/FileSystem.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FileSystem.h?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Support/FileSystem.h?rev=<wbr>303480&r1=303479&r2=303480&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Support/FileSystem.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>Support/FileSystem.h Fri May 19 20:49:19 2017<br>
@@ -261,7 +261,7 @@ struct file_magic {<br>
     coff_object,              ///< COFF object file<br>
     coff_import_library,      ///< COFF import library<br>
     pecoff_executable,        ///< PECOFF executable file<br>
-    windows_resource,         ///< Windows compiled resource file (.rc)<br>
+    windows_resource,         ///< Windows compiled resource file (.res)<br>
     wasm_object               ///< WebAssembly Object file<br>
   };<br>
<br>
<br>
Modified: llvm/trunk/lib/Object/Binary.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Binary.cpp?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Object/<wbr>Binary.cpp?rev=303480&r1=<wbr>303479&r2=303480&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/Binary.<wbr>cpp (original)<br>
+++ llvm/trunk/lib/Object/Binary.<wbr>cpp Fri May 19 20:49:19 2017<br>
@@ -17,6 +17,7 @@<br>
 #include "llvm/Object/Error.h"<br>
 #include "llvm/Object/MachOUniversal.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/Object/WindowsResource.<wbr>h"<br>
 #include "llvm/Support/Error.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include "llvm/Support/ErrorOr.h"<br>
@@ -71,9 +72,10 @@ Expected<std::unique_ptr<<wbr>Binary>> object<br>
       return ObjectFile::<wbr>createSymbolicFile(Buffer, Type, Context);<br>
     case sys::fs::file_magic::macho_<wbr>universal_binary:<br>
       return MachOUniversalBinary::create(<wbr>Buffer);<br>
+    case sys::fs::file_magic::windows_<wbr>resource:<br>
+      return WindowsResource::<wbr>createWindowsResource(Buffer);<br>
     case sys::fs::file_magic::unknown:<br>
     case sys::fs::file_magic::coff_cl_<wbr>gl_object:<br>
-    case sys::fs::file_magic::windows_<wbr>resource:<br>
       // Unrecognized object file format.<br>
       return errorCodeToError(object_error:<wbr>:invalid_file_type);<br>
   }<br>
<br>
Modified: llvm/trunk/lib/Object/<wbr>CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/CMakeLists.txt?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Object/<wbr>CMakeLists.txt?rev=303480&r1=<wbr>303479&r2=303480&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/<wbr>CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/Object/<wbr>CMakeLists.txt Fri May 19 20:49:19 2017<br>
@@ -18,6 +18,7 @@ add_llvm_library(LLVMObject<br>
   SymbolicFile.cpp<br>
   SymbolSize.cpp<br>
   WasmObjectFile.cpp<br>
+  WindowsResource.cpp<br>
<br>
   ADDITIONAL_HEADER_DIRS<br>
   ${LLVM_MAIN_INCLUDE_DIR}/llvm/<wbr>Object<br>
<br>
Added: llvm/trunk/lib/Object/<wbr>WindowsResource.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/WindowsResource.cpp?rev=303480&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Object/<wbr>WindowsResource.cpp?rev=<wbr>303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/<wbr>WindowsResource.cpp (added)<br>
+++ llvm/trunk/lib/Object/<wbr>WindowsResource.cpp Fri May 19 20:49:19 2017<br>
@@ -0,0 +1,92 @@<br>
+//===-- WindowsResource.cpp ------------------------------<wbr>-------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+// This file implements the .res file class.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#include "llvm/Object/WindowsResource.<wbr>h"<br>
+#include "llvm/Object/Error.h"<br>
+#include <system_error><br>
+<br>
+namespace llvm {<br>
+namespace object {<br>
+<br>
+static const char ResourceMagic[] = {<br>
+    '\0',   '\0',   '\0', '\0', '\x20', '\0',   '\0', '\0',<br>
+    '\xff', '\xff', '\0', '\0', '\xff', '\xff', '\0', '\0'};<br>
+<br>
+static const char NullEntry[16] = {'\0'};<br>
+<br>
+#define RETURN_IF_ERROR(X)                                                     \<br>
+  if (auto EC = X)                                                             \<br>
+    return EC;<br>
+<br>
+WindowsResource::<wbr>WindowsResource(<wbr>MemoryBufferRef Source)<br>
+    : Binary(Binary::ID_WinRes, Source) {<br>
+  size_t LeadingSize = sizeof(ResourceMagic) + sizeof(NullEntry);<br>
+  BBS = BinaryByteStream(Data.<wbr>getBuffer().drop_front(<wbr>LeadingSize),<br>
+                         support::little);<br>
+}<br>
+<br>
+WindowsResource::~<wbr>WindowsResource() = default;<br>
+<br>
+Expected<std::unique_ptr<<wbr>WindowsResource>><br>
+WindowsResource::<wbr>createWindowsResource(<wbr>MemoryBufferRef Source) {<br>
+  if (Source.getBufferSize() < sizeof(ResourceMagic) + sizeof(NullEntry))<br>
+    return make_error<GenericBinaryError><wbr>(<br>
+        "File too small to be a resource file",<br>
+        object_error::invalid_file_<wbr>type);<br>
+  std::unique_ptr<<wbr>WindowsResource> Ret(new WindowsResource(Source));<br>
+  return std::move(Ret);<br>
+}<br>
+<br>
+Expected<ResourceEntryRef> WindowsResource::getHeadEntry(<wbr>) {<br>
+  Error Err = Error::success();<br>
+  auto Ref = ResourceEntryRef(<wbr>BinaryStreamRef(BBS), this, Err);<br>
+  if (Err)<br>
+    return std::move(Err);<br>
+  return Ref;<br>
+}<br>
+<br>
+ResourceEntryRef::<wbr>ResourceEntryRef(<wbr>BinaryStreamRef Ref,<br>
+                                   const WindowsResource *Owner, Error &Err)<br>
+    : Reader(Ref), OwningRes(Owner) {<br>
+  if (loadNext())<br>
+    Err = make_error<GenericBinaryError><wbr>("Could not read first entry.",<br>
+                                         object_error::unexpected_eof);<br>
+}<br>
+<br>
+Error ResourceEntryRef::moveNext(<wbr>bool &End) {<br>
+  // Reached end of all the entries.<br>
+  if (Reader.bytesRemaining() == 0) {<br>
+    End = true;<br>
+    return Error::success();<br>
+  }<br>
+  RETURN_IF_ERROR(loadNext());<br>
+<br>
+  return Error::success();<br>
+}<br>
+<br>
+Error ResourceEntryRef::loadNext() {<br>
+  uint32_t DataSize;<br>
+  RETURN_IF_ERROR(Reader.<wbr>readInteger(DataSize));<br>
+  uint32_t HeaderSize;<br>
+  RETURN_IF_ERROR(Reader.<wbr>readInteger(HeaderSize));<br>
+  // The data and header size ints are themselves part of the header, so we must<br>
+  // subtract them from the size.<br>
+  RETURN_IF_ERROR(<br>
+      Reader.readStreamRef(<wbr>HeaderBytes, HeaderSize - 2 * sizeof(uint32_t)));<br>
+  RETURN_IF_ERROR(Reader.<wbr>readStreamRef(DataBytes, DataSize));<br>
+  RETURN_IF_ERROR(Reader.<wbr>padToAlignment(sizeof(uint32_<wbr>t)));<br>
+  return Error::success();<br>
+}<br>
+<br>
+} // namespace object<br>
+} // namespace llvm<br>
<br>
Added: llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/cursor_small.bmp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cvtres/Inputs/cursor_small.bmp?rev=303480&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-cvtres/Inputs/cursor_<wbr>small.bmp?rev=303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/cursor_small.bmp<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/okay_small.bmp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cvtres/Inputs/okay_small.bmp?rev=303480&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-cvtres/Inputs/okay_small.<wbr>bmp?rev=303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/okay_small.bmp<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/test_resource.rc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cvtres/Inputs/test_resource.rc?rev=303480&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-cvtres/Inputs/test_<wbr>resource.rc?rev=303480&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/test_resource.rc (added)<br>
+++ llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/test_resource.rc Fri May 19 20:49:19 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-<wbr>cvtres/Inputs/test_resource.<wbr>res<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cvtres/Inputs/test_resource.res?rev=303480&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-cvtres/Inputs/test_<wbr>resource.res?rev=303480&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-<wbr>cvtres/Inputs/test_resource.<wbr>res<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-<wbr>cvtres/resource.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cvtres/resource.test?rev=303480&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-cvtres/resource.test?rev=<wbr>303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-<wbr>cvtres/resource.test (added)<br>
+++ llvm/trunk/test/tools/llvm-<wbr>cvtres/resource.test Fri May 19 20:49:19 2017<br>
@@ -0,0 +1,7 @@<br>
+// The input was generated with the following command, using the original Windows<br>
+// rc.exe:<br>
+// > rc /fo test_resource.res /nologo test_resource.rc<br>
+<br>
+RUN: llvm-cvtres %p/Inputs/test_resource.res | FileCheck %s<br>
+<br>
+CHECK: Number of resources: 7<br>
<br>
Modified: llvm/trunk/tools/llvm-cvtres/<wbr>CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cvtres/CMakeLists.txt?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>cvtres/CMakeLists.txt?rev=<wbr>303480&r1=303479&r2=303480&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-cvtres/<wbr>CMakeLists.txt (original)<br>
+++ llvm/trunk/tools/llvm-cvtres/<wbr>CMakeLists.txt Fri May 19 20:49:19 2017<br>
@@ -1,4 +1,5 @@<br>
 set(LLVM_LINK_COMPONENTS<br>
+  Object<br>
   Option<br>
   Support<br>
   )<br>
<br>
Modified: llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cvtres/llvm-cvtres.cpp?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>cvtres/llvm-cvtres.cpp?rev=<wbr>303480&r1=303479&r2=303480&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.cpp (original)<br>
+++ llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.cpp Fri May 19 20:49:19 2017<br>
@@ -14,17 +14,23 @@<br>
<br>
 #include "llvm-cvtres.h"<br>
<br>
+#include "llvm/ADT/StringSwitch.h"<br>
+#include "llvm/Object/Binary.h"<br>
+#include "llvm/Object/WindowsResource.<wbr>h"<br>
 #include "llvm/Option/Arg.h"<br>
 #include "llvm/Option/ArgList.h"<br>
 #include "llvm/Option/Option.h"<br>
+#include "llvm/Support/<wbr>BinaryStreamError.h"<br>
 #include "llvm/Support/Error.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
+#include "llvm/Support/Path.h"<br>
 #include "llvm/Support/<wbr>PrettyStackTrace.h"<br>
 #include "llvm/Support/Process.h"<br>
 #include "llvm/Support/Signals.h"<br>
 #include "llvm/Support/raw_ostream.h"<br>
<br>
 using namespace llvm;<br>
+using namespace object;<br>
<br>
 namespace {<br>
<br>
@@ -61,6 +67,28 @@ public:<br>
 static ExitOnError ExitOnErr;<br>
 }<br>
<br>
+LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg) {<br>
+  errs() << Msg;<br>
+  exit(1);<br>
+}<br>
+<br>
+static void reportError(StringRef Input, std::error_code EC) {<br>
+  reportError(Twine(Input) + ": " + EC.message() + ".\n");<br>
+}<br>
+<br>
+void error(std::error_code EC) {<br>
+  if (!EC)<br>
+    return;<br>
+  reportError(EC.message() + ".\n");<br>
+}<br>
+<br>
+void error(Error EC) {<br>
+  if (!EC)<br>
+    return;<br>
+  handleAllErrors(std::move(EC),<br>
+                  [&](const ErrorInfoBase &EI) { reportError(EI.message()); });<br>
+}<br>
+<br>
 int main(int argc_, const char *argv_[]) {<br>
   sys::<wbr>PrintStackTraceOnErrorSignal(<wbr>argv_[0]);<br>
   PrettyStackTraceProgram X(argc_, argv_);<br>
@@ -76,11 +104,79 @@ int main(int argc_, const char *argv_[])<br>
<br>
   CvtResOptTable T;<br>
   unsigned MAI, MAC;<br>
-  ArrayRef<const char *> ArgsArr = makeArrayRef(argv_, argc_);<br>
+  ArrayRef<const char *> ArgsArr = makeArrayRef(argv_ + 1, argc_);<br>
   opt::InputArgList InputArgs = T.ParseArgs(ArgsArr, MAI, MAC);<br>
<br>
-  if (InputArgs.hasArg(OPT_HELP))<br>
+  if (InputArgs.hasArg(OPT_HELP)) {<br>
     T.PrintHelp(outs(), "cvtres", "Resource Converter", false);<br>
+    return 0;<br>
+  }<br>
+<br>
+  machine Machine;<br>
<br>
+  if (InputArgs.hasArg(OPT_MACHINE)<wbr>) {<br>
+    std::string MachineString = InputArgs.getLastArgValue(OPT_<wbr>MACHINE).upper();<br>
+    Machine = StringSwitch<machine>(<wbr>MachineString)<br>
+                  .Case("ARM", machine::ARM)<br>
+                  .Case("X64", machine::X64)<br>
+                  .Case("X86", machine::X86)<br>
+                  .Default(machine::UNKNOWN);<br>
+    if (Machine == machine::UNKNOWN)<br>
+      reportError("Unsupported machine architecture");<br>
+  } else {<br>
+    outs() << "Machine architecture not specified; assumed X64.\n";<br>
+    Machine = machine::X64;<br>
+  }<br>
+<br>
+  std::vector<std::string> InputFiles = InputArgs.getAllArgValues(OPT_<wbr>INPUT);<br>
+<br>
+  if (InputFiles.size() == 0) {<br>
+    reportError("No input file specified");<br>
+  }<br>
+<br>
+  SmallString<128> OutputFile;<br>
+<br>
+  if (InputArgs.hasArg(OPT_OUT)) {<br>
+    OutputFile = InputArgs.getLastArgValue(OPT_<wbr>OUT);<br>
+  } else {<br>
+    OutputFile = StringRef(InputFiles[0]);<br>
+    llvm::sys::path::replace_<wbr>extension(OutputFile, ".obj");<br>
+  }<br>
+<br>
+  for (const auto &File : InputFiles) {<br>
+    Expected<object::OwningBinary<<wbr>object::Binary>> BinaryOrErr =<br>
+        object::createBinary(File);<br>
+    if (!BinaryOrErr)<br>
+      reportError(File, errorToErrorCode(BinaryOrErr.<wbr>takeError()));<br>
+<br>
+    Binary &Binary = *BinaryOrErr.get().getBinary()<wbr>;<br>
+<br>
+    WindowsResource *RF = dyn_cast<WindowsResource>(&<wbr>Binary);<br>
+    if (!RF)<br>
+      reportError(File + ": unrecognized file format.\n");<br>
+<br>
+    int EntryNumber = 0;<br>
+    Expected<ResourceEntryRef> EntryOrErr = RF->getHeadEntry();<br>
+    if (!EntryOrErr)<br>
+      error(EntryOrErr.takeError());<br>
+    ResourceEntryRef Entry = EntryOrErr.get();<br>
+    bool End = false;<br>
+    while (!End) {<br>
+      error(Entry.moveNext(End));<br>
+      EntryNumber++;<br>
+    }<br>
+    outs() << "Number of resources: " << EntryNumber << "\n";<br>
+  }<br>
+  outs() << "Machine: ";<br>
+  switch (Machine) {<br>
+  case machine::ARM:<br>
+    outs() << "ARM\n";<br>
+    break;<br>
+  case machine::X86:<br>
+    outs() << "X86\n";<br>
+    break;<br>
+  default:<br>
+    outs() << "X64\n";<br>
+  }<br>
   return 0;<br>
 }<br>
<br>
Modified: llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cvtres/llvm-cvtres.h?rev=303480&r1=303479&r2=303480&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>cvtres/llvm-cvtres.h?rev=<wbr>303480&r1=303479&r2=303480&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.h (original)<br>
+++ llvm/trunk/tools/llvm-cvtres/<wbr>llvm-cvtres.h Fri May 19 20:49:19 2017<br>
@@ -10,4 +10,10 @@<br>
 #ifndef LLVM_TOOLS_LLVMCVTRES_<wbr>LLVMCVTRES_H<br>
 #define LLVM_TOOLS_LLVMCVTRES_<wbr>LLVMCVTRES_H<br>
<br>
+#include <system_error><br>
+<br>
+void error(std::error_code EC);<br>
+<br>
+enum class machine { UNKNOWN = 0, ARM, X64, X86 };<br>
+<br>
 #endif<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">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>
</blockquote></div><br></div>