<div dir="ltr"><div>I think the issue got addressed by <a href="https://reviews.llvm.org/rL303483">https://reviews.llvm.org/rL303483</a>.<br><br></div>-- HT<br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, May 20, 2017 at 10:23 AM, Eric Beckmann <span dir="ltr"><<a href="mailto:ecbeckmann@google.com" target="_blank">ecbeckmann@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Revert to this patch incoming</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On May 19, 2017 8:19 PM, "Hubert Tong" <<a href="mailto:hubert.reinterpretcast@gmail.com" target="_blank">hubert.reinterpretcast@gmail.<wbr>com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">This seems to be the cause of:<br>/mnt/b/sanitizer-buildbot1/san<wbr>itizer-x86_64-linux/build/llvm<wbr>/lib/Object/WindowsResource.<wbr>cpp:21:19: error: variable 'ResourceMagic' is not needed and will not be emitted [-Werror,-Wunneeded-internal-d<wbr>eclaration]<br>static const char ResourceMagic[] = {<br>                  ^<br>/mnt/b/sanitizer-buildbot1/san<wbr>itizer-x86_64-linux/build/llvm<wbr>/lib/Object/WindowsResource.<wbr>cpp:25:19: error: variable 'NullEntry' is not needed and will not be emitted [-Werror,-Wunneeded-internal-d<wbr>eclaration]<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" target="_blank">http://lab.llvm.org:8011/build<wbr>ers/sanitizer-x86_64-linux/<wbr>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-pr<wbr>oject?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/D3318<wbr>0</a><br>
<br>
Added:<br>
    llvm/trunk/include/llvm/Object<wbr>/WindowsResource.h<br>
    llvm/trunk/lib/Object/WindowsR<wbr>esource.cpp<br>
    llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/<br>
    llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/cursor_small.bmp   (with props)<br>
    llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/okay_small.bmp   (with props)<br>
    llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/test_resource.rc<br>
    llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/test_resource.res   (with props)<br>
    llvm/trunk/test/tools/llvm-cvt<wbr>res/resource.test<br>
Modified:<br>
    llvm/trunk/include/llvm/Object<wbr>/Binary.h<br>
    llvm/trunk/include/llvm/Suppor<wbr>t/BinaryStreamReader.h<br>
    llvm/trunk/include/llvm/Suppor<wbr>t/FileSystem.h<br>
    llvm/trunk/lib/Object/Binary.c<wbr>pp<br>
    llvm/trunk/lib/Object/CMakeLis<wbr>ts.txt<br>
    llvm/trunk/tools/llvm-cvtres/C<wbr>MakeLists.txt<br>
    llvm/trunk/tools/llvm-cvtres/l<wbr>lvm-cvtres.cpp<br>
    llvm/trunk/tools/llvm-cvtres/l<wbr>lvm-cvtres.h<br>
<br>
Modified: llvm/trunk/include/llvm/Object<wbr>/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-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Object/Binary.h?rev=303480&r1=<wbr>303479&r2=303480&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/Object<wbr>/Binary.h (original)<br>
+++ llvm/trunk/include/llvm/Object<wbr>/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/Object<wbr>/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-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Object/WindowsResource.h?rev=3<wbr>03480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/Object<wbr>/WindowsResource.h (added)<br>
+++ llvm/trunk/include/llvm/Object<wbr>/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/libra<wbr>ry/windows/desktop/ms648007(v=<wbr>vs.85).aspx</a><br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>---------------===//<br>
+<br>
+#ifndef LLVM_INCLUDE_LLVM_OBJECT_RESFI<wbr>LE_H<br>
+#define LLVM_INCLUDE_LLVM_OBJECT_RESFI<wbr>LE_H<br>
+<br>
+#include "llvm/ADT/ArrayRef.h"<br>
+#include "llvm/Object/Binary.h"<br>
+#include "llvm/Support/BinaryByteStream<wbr>.h"<br>
+#include "llvm/Support/BinaryStreamRead<wbr>er.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(BinaryStreamR<wbr>ef 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<Windo<wbr>wsResource>><br>
+  createWindowsResource(MemoryBu<wbr>fferRef Source);<br>
+<br>
+private:<br>
+  friend class ResourceEntryRef;<br>
+<br>
+  WindowsResource(MemoryBufferRe<wbr>f Source);<br>
+<br>
+  BinaryByteStream BBS;<br>
+};<br>
+<br>
+} // namespace object<br>
+} // namespace llvm<br>
+<br>
+#endif<br>
<br>
Modified: llvm/trunk/include/llvm/Suppor<wbr>t/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-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Support/BinaryStreamReader.h?r<wbr>ev=303480&r1=303479&r2=303480&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/Suppor<wbr>t/BinaryStreamReader.h (original)<br>
+++ llvm/trunk/include/llvm/Suppor<wbr>t/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/Suppor<wbr>t/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-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Support/FileSystem.h?rev=30348<wbr>0&r1=303479&r2=303480&view=dif<wbr>f</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/Suppor<wbr>t/FileSystem.h (original)<br>
+++ llvm/trunk/include/llvm/Suppor<wbr>t/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.c<wbr>pp<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-pr<wbr>oject/llvm/trunk/lib/Object/Bi<wbr>nary.cpp?rev=303480&r1=303479&<wbr>r2=303480&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/Binary.c<wbr>pp (original)<br>
+++ llvm/trunk/lib/Object/Binary.c<wbr>pp 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.h<wbr>"<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<Binar<wbr>y>> object<br>
       return ObjectFile::createSymbolicFile<wbr>(Buffer, Type, Context);<br>
     case sys::fs::file_magic::macho_uni<wbr>versal_binary:<br>
       return MachOUniversalBinary::create(B<wbr>uffer);<br>
+    case sys::fs::file_magic::windows_r<wbr>esource:<br>
+      return WindowsResource::createWindows<wbr>Resource(Buffer);<br>
     case sys::fs::file_magic::unknown:<br>
     case sys::fs::file_magic::coff_cl_g<wbr>l_object:<br>
-    case sys::fs::file_magic::windows_r<wbr>esource:<br>
       // Unrecognized object file format.<br>
       return errorCodeToError(object_error:<wbr>:invalid_file_type);<br>
   }<br>
<br>
Modified: llvm/trunk/lib/Object/CMakeLis<wbr>ts.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-pr<wbr>oject/llvm/trunk/lib/Object/CM<wbr>akeLists.txt?rev=303480&r1=303<wbr>479&r2=303480&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/CMakeLis<wbr>ts.txt (original)<br>
+++ llvm/trunk/lib/Object/CMakeLis<wbr>ts.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/WindowsR<wbr>esource.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-pr<wbr>oject/llvm/trunk/lib/Object/Wi<wbr>ndowsResource.cpp?rev=303480&v<wbr>iew=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/WindowsR<wbr>esource.cpp (added)<br>
+++ llvm/trunk/lib/Object/WindowsR<wbr>esource.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.h<wbr>"<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::WindowsResou<wbr>rce(MemoryBufferRef Source)<br>
+    : Binary(Binary::ID_WinRes, Source) {<br>
+  size_t LeadingSize = sizeof(ResourceMagic) + sizeof(NullEntry);<br>
+  BBS = BinaryByteStream(Data.getBuffe<wbr>r().drop_front(LeadingSize),<br>
+                         support::little);<br>
+}<br>
+<br>
+WindowsResource::~WindowsReso<wbr>urce() = default;<br>
+<br>
+Expected<std::unique_ptr<Wind<wbr>owsResource>><br>
+WindowsResource::createWindow<wbr>sResource(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_typ<wbr>e);<br>
+  std::unique_ptr<WindowsResourc<wbr>e> 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(BinaryStreamR<wbr>ef(BBS), this, Err);<br>
+  if (Err)<br>
+    return std::move(Err);<br>
+  return Ref;<br>
+}<br>
+<br>
+ResourceEntryRef::ResourceEnt<wbr>ryRef(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)<wbr>;<br>
+}<br>
+<br>
+Error ResourceEntryRef::moveNext(boo<wbr>l &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.readInt<wbr>eger(DataSize));<br>
+  uint32_t HeaderSize;<br>
+  RETURN_IF_ERROR(Reader.readInt<wbr>eger(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(HeaderByt<wbr>es, HeaderSize - 2 * sizeof(uint32_t)));<br>
+  RETURN_IF_ERROR(Reader.readStr<wbr>eamRef(DataBytes, DataSize));<br>
+  RETURN_IF_ERROR(Reader.padToAl<wbr>ignment(sizeof(uint32_t)));<br>
+  return Error::success();<br>
+}<br>
+<br>
+} // namespace object<br>
+} // namespace llvm<br>
<br>
Added: llvm/trunk/test/tools/llvm-cvt<wbr>res/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-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-cvtres/Inputs/cursor_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-cvt<wbr>res/Inputs/cursor_small.bmp<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-cvt<wbr>res/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-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-cvtres/Inputs/okay_small.bm<wbr>p?rev=303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/okay_small.bmp<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-cvt<wbr>res/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-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-cvtres/Inputs/test_resource<wbr>.rc?rev=303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/test_resource.rc (added)<br>
+++ llvm/trunk/test/tools/llvm-cvt<wbr>res/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-cvt<wbr>res/Inputs/test_resource.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-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-cvtres/Inputs/test_resource<wbr>.res?rev=303480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-cvt<wbr>res/Inputs/test_resource.res<br>
------------------------------<wbr>------------------------------<wbr>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: llvm/trunk/test/tools/llvm-cvt<wbr>res/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-pr<wbr>oject/llvm/trunk/test/tools/ll<wbr>vm-cvtres/resource.test?rev=30<wbr>3480&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-cvt<wbr>res/resource.test (added)<br>
+++ llvm/trunk/test/tools/llvm-cvt<wbr>res/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/C<wbr>MakeLists.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-pr<wbr>oject/llvm/trunk/tools/llvm-cv<wbr>tres/CMakeLists.txt?rev=303480<wbr>&r1=303479&r2=303480&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-cvtres/C<wbr>MakeLists.txt (original)<br>
+++ llvm/trunk/tools/llvm-cvtres/C<wbr>MakeLists.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/l<wbr>lvm-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-pr<wbr>oject/llvm/trunk/tools/llvm-cv<wbr>tres/llvm-cvtres.cpp?rev=30348<wbr>0&r1=303479&r2=303480&view=dif<wbr>f</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-cvtres/l<wbr>lvm-cvtres.cpp (original)<br>
+++ llvm/trunk/tools/llvm-cvtres/l<wbr>lvm-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.h<wbr>"<br>
 #include "llvm/Option/Arg.h"<br>
 #include "llvm/Option/ArgList.h"<br>
 #include "llvm/Option/Option.h"<br>
+#include "llvm/Support/BinaryStreamErro<wbr>r.h"<br>
 #include "llvm/Support/Error.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
+#include "llvm/Support/Path.h"<br>
 #include "llvm/Support/PrettyStackTrace<wbr>.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::PrintStackTraceOnErrorSi<wbr>gnal(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>(MachineS<wbr>tring)<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_exten<wbr>sion(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.t<wbr>akeError()));<br>
+<br>
+    Binary &Binary = *BinaryOrErr.get().getBinary()<wbr>;<br>
+<br>
+    WindowsResource *RF = dyn_cast<WindowsResource>(&Bin<wbr>ary);<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/l<wbr>lvm-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-pr<wbr>oject/llvm/trunk/tools/llvm-cv<wbr>tres/llvm-cvtres.h?rev=303480&<wbr>r1=303479&r2=303480&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-cvtres/l<wbr>lvm-cvtres.h (original)<br>
+++ llvm/trunk/tools/llvm-cvtres/l<wbr>lvm-cvtres.h Fri May 19 20:49:19 2017<br>
@@ -10,4 +10,10 @@<br>
 #ifndef LLVM_TOOLS_LLVMCVTRES_LLVMCVTR<wbr>ES_H<br>
 #define LLVM_TOOLS_LLVMCVTRES_LLVMCVTR<wbr>ES_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" 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>
</blockquote></div><br></div>
</blockquote></div></div>
</div></div></blockquote></div><br></div></div>