<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 12, 2016 at 11:21 AM, Chris Bieneman 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: cbieneman<br>
Date: Thu May 12 13:21:09 2016<br>
New Revision: 269320<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=269320&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=269320&view=rev</a><br>
Log:<br>
[yaml2macho] Handle mach_header_64 reserved field<br>
<br>
I've added the reserved field as an "optional" in YAML, but I've added asserts in the yaml2macho code to enforce that the field is present in mach_header_64, but not in mach_header.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h<br>
    llvm/trunk/lib/ObjectYAML/MachOYAML.cpp<br>
    llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml<br>
    llvm/trunk/tools/yaml2obj/yaml2macho.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=269320&r1=269319&r2=269320&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=269320&r1=269319&r2=269320&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h (original)<br>
+++ llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h Thu May 12 13:21:09 2016<br>
@@ -30,7 +30,7 @@ struct FileHeader {<br>
   uint32_t ncmds;<br>
   uint32_t sizeofcmds;<br>
   llvm::yaml::Hex32 flags;<br>
-  // TODO: Need to handle the reserved field in mach_header_64<br>
+  llvm::yaml::Hex32 reserved;<br>
 };<br>
<br>
 struct Object {<br>
<br>
Modified: llvm/trunk/lib/ObjectYAML/MachOYAML.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/MachOYAML.cpp?rev=269320&r1=269319&r2=269320&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/MachOYAML.cpp?rev=269320&r1=269319&r2=269320&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ObjectYAML/MachOYAML.cpp (original)<br>
+++ llvm/trunk/lib/ObjectYAML/MachOYAML.cpp Thu May 12 13:21:09 2016<br>
@@ -27,6 +27,8 @@ void MappingTraits<MachOYAML::FileHeader<br>
   IO.mapRequired("ncmds", FileHdr.ncmds);<br>
   IO.mapRequired("sizeofcmds", FileHdr.sizeofcmds);<br>
   IO.mapRequired("flags", FileHdr.flags);<br>
+  IO.mapOptional("reserved", FileHdr.reserved,<br>
+                 static_cast<llvm::yaml::Hex32>(0xDEADBEEFu));<br>
 }<br>
<br>
 void MappingTraits<MachOYAML::Object>::mapping(IO &IO,<br>
<br>
Modified: llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml?rev=269320&r1=269319&r2=269320&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml?rev=269320&r1=269319&r2=269320&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml (original)<br>
+++ llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml Thu May 12 13:21:09 2016<br>
@@ -9,6 +9,7 @@ FileHeader:<br>
   ncmds:           0<br>
   sizeofcmds:      0<br>
   flags:           0x00218085<br>
+  reserved:        0x00000000<br>
 ...<br>
<br>
 # CHECK: --- !mach-o<br>
@@ -20,4 +21,5 @@ FileHeader:<br>
 # CHECK:   ncmds:           0<br>
 # CHECK:   sizeofcmds:      0<br>
 # CHECK:   flags:           0x00218085<br>
+# CHECK:   reserved:        0x00000000<br>
 # CHECK: ...<br>
<br>
Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=269320&r1=269319&r2=269320&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=269320&r1=269319&r2=269320&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)<br>
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Thu May 12 13:21:09 2016<br>
@@ -30,6 +30,10 @@ public:<br>
               Obj.Header.magic == MachO::MH_CIGAM_64;<br>
     memset(reinterpret_cast<void *>(&Header64), 0,<br>
            sizeof(MachO::mach_header_64));<br>
+    assert((is64Bit || Obj.Header.reserved == 0xDEADBEEFu) &&<br>
+           "32-bit MachO has reserved in header");<br>
+    assert((!is64Bit || Obj.Header.reserved != 0xDEADBEEFu) &&<br>
+           "64-bit MachO has missing reserved in header");<br>
   }<br>
<br>
   Error writeMachO(raw_ostream &OS);<br>
@@ -60,9 +64,11 @@ Error MachOWriter::writeHeader(raw_ostre<br>
   Header.ncmds = Obj.Header.ncmds;<br>
   Header.sizeofcmds = Obj.Header.sizeofcmds;<br>
   Header.flags = Obj.Header.flags;<br>
+  Header64.reserved = Obj.Header.reserved;<br></blockquote><div><br></div><div>Why not just use a single Header64 object instead of the union? That avoids this dubious stuff where you're reading from the non-active part of the union below. I.e. you write into Header64, then try to read from Header after that without having all the fields of Header64.</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
-  if (is64Bit)<br>
+  if (is64Bit) {<br>
     OS.write((const char *)&Header64, sizeof(MachO::mach_header_64));<br>
+  }<br>
   else<br>
     OS.write((const char *)&Header, sizeof(MachO::mach_header));<br>
<br>
<br>
<br>
_______________________________________________<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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>