diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/ObjectYAML/MachOYAML.h | 2 | ||||
-rw-r--r-- | llvm/lib/ObjectYAML/MachOYAML.cpp | 2 | ||||
-rw-r--r-- | llvm/test/ObjectYAML/MachO/mach_header_64.yaml | 2 | ||||
-rw-r--r-- | llvm/tools/yaml2obj/yaml2macho.cpp | 8 |
4 files changed, 12 insertions, 2 deletions
diff --git a/llvm/include/llvm/ObjectYAML/MachOYAML.h b/llvm/include/llvm/ObjectYAML/MachOYAML.h index 5eaeb58739a..00d7ab2d377 100644 --- a/llvm/include/llvm/ObjectYAML/MachOYAML.h +++ b/llvm/include/llvm/ObjectYAML/MachOYAML.h @@ -30,7 +30,7 @@ struct FileHeader { uint32_t ncmds; uint32_t sizeofcmds; llvm::yaml::Hex32 flags; - // TODO: Need to handle the reserved field in mach_header_64 + llvm::yaml::Hex32 reserved; }; struct Object { diff --git a/llvm/lib/ObjectYAML/MachOYAML.cpp b/llvm/lib/ObjectYAML/MachOYAML.cpp index c33f54f9c50..d54140b6794 100644 --- a/llvm/lib/ObjectYAML/MachOYAML.cpp +++ b/llvm/lib/ObjectYAML/MachOYAML.cpp @@ -27,6 +27,8 @@ void MappingTraits<MachOYAML::FileHeader>::mapping( IO.mapRequired("ncmds", FileHdr.ncmds); IO.mapRequired("sizeofcmds", FileHdr.sizeofcmds); IO.mapRequired("flags", FileHdr.flags); + IO.mapOptional("reserved", FileHdr.reserved, + static_cast<llvm::yaml::Hex32>(0xDEADBEEFu)); } void MappingTraits<MachOYAML::Object>::mapping(IO &IO, diff --git a/llvm/test/ObjectYAML/MachO/mach_header_64.yaml b/llvm/test/ObjectYAML/MachO/mach_header_64.yaml index a9ea82e1a84..a76997004ea 100644 --- a/llvm/test/ObjectYAML/MachO/mach_header_64.yaml +++ b/llvm/test/ObjectYAML/MachO/mach_header_64.yaml @@ -9,6 +9,7 @@ FileHeader: ncmds: 0 sizeofcmds: 0 flags: 0x00218085 + reserved: 0x00000000 ... # CHECK: --- !mach-o @@ -20,4 +21,5 @@ FileHeader: # CHECK: ncmds: 0 # CHECK: sizeofcmds: 0 # CHECK: flags: 0x00218085 +# CHECK: reserved: 0x00000000 # CHECK: ... diff --git a/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp index d5d9642916f..8437475a411 100644 --- a/llvm/tools/yaml2obj/yaml2macho.cpp +++ b/llvm/tools/yaml2obj/yaml2macho.cpp @@ -30,6 +30,10 @@ public: Obj.Header.magic == MachO::MH_CIGAM_64; memset(reinterpret_cast<void *>(&Header64), 0, sizeof(MachO::mach_header_64)); + assert((is64Bit || Obj.Header.reserved == 0xDEADBEEFu) && + "32-bit MachO has reserved in header"); + assert((!is64Bit || Obj.Header.reserved != 0xDEADBEEFu) && + "64-bit MachO has missing reserved in header"); } Error writeMachO(raw_ostream &OS); @@ -60,9 +64,11 @@ Error MachOWriter::writeHeader(raw_ostream &OS) { Header.ncmds = Obj.Header.ncmds; Header.sizeofcmds = Obj.Header.sizeofcmds; Header.flags = Obj.Header.flags; + Header64.reserved = Obj.Header.reserved; - if (is64Bit) + if (is64Bit) { OS.write((const char *)&Header64, sizeof(MachO::mach_header_64)); + } else OS.write((const char *)&Header, sizeof(MachO::mach_header)); |