<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>