<div dir="auto">Revert to this patch incoming</div><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">hubert.reinterpretcast@gmail.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/<wbr>sanitizer-x86_64-linux/build/<wbr>llvm/lib/Object/<wbr>WindowsResource.cpp:21:19: error: variable 'ResourceMagic' is not needed and will not be emitted [-Werror,-Wunneeded-internal-<wbr>declaration]<br>static const char ResourceMagic[] = {<br> ^<br>/mnt/b/sanitizer-buildbot1/<wbr>sanitizer-x86_64-linux/build/<wbr>llvm/lib/Object/<wbr>WindowsResource.cpp:25:19: error: variable 'NullEntry' is not needed and will not be emitted [-Werror,-Wunneeded-internal-<wbr>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" target="_blank">http://lab.llvm.org:8011/<wbr>builders/sanitizer-x86_64-<wbr>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-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=<wbr>303480&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?<wbr>rev=303480&r1=303479&r2=<wbr>303480&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=<wbr>diff</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}/<wbr>llvm/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&<wbr>view=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=<wbr>diff</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>