[llvm] r269953 - Re-apply: [obj2yaml] [yaml2obj] Support MachO section and section_64

Mikael Holmén via llvm-commits llvm-commits at lists.llvm.org
Wed May 18 23:29:04 PDT 2016


Hi Chris,

I'm getting a compilation warning from gcc (both with 5.3.0 och 4.8.4) 
with this patch:

[766/2656] Building CXX object 
lib/ObjectYAML/CMakeFiles/LLVMObjectYAML.dir/MachOYAML.cpp.o
../lib/ObjectYAML/MachOYAML.cpp: In static member function 'static void 
llvm::yaml::MappingTraits<llvm::MachOYAML::LoadCommand>::mapping(llvm::yaml::IO&, 
llvm::MachOYAML::LoadCommand&)':
../lib/ObjectYAML/MachOYAML.cpp:102:75: warning: dereferencing 
type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
        "cmd", (MachO::LoadCommandType 
&)LoadCommand.Data.load_command_data.cmd);

I'm not sure if the warning is correct or not?

Regards,
Mikael

On 05/18/2016 06:17 PM, Chris Bieneman via llvm-commits wrote:
> Author: cbieneman
> Date: Wed May 18 11:17:23 2016
> New Revision: 269953
>
> URL: http://llvm.org/viewvc/llvm-project?rev=269953&view=rev
> Log:
> Re-apply: [obj2yaml] [yaml2obj] Support MachO section and section_64
>
> This re-applies r269845, r269846, and r269850 with an included fix for a crash reported by zturner.
>
> Added:
>      llvm/trunk/test/ObjectYAML/MachO/sections.yaml
> Modified:
>      llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
>      llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
>      llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml
>      llvm/trunk/tools/obj2yaml/macho2yaml.cpp
>      llvm/trunk/tools/yaml2obj/yaml2macho.cpp
>
> Modified: llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=269953&r1=269952&r2=269953&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h (original)
> +++ llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h Wed May 18 11:17:23 2016
> @@ -22,6 +22,21 @@
>   namespace llvm {
>   namespace MachOYAML {
>
> +struct Section {
> +  char sectname[16];
> +  char segname[16];
> +  llvm::yaml::Hex64 addr;
> +  uint64_t size;
> +  llvm::yaml::Hex32 offset;
> +  uint32_t align;
> +  llvm::yaml::Hex32 reloff;
> +  uint32_t nreloc;
> +  llvm::yaml::Hex32 flags;
> +  llvm::yaml::Hex32 reserved1;
> +  llvm::yaml::Hex32 reserved2;
> +  llvm::yaml::Hex32 reserved3;
> +};
> +
>   struct FileHeader {
>     llvm::yaml::Hex32 magic;
>     llvm::yaml::Hex32 cputype;
> @@ -36,17 +51,20 @@ struct FileHeader {
>   struct LoadCommand {
>     virtual ~LoadCommand();
>     llvm::MachO::macho_load_command Data;
> +  std::vector<Section> Sections;
>   };
>
>   struct Object {
>     FileHeader Header;
>     std::vector<LoadCommand> LoadCommands;
> +  std::vector<Section> Sections;
>   };
>
>   } // namespace llvm::MachOYAML
>   } // namespace llvm
>
>   LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand)
> +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section)
>
>   namespace llvm {
>   namespace yaml {
> @@ -63,6 +81,10 @@ template <> struct MappingTraits<MachOYA
>     static void mapping(IO &IO, MachOYAML::LoadCommand &LoadCommand);
>   };
>
> +template <> struct MappingTraits<MachOYAML::Section> {
> +  static void mapping(IO &IO, MachOYAML::Section &Section);
> +};
> +
>   #define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct)                         \
>     io.enumCase(value, #LCName, MachO::LCName);
>
>
> Modified: llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/MachOYAML.cpp?rev=269953&r1=269952&r2=269953&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ObjectYAML/MachOYAML.cpp (original)
> +++ llvm/trunk/lib/ObjectYAML/MachOYAML.cpp Wed May 18 11:17:23 2016
> @@ -15,7 +15,7 @@
>   #include "llvm/Support/Casting.h"
>   #include "llvm/Support/Format.h"
>
> -#include <string.h> // For memcpy and memset.
> +#include <string.h> // For memcpy, memset and strnlen.
>
>   namespace llvm {
>
> @@ -25,7 +25,8 @@ namespace yaml {
>
>   void ScalarTraits<char_16>::output(const char_16 &Val, void *,
>                                      llvm::raw_ostream &Out) {
> -  Out << Val;
> +  auto Len = strnlen(&Val[0], 16);
> +  Out << StringRef(&Val[0], Len);
>   }
>
>   StringRef ScalarTraits<char_16>::input(StringRef Scalar, void *, char_16 &Val) {
> @@ -110,20 +111,42 @@ void MappingTraits<MachOYAML::LoadComman
>     switch (LoadCommand.Data.load_command_data.cmd) {
>   #include "llvm/Support/MachO.def"
>     }
> +  if (LoadCommand.Data.load_command_data.cmd == MachO::LC_SEGMENT ||
> +      LoadCommand.Data.load_command_data.cmd == MachO::LC_SEGMENT_64) {
> +    IO.mapOptional("Sections", LoadCommand.Sections);
> +  }
>   }
>
>   void MappingTraits<MachO::dyld_info_command>::mapping(
>       IO &IO, MachO::dyld_info_command &LoadCommand) {
>     IO.mapRequired("rebase_off", LoadCommand.rebase_off);
>     IO.mapRequired("rebase_size", LoadCommand.rebase_size);
> -  IO.mapRequired("bind_off", LoadCommand.bind_size);
> +  IO.mapRequired("bind_off", LoadCommand.bind_off);
> +  IO.mapRequired("bind_size", LoadCommand.bind_size);
>     IO.mapRequired("weak_bind_off", LoadCommand.weak_bind_off);
>     IO.mapRequired("weak_bind_size", LoadCommand.weak_bind_size);
> -  IO.mapRequired("lazy_bind_off", LoadCommand.lazy_bind_size);
> +  IO.mapRequired("lazy_bind_off", LoadCommand.lazy_bind_off);
> +  IO.mapRequired("lazy_bind_size", LoadCommand.lazy_bind_size);
>     IO.mapRequired("export_off", LoadCommand.export_off);
>     IO.mapRequired("export_size", LoadCommand.export_size);
>   }
>
> +void MappingTraits<MachOYAML::Section>::mapping(IO &IO,
> +                                                MachOYAML::Section &Section) {
> +  IO.mapRequired("sectname", Section.sectname);
> +  IO.mapRequired("segname", Section.segname);
> +  IO.mapRequired("addr", Section.addr);
> +  IO.mapRequired("size", Section.size);
> +  IO.mapRequired("offset", Section.offset);
> +  IO.mapRequired("align", Section.align);
> +  IO.mapRequired("reloff", Section.reloff);
> +  IO.mapRequired("nreloc", Section.nreloc);
> +  IO.mapRequired("flags", Section.flags);
> +  IO.mapRequired("reserved1", Section.reserved1);
> +  IO.mapRequired("reserved2", Section.reserved2);
> +  IO.mapOptional("reserved3", Section.reserved3);
> +}
> +
>   void MappingTraits<MachO::dylib>::mapping(IO &IO, MachO::dylib &DylibStruct) {
>     IO.mapRequired("name", DylibStruct.name);
>     IO.mapRequired("timestamp", DylibStruct.timestamp);
>
> Modified: llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml?rev=269953&r1=269952&r2=269953&view=diff
> ==============================================================================
> --- llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml (original)
> +++ llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml Wed May 18 11:17:23 2016
> @@ -59,10 +59,12 @@ LoadCommands:
>       cmdsize:         48
>       rebase_off:      12288
>       rebase_size:     8
> -    bind_off:        96
> +    bind_off:        12296
> +    bind_size:       96
>       weak_bind_off:   0
>       weak_bind_size:  0
> -    lazy_bind_off:   624
> +    lazy_bind_off:   12392
> +    lazy_bind_size:  624
>       export_off:      13016
>       export_size:     48
>     - cmd:             LC_SYMTAB
> @@ -184,10 +186,12 @@ LoadCommands:
>   #CHECK:     cmdsize:         48
>   #CHECK:     rebase_off:      12288
>   #CHECK:     rebase_size:     8
> -#CHECK:     bind_off:        96
> +#CHECK:     bind_off:        12296
> +#CHECK:     bind_size:       96
>   #CHECK:     weak_bind_off:   0
>   #CHECK:     weak_bind_size:  0
> -#CHECK:     lazy_bind_off:   624
> +#CHECK:     lazy_bind_off:   12392
> +#CHECK:     lazy_bind_size:  624
>   #CHECK:     export_off:      13016
>   #CHECK:     export_size:     48
>   #CHECK:   - cmd:             LC_SYMTAB
>
> Added: llvm/trunk/test/ObjectYAML/MachO/sections.yaml
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/sections.yaml?rev=269953&view=auto
> ==============================================================================
> --- llvm/trunk/test/ObjectYAML/MachO/sections.yaml (added)
> +++ llvm/trunk/test/ObjectYAML/MachO/sections.yaml Wed May 18 11:17:23 2016
> @@ -0,0 +1,284 @@
> +# RUN: yaml2obj -format=macho %s | obj2yaml | FileCheck %s
> +
> +--- !mach-o
> +FileHeader:
> +  magic:           0xFEEDFACF
> +  cputype:         0x01000007
> +  cpusubtype:      0x80000003
> +  filetype:        0x00000002
> +  ncmds:           16
> +  sizeofcmds:      1408
> +  flags:           0x00218085
> +  reserved:        0x00000000
> +LoadCommands:
> +  - cmd:             LC_SEGMENT_64
> +    cmdsize:         72
> +    segname:         __PAGEZERO
> +    vmaddr:          0
> +    vmsize:          4294967296
> +    fileoff:         0
> +    filesize:        0
> +    maxprot:         0
> +    initprot:        0
> +    nsects:          0
> +    flags:           0
> +  - cmd:             LC_SEGMENT_64
> +    cmdsize:         552
> +    segname:         __TEXT
> +    vmaddr:          4294967296
> +    vmsize:          8192
> +    fileoff:         0
> +    filesize:        8192
> +    maxprot:         7
> +    initprot:        5
> +    nsects:          6
> +    flags:           0
> +    Sections:
> +      - sectname:        __text
> +        segname:         __TEXT
> +        addr:            0x0000000100001160
> +        size:            3099
> +        offset:          0x00001160
> +        align:           4
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x80000400
> +        reserved1:       0x00000000
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +      - sectname:        __stubs
> +        segname:         __TEXT
> +        addr:            0x0000000100001D7C
> +        size:            90
> +        offset:          0x00001D7C
> +        align:           1
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x80000408
> +        reserved1:       0x00000000
> +        reserved2:       0x00000006
> +        reserved3:       0x00000000
> +      - sectname:        __stub_helper
> +        segname:         __TEXT
> +        addr:            0x0000000100001DD8
> +        size:            166
> +        offset:          0x00001DD8
> +        align:           2
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x80000400
> +        reserved1:       0x00000000
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +      - sectname:        __gcc_except_tab
> +        segname:         __TEXT
> +        addr:            0x0000000100001E80
> +        size:            240
> +        offset:          0x00001E80
> +        align:           2
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x00000000
> +        reserved1:       0x00000000
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +      - sectname:        __cstring
> +        segname:         __TEXT
> +        addr:            0x0000000100001F70
> +        size:            15
> +        offset:          0x00001F70
> +        align:           0
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x00000002
> +        reserved1:       0x00000000
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +      - sectname:        __unwind_info
> +        segname:         __TEXT
> +        addr:            0x0000000100001F80
> +        size:            120
> +        offset:          0x00001F80
> +        align:           2
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x00000000
> +        reserved1:       0x00000000
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +  - cmd:             LC_SEGMENT_64
> +    cmdsize:         312
> +    segname:         __DATA
> +    vmaddr:          4294975488
> +    vmsize:          4096
> +    fileoff:         8192
> +    filesize:        4096
> +    maxprot:         7
> +    initprot:        3
> +    nsects:          3
> +    flags:           0
> +    Sections:
> +      - sectname:        __got
> +        segname:         __DATA
> +        addr:            0x0000000100002000
> +        size:            24
> +        offset:          0x00002000
> +        align:           3
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x00000006
> +        reserved1:       0x0000000F
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +      - sectname:        __nl_symbol_ptr
> +        segname:         __DATA
> +        addr:            0x0000000100002018
> +        size:            16
> +        offset:          0x00002018
> +        align:           3
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x00000006
> +        reserved1:       0x00000012
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +      - sectname:        __la_symbol_ptr
> +        segname:         __DATA
> +        addr:            0x0000000100002028
> +        size:            120
> +        offset:          0x00002028
> +        align:           3
> +        reloff:          0x00000000
> +        nreloc:          0
> +        flags:           0x00000007
> +        reserved1:       0x00000014
> +        reserved2:       0x00000000
> +        reserved3:       0x00000000
> +  - cmd:             LC_SEGMENT_64
> +    cmdsize:         72
> +    segname:         __LINKEDIT
> +    vmaddr:          4294979584
> +    vmsize:          4096
> +    fileoff:         12288
> +    filesize:        2508
> +    maxprot:         7
> +    initprot:        1
> +    nsects:          0
> +    flags:           0
> +  - cmd:             LC_DYLD_INFO_ONLY
> +    cmdsize:         48
> +    rebase_off:      12288
> +    rebase_size:     8
> +    bind_off:        12296
> +    bind_size:       96
> +    weak_bind_off:   0
> +    weak_bind_size:  0
> +    lazy_bind_off:   12392
> +    lazy_bind_size:  624
> +    export_off:      13016
> +    export_size:     48
> +  - cmd:             LC_SYMTAB
> +    cmdsize:         24
> +    symoff:          13080
> +    nsyms:           30
> +    stroff:          13700
> +    strsize:         1096
> +  - cmd:             LC_DYSYMTAB
> +    cmdsize:         80
> +    ilocalsym:       0
> +    nlocalsym:       9
> +    iextdefsym:      9
> +    nextdefsym:      2
> +    iundefsym:       11
> +    nundefsym:       19
> +    tocoff:          0
> +    ntoc:            0
> +    modtaboff:       0
> +    nmodtab:         0
> +    extrefsymoff:    0
> +    nextrefsyms:     0
> +    indirectsymoff:  13560
> +    nindirectsyms:   35
> +    extreloff:       0
> +    nextrel:         0
> +    locreloff:       0
> +    nlocrel:         0
> +  - cmd:             LC_LOAD_DYLINKER
> +    cmdsize:         32
> +    name:            12
> +  - cmd:             LC_UUID
> +    cmdsize:         24
> +    cmdsize:         24
> +    uuid:            461A1B28-822F-3F38-B670-645419E636F5
> +  - cmd:             LC_VERSION_MIN_MACOSX
> +    cmdsize:         16
> +    version:         658176
> +    sdk:             658176
> +  - cmd:             LC_SOURCE_VERSION
> +    cmdsize:         16
> +    version:         0
> +  - cmd:             LC_MAIN
> +    cmdsize:         24
> +    entryoff:        4448
> +    stacksize:       0
> +  - cmd:             LC_LOAD_DYLIB
> +    cmdsize:         48
> +    dylib:
> +      name:            24
> +      timestamp:       2
> +      current_version: 7864576
> +      compatibility_version: 65536
> +  - cmd:             LC_LOAD_DYLIB
> +    cmdsize:         56
> +    dylib:
> +      name:            24
> +      timestamp:       2
> +      current_version: 80349697
> +      compatibility_version: 65536
> +  - cmd:             LC_FUNCTION_STARTS
> +    cmdsize:         16
> +    dataoff:         13064
> +    datasize:        16
> +  - cmd:             LC_DATA_IN_CODE
> +    cmdsize:         16
> +    dataoff:         13080
> +    datasize:        0
> +...
> +
> +
> +#CHECK:   - cmd:             LC_SEGMENT_64
> +#CHECK:     segname:         __PAGEZERO
> +#CHECK:   - cmd:             LC_SEGMENT_64
> +#CHECK:     segname:         __TEXT
> +#CHECK:     Sections:
> +#CHECK:       - sectname:        __text
> +#CHECK:         segname:         __TEXT
> +#CHECK:         addr:            0x0000000100001160
> +#CHECK:         size:            3099
> +#CHECK:         offset:          0x00001160
> +#CHECK:         align:           4
> +#CHECK:         reloff:          0x00000000
> +#CHECK:         nreloc:          0
> +#CHECK:         flags:           0x80000400
> +#CHECK:         reserved1:       0x00000000
> +#CHECK:         reserved2:       0x00000000
> +#CHECK:         reserved3:       0x00000000
> +#CHECK:       - sectname:        __stubs
> +#CHECK:         segname:         __TEXT
> +#CHECK:       - sectname:        __stub_helper
> +#CHECK:         segname:         __TEXT
> +#CHECK:       - sectname:        __gcc_except_tab
> +#CHECK:         segname:         __TEXT
> +#CHECK:       - sectname:        __cstring
> +#CHECK:         segname:         __TEXT
> +#CHECK:       - sectname:        __unwind_info
> +#CHECK:         segname:         __TEXT
> +#CHECK:   - cmd:             LC_SEGMENT_64
> +#CHECK:     segname:         __DATA
> +#CHECK:     Sections:
> +#CHECK:       - sectname:        __got
> +#CHECK:         segname:         __DATA
> +#CHECK:       - sectname:        __nl_symbol_ptr
> +#CHECK:         segname:         __DATA
> +#CHECK:       - sectname:        __la_symbol_ptr
> +#CHECK:         segname:         __DATA
>
> Modified: llvm/trunk/tools/obj2yaml/macho2yaml.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/macho2yaml.cpp?rev=269953&r1=269952&r2=269953&view=diff
> ==============================================================================
> --- llvm/trunk/tools/obj2yaml/macho2yaml.cpp (original)
> +++ llvm/trunk/tools/obj2yaml/macho2yaml.cpp Wed May 18 11:17:23 2016
> @@ -13,6 +13,8 @@
>   #include "llvm/ObjectYAML/MachOYAML.h"
>   #include "llvm/Support/ErrorHandling.h"
>
> +#include <string.h> // for memcpy
> +
>   using namespace llvm;
>
>   class MachODumper {
> @@ -32,6 +34,24 @@ public:
>         MachO::swapStruct(LC.Data.LCStruct##_data);                              \
>       break;
>
> +template <typename SectionType>
> +MachOYAML::Section constructSection(SectionType Sec) {
> +  MachOYAML::Section TempSec;
> +  memcpy(reinterpret_cast<void *>(&TempSec.sectname[0]), &Sec.sectname[0], 16);
> +  memcpy(reinterpret_cast<void *>(&TempSec.segname[0]), &Sec.segname[0], 16);
> +  TempSec.addr = Sec.addr;
> +  TempSec.size = Sec.size;
> +  TempSec.offset = Sec.offset;
> +  TempSec.align = Sec.align;
> +  TempSec.reloff = Sec.reloff;
> +  TempSec.nreloc = Sec.nreloc;
> +  TempSec.flags = Sec.flags;
> +  TempSec.reserved1 = Sec.reserved1;
> +  TempSec.reserved2 = Sec.reserved2;
> +  TempSec.reserved3 = 0;
> +  return TempSec;
> +}
> +
>   Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
>     auto Y = make_unique<MachOYAML::Object>();
>     Y->Header.magic = Obj.getHeader().magic;
> @@ -54,6 +74,40 @@ Expected<std::unique_ptr<MachOYAML::Obje
>         break;
>   #include "llvm/Support/MachO.def"
>       }
> +    if (LoadCmd.C.cmd == MachO::LC_SEGMENT) {
> +      auto End = LoadCmd.Ptr + LoadCmd.C.cmdsize;
> +      const MachO::section *Curr = reinterpret_cast<const MachO::section *>(
> +          LoadCmd.Ptr + sizeof(MachO::segment_command));
> +      for (; reinterpret_cast<const void *>(Curr) < End; Curr++) {
> +        if (Obj.isLittleEndian() != sys::IsLittleEndianHost) {
> +          MachO::section Sec;
> +          memcpy((void *)&Sec, Curr, sizeof(MachO::section));
> +          MachO::swapStruct(Sec);
> +          LC.Sections.push_back(constructSection(Sec));
> +        } else {
> +          LC.Sections.push_back(constructSection(*Curr));
> +        }
> +      }
> +    } else if (LoadCmd.C.cmd == MachO::LC_SEGMENT_64) {
> +      auto End = LoadCmd.Ptr + LoadCmd.C.cmdsize;
> +      const MachO::section_64 *Curr =
> +          reinterpret_cast<const MachO::section_64 *>(
> +              LoadCmd.Ptr + sizeof(MachO::segment_command_64));
> +      for (; reinterpret_cast<const void *>(Curr) < End; Curr++) {
> +        MachOYAML::Section TempSec;
> +        if (Obj.isLittleEndian() != sys::IsLittleEndianHost) {
> +          MachO::section_64 Sec;
> +          memcpy((void *)&Sec, Curr, sizeof(MachO::section_64));
> +          MachO::swapStruct(Sec);
> +          LC.Sections.push_back(constructSection(Sec));
> +          TempSec = constructSection(Sec);
> +        } else {
> +          TempSec = constructSection(*Curr);
> +        }
> +        TempSec.reserved3 = Curr->reserved3;
> +        LC.Sections.push_back(TempSec);
> +      }
> +    }
>       Y->LoadCommands.push_back(std::move(LC));
>     }
>
>
> Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=269953&r1=269952&r2=269953&view=diff
> ==============================================================================
> --- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
> +++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Wed May 18 11:17:23 2016
> @@ -77,6 +77,23 @@ Error MachOWriter::writeHeader(raw_ostre
>     return Error::success();
>   }
>
> +template <typename SectionType>
> +SectionType constructSection(MachOYAML::Section Sec) {
> +  SectionType TempSec;
> +  memcpy(reinterpret_cast<void *>(&TempSec.sectname[0]), &Sec.sectname[0], 16);
> +  memcpy(reinterpret_cast<void *>(&TempSec.segname[0]), &Sec.segname[0], 16);
> +  TempSec.addr = Sec.addr;
> +  TempSec.size = Sec.size;
> +  TempSec.offset = Sec.offset;
> +  TempSec.align = Sec.align;
> +  TempSec.reloff = Sec.reloff;
> +  TempSec.nreloc = Sec.nreloc;
> +  TempSec.flags = Sec.flags;
> +  TempSec.reserved1 = Sec.reserved1;
> +  TempSec.reserved2 = Sec.reserved2;
> +  return TempSec;
> +}
> +
>   Error MachOWriter::writeLoadCommands(raw_ostream &OS) {
>     for (auto &LC : Obj.LoadCommands) {
>       size_t BytesWritten = 0;
> @@ -96,6 +113,21 @@ Error MachOWriter::writeLoadCommands(raw
>   #include "llvm/Support/MachO.def"
>       }
>
> +    if(LC.Data.load_command_data.cmd == MachO::LC_SEGMENT) {
> +      for(auto Sec : LC.Sections) {
> +        auto TempSec = constructSection<MachO::section>(Sec);
> +        OS.write(reinterpret_cast<const char *>(&(TempSec)), sizeof(MachO::section));
> +        BytesWritten += sizeof(MachO::section);
> +      }
> +    } else if(LC.Data.load_command_data.cmd == MachO::LC_SEGMENT_64) {
> +      for(auto Sec : LC.Sections) {
> +        auto TempSec = constructSection<MachO::section_64>(Sec);
> +        TempSec.reserved3 = Sec.reserved3;
> +        OS.write(reinterpret_cast<const char *>(&(TempSec)), sizeof(MachO::section_64));
> +        BytesWritten += sizeof(MachO::section_64);
> +      }
> +    }
> +
>       auto BytesRemaining =
>           LC.Data.load_command_data.cmdsize - BytesWritten;
>       if (BytesRemaining > 0) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>


More information about the llvm-commits mailing list