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

Chris Bieneman via llvm-commits llvm-commits at lists.llvm.org
Thu May 19 09:34:44 PDT 2016


I don’t think the warning is correct, but one of the C++ experts might know better. I believe because MachO::LoadCommandType is a strongly-typed enum of the same type as MachO::load_command::cmd, this shouldn’t violate strict aliasing rules because they’re actually required to be the same type.

My gut feeling is this is a GCC bug. Clang does not warn on this line with -Wstrict-aliasing.

-Chris

> On May 18, 2016, at 11:29 PM, Mikael Holmén <mikael.holmen at ericsson.com> wrote:
> 
> 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