[llvm] r290381 - [ObjectYAML] MachO support for endianness

Chris Bieneman via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 22 13:58:04 PST 2016


Author: cbieneman
Date: Thu Dec 22 15:58:03 2016
New Revision: 290381

URL: http://llvm.org/viewvc/llvm-project?rev=290381&view=rev
Log:
[ObjectYAML] MachO support for endianness

This patch adds support to the macho<->yaml tools for preserving endianness in MachO structures and DWARF data.

Added:
    llvm/trunk/test/ObjectYAML/MachO/BigEndian.yaml
    llvm/trunk/test/ObjectYAML/MachO/DWARF-BigEndian.yaml
    llvm/trunk/test/ObjectYAML/MachO/DWARF-LittleEndian.yaml
    llvm/trunk/test/ObjectYAML/MachO/LittleEndian.yaml
Modified:
    llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h
    llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
    llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
    llvm/trunk/tools/obj2yaml/macho2yaml.cpp
    llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp
    llvm/trunk/tools/yaml2obj/yaml2macho.cpp
    llvm/trunk/tools/yaml2obj/yaml2obj.h

Modified: llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h?rev=290381&r1=290380&r2=290381&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/DWARFYAML.h Thu Dec 22 15:58:03 2016
@@ -67,6 +67,7 @@ struct PubSection {
 };
 
 struct Data {
+  bool IsLittleEndian;
   std::vector<Abbrev> AbbrevDecls;
   std::vector<StringRef> DebugStrings;
   std::vector<ARange> ARanges;

Modified: llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=290381&r1=290380&r2=290381&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h Thu Dec 22 15:58:03 2016
@@ -106,6 +106,7 @@ struct LinkEditData {
 };
 
 struct Object {
+  bool IsLittleEndian;
   FileHeader Header;
   std::vector<LoadCommand> LoadCommands;
   std::vector<Section> Sections;

Modified: llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/MachOYAML.cpp?rev=290381&r1=290380&r2=290381&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/MachOYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/MachOYAML.cpp Thu Dec 22 15:58:03 2016
@@ -14,6 +14,7 @@
 #include "llvm/ObjectYAML/MachOYAML.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Format.h"
+#include "llvm/Support/Host.h"
 #include "llvm/Support/MachO.h"
 
 #include <string.h> // For memcpy, memset and strnlen.
@@ -100,6 +101,10 @@ void MappingTraits<MachOYAML::Object>::m
     IO.setContext(&Object);
   }
   IO.mapTag("!mach-o", true);
+  IO.mapOptional("IsLittleEndian", Object.IsLittleEndian,
+                 sys::IsLittleEndianHost);
+  Object.DWARF.IsLittleEndian = Object.IsLittleEndian;
+
   IO.mapRequired("FileHeader", Object.Header);
   IO.mapOptional("LoadCommands", Object.LoadCommands);
   if(!Object.LinkEdit.isEmpty() || !IO.outputting())

Added: llvm/trunk/test/ObjectYAML/MachO/BigEndian.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/BigEndian.yaml?rev=290381&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/BigEndian.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/BigEndian.yaml Thu Dec 22 15:58:03 2016
@@ -0,0 +1,100 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+IsLittleEndian:  false
+FileHeader:      
+  magic:           0xFEEDFACE
+  cputype:         0x00000012
+  cpusubtype:      0x00000000
+  filetype:        0x00000001
+  ncmds:           3
+  sizeofcmds:      368
+  flags:           0x00002000
+LoadCommands:    
+  - cmd:             LC_SEGMENT
+    cmdsize:         328
+    segname:         ''
+    vmaddr:          0
+    vmsize:          236
+    fileoff:         476
+    filesize:        236
+    maxprot:         7
+    initprot:        7
+    nsects:          4
+    flags:           0
+    Sections:        
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000000000000
+        size:            188
+        offset:          0x000001DC
+        align:           4
+        reloff:          0x000002C8
+        nreloc:          9
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __textcoal_nt
+        segname:         __TEXT
+        addr:            0x00000000000000BC
+        size:            0
+        offset:          0x00000298
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x8000000B
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __picsymbolstub1
+        segname:         __TEXT
+        addr:            0x00000000000000BC
+        size:            0
+        offset:          0x00000298
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x80000008
+        reserved1:       0x00000000
+        reserved2:       0x00000020
+        reserved3:       0x00000000
+      - sectname:        __cstring
+        segname:         __TEXT
+        addr:            0x00000000000000BC
+        size:            48
+        offset:          0x00000298
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000002
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_VERSION_MIN_MACOSX
+    cmdsize:         16
+    version:         658432
+    sdk:             0
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          784
+    nsyms:           0
+    stroff:          808
+    strsize:         36
+LinkEditData:
+  StringTable:     
+    - ''
+    - _compilerrt_abort_impl
+    - ___absvdi2
+    - ''
+...
+
+#CHECK: IsLittleEndian:  false
+#CHECK: FileHeader:      
+#CHECK:   magic:           0xFEEDFACE
+#CHECK:   cputype:         0x00000012
+#CHECK:   cpusubtype:      0x00000000
+#CHECK:   filetype:        0x00000001
+#CHECK:   ncmds:           3
+#CHECK:   sizeofcmds:      368
+#CHECK:   flags:           0x00002000

Added: llvm/trunk/test/ObjectYAML/MachO/DWARF-BigEndian.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/DWARF-BigEndian.yaml?rev=290381&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/DWARF-BigEndian.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/DWARF-BigEndian.yaml Thu Dec 22 15:58:03 2016
@@ -0,0 +1,485 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+IsLittleEndian:  false
+FileHeader:      
+  magic:           0xFEEDFACE
+  cputype:         0x00000012
+  cpusubtype:      0x00000000
+  filetype:        0x00000001
+  ncmds:           4
+  sizeofcmds:      1264
+  flags:           0x00002000
+LoadCommands:    
+  - cmd:             LC_SEGMENT
+    cmdsize:         1144
+    segname:         ''
+    vmaddr:          0
+    vmsize:          1122
+    fileoff:         1292
+    filesize:        1122
+    maxprot:         7
+    initprot:        7
+    nsects:          16
+    flags:           0
+    Sections:        
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000000000000
+        size:            188
+        offset:          0x0000050C
+        align:           4
+        reloff:          0x00000970
+        nreloc:          9
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __textcoal_nt
+        segname:         __TEXT
+        addr:            0x00000000000000BC
+        size:            0
+        offset:          0x000005C8
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x8000000B
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __picsymbolstub1
+        segname:         __TEXT
+        addr:            0x00000000000000BC
+        size:            0
+        offset:          0x000005C8
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x80000008
+        reserved1:       0x00000000
+        reserved2:       0x00000020
+        reserved3:       0x00000000
+      - sectname:        __cstring
+        segname:         __TEXT
+        addr:            0x00000000000000BC
+        size:            48
+        offset:          0x000005C8
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000002
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_str
+        segname:         __DWARF
+        addr:            0x00000000000000EC
+        size:            182
+        offset:          0x000005F8
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_loc
+        segname:         __DWARF
+        addr:            0x00000000000001A2
+        size:            0
+        offset:          0x000006AE
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_abbrev
+        segname:         __DWARF
+        addr:            0x00000000000001A2
+        size:            104
+        offset:          0x000006AE
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_info
+        segname:         __DWARF
+        addr:            0x000000000000020A
+        size:            141
+        offset:          0x00000716
+        align:           0
+        reloff:          0x000009B8
+        nreloc:          2
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_ranges
+        segname:         __DWARF
+        addr:            0x0000000000000297
+        size:            0
+        offset:          0x000007A3
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_macinfo
+        segname:         __DWARF
+        addr:            0x0000000000000297
+        size:            1
+        offset:          0x000007A3
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_names
+        segname:         __DWARF
+        addr:            0x0000000000000298
+        size:            60
+        offset:          0x000007A4
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_objc
+        segname:         __DWARF
+        addr:            0x00000000000002D4
+        size:            36
+        offset:          0x000007E0
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_namespac
+        segname:         __DWARF
+        addr:            0x00000000000002F8
+        size:            36
+        offset:          0x00000804
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_types
+        segname:         __DWARF
+        addr:            0x000000000000031C
+        size:            133
+        offset:          0x00000828
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_frame
+        segname:         __DWARF
+        addr:            0x00000000000003A4
+        size:            48
+        offset:          0x000008B0
+        align:           2
+        reloff:          0x000009C8
+        nreloc:          1
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_line
+        segname:         __DWARF
+        addr:            0x00000000000003D4
+        size:            142
+        offset:          0x000008E0
+        align:           0
+        reloff:          0x000009D0
+        nreloc:          1
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_VERSION_MIN_MACOSX
+    cmdsize:         16
+    version:         658432
+    sdk:             0
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          2520
+    nsyms:           2
+    stroff:          2544
+    strsize:         36
+  - cmd:             LC_DYSYMTAB
+    cmdsize:         80
+    ilocalsym:       0
+    nlocalsym:       0
+    iextdefsym:      0
+    nextdefsym:      1
+    iundefsym:       1
+    nundefsym:       1
+    tocoff:          0
+    ntoc:            0
+    modtaboff:       0
+    nmodtab:         0
+    extrefsymoff:    0
+    nextrefsyms:     0
+    indirectsymoff:  0
+    nindirectsyms:   0
+    extreloff:       0
+    nextrel:         0
+    locreloff:       0
+    nlocrel:         0
+LinkEditData:    
+  NameList:        
+    - n_strx:          24
+      n_type:          0x0F
+      n_sect:          1
+      n_desc:          0
+      n_value:         0
+    - n_strx:          1
+      n_type:          0x01
+      n_sect:          0
+      n_desc:          0
+      n_value:         0
+  StringTable:     
+    - ''
+    - _compilerrt_abort_impl
+    - ___absvdi2
+    - ''
+DWARF:           
+  debug_str:       
+    - 'clang version 4.0.0 (trunk 290181) (llvm/trunk 290209)'
+    - ../compiler-rt/lib/builtins/absvdi2.c
+    - /Users/cbieneman/dev/open-source/llvm-build-rel
+    - int
+    - di_int
+    - long long int
+    - __absvdi2
+    - a
+    - N
+    - t
+  debug_abbrev:    
+    - Code:            0x00000001
+      Tag:             DW_TAG_compile_unit
+      Children:        DW_CHILDREN_yes
+      Attributes:      
+        - Attribute:       DW_AT_producer
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_language
+          Form:            DW_FORM_data2
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_stmt_list
+          Form:            DW_FORM_sec_offset
+        - Attribute:       DW_AT_comp_dir
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_low_pc
+          Form:            DW_FORM_addr
+        - Attribute:       DW_AT_high_pc
+          Form:            DW_FORM_data4
+    - Code:            0x00000002
+      Tag:             DW_TAG_base_type
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_encoding
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_byte_size
+          Form:            DW_FORM_data1
+    - Code:            0x00000003
+      Tag:             DW_TAG_typedef
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+    - Code:            0x00000004
+      Tag:             DW_TAG_subprogram
+      Children:        DW_CHILDREN_yes
+      Attributes:      
+        - Attribute:       DW_AT_low_pc
+          Form:            DW_FORM_addr
+        - Attribute:       DW_AT_high_pc
+          Form:            DW_FORM_data4
+        - Attribute:       DW_AT_frame_base
+          Form:            DW_FORM_exprloc
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_prototyped
+          Form:            DW_FORM_flag_present
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+        - Attribute:       DW_AT_external
+          Form:            DW_FORM_flag_present
+    - Code:            0x00000005
+      Tag:             DW_TAG_formal_parameter
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_location
+          Form:            DW_FORM_exprloc
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+    - Code:            0x00000006
+      Tag:             DW_TAG_variable
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_location
+          Form:            DW_FORM_exprloc
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+    - Code:            0x00000007
+      Tag:             DW_TAG_const_type
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4       
+...
+
+#CHECK: DWARF:           
+#CHECK:   debug_str:       
+#CHECK:     - 'clang version 4.0.0 (trunk 290181) (llvm/trunk 290209)'
+#CHECK:     - ../compiler-rt/lib/builtins/absvdi2.c
+#CHECK:     - /Users/cbieneman/dev/open-source/llvm-build-rel
+#CHECK:     - int
+#CHECK:     - di_int
+#CHECK:     - long long int
+#CHECK:     - __absvdi2
+#CHECK:     - a
+#CHECK:     - N
+#CHECK:     - t
+#CHECK:   debug_abbrev:    
+#CHECK:     - Code:            0x00000001
+#CHECK:       Tag:             DW_TAG_compile_unit
+#CHECK:       Children:        DW_CHILDREN_yes
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_producer
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_language
+#CHECK:           Form:            DW_FORM_data2
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_stmt_list
+#CHECK:           Form:            DW_FORM_sec_offset
+#CHECK:         - Attribute:       DW_AT_comp_dir
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_low_pc
+#CHECK:           Form:            DW_FORM_addr
+#CHECK:         - Attribute:       DW_AT_high_pc
+#CHECK:           Form:            DW_FORM_data4
+#CHECK:     - Code:            0x00000002
+#CHECK:       Tag:             DW_TAG_base_type
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_encoding
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_byte_size
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:     - Code:            0x00000003
+#CHECK:       Tag:             DW_TAG_typedef
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:     - Code:            0x00000004
+#CHECK:       Tag:             DW_TAG_subprogram
+#CHECK:       Children:        DW_CHILDREN_yes
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_low_pc
+#CHECK:           Form:            DW_FORM_addr
+#CHECK:         - Attribute:       DW_AT_high_pc
+#CHECK:           Form:            DW_FORM_data4
+#CHECK:         - Attribute:       DW_AT_frame_base
+#CHECK:           Form:            DW_FORM_exprloc
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_prototyped
+#CHECK:           Form:            DW_FORM_flag_present
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:         - Attribute:       DW_AT_external
+#CHECK:           Form:            DW_FORM_flag_present
+#CHECK:     - Code:            0x00000005
+#CHECK:       Tag:             DW_TAG_formal_parameter
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_location
+#CHECK:           Form:            DW_FORM_exprloc
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:     - Code:            0x00000006
+#CHECK:       Tag:             DW_TAG_variable
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_location
+#CHECK:           Form:            DW_FORM_exprloc
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:     - Code:            0x00000007
+#CHECK:       Tag:             DW_TAG_const_type
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:          Form:            DW_FORM_ref4       
+

Added: llvm/trunk/test/ObjectYAML/MachO/DWARF-LittleEndian.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/DWARF-LittleEndian.yaml?rev=290381&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/DWARF-LittleEndian.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/DWARF-LittleEndian.yaml Thu Dec 22 15:58:03 2016
@@ -0,0 +1,474 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+IsLittleEndian:  true
+FileHeader:      
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000001
+  ncmds:           4
+  sizeofcmds:      1392
+  flags:           0x00002000
+  reserved:        0x00000000
+LoadCommands:    
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         1272
+    segname:         ''
+    vmaddr:          0
+    vmsize:          1086
+    fileoff:         1424
+    filesize:        1086
+    maxprot:         7
+    initprot:        7
+    nsects:          15
+    flags:           0
+    Sections:        
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000000000000
+        size:            93
+        offset:          0x00000590
+        align:           4
+        reloff:          0x000009D0
+        nreloc:          3
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __cstring
+        segname:         __TEXT
+        addr:            0x000000000000005D
+        size:            48
+        offset:          0x000005ED
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000002
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_str
+        segname:         __DWARF
+        addr:            0x000000000000008D
+        size:            182
+        offset:          0x0000061D
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_loc
+        segname:         __DWARF
+        addr:            0x0000000000000143
+        size:            0
+        offset:          0x000006D3
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_abbrev
+        segname:         __DWARF
+        addr:            0x0000000000000143
+        size:            104
+        offset:          0x000006D3
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_info
+        segname:         __DWARF
+        addr:            0x00000000000001AB
+        size:            146
+        offset:          0x0000073B
+        align:           0
+        reloff:          0x000009E8
+        nreloc:          2
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_ranges
+        segname:         __DWARF
+        addr:            0x000000000000023D
+        size:            0
+        offset:          0x000007CD
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_macinfo
+        segname:         __DWARF
+        addr:            0x000000000000023D
+        size:            1
+        offset:          0x000007CD
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_names
+        segname:         __DWARF
+        addr:            0x000000000000023E
+        size:            60
+        offset:          0x000007CE
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_objc
+        segname:         __DWARF
+        addr:            0x000000000000027A
+        size:            36
+        offset:          0x0000080A
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_namespac
+        segname:         __DWARF
+        addr:            0x000000000000029E
+        size:            36
+        offset:          0x0000082E
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __apple_types
+        segname:         __DWARF
+        addr:            0x00000000000002C2
+        size:            133
+        offset:          0x00000852
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __compact_unwind
+        segname:         __LD
+        addr:            0x0000000000000348
+        size:            32
+        offset:          0x000008D8
+        align:           3
+        reloff:          0x000009F8
+        nreloc:          1
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __eh_frame
+        segname:         __TEXT
+        addr:            0x0000000000000368
+        size:            64
+        offset:          0x000008F8
+        align:           3
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x6800000B
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __debug_line
+        segname:         __DWARF
+        addr:            0x00000000000003A8
+        size:            150
+        offset:          0x00000938
+        align:           0
+        reloff:          0x00000A00
+        nreloc:          1
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_VERSION_MIN_MACOSX
+    cmdsize:         16
+    version:         658432
+    sdk:             0
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          2568
+    nsyms:           2
+    stroff:          2600
+    strsize:         36
+  - cmd:             LC_DYSYMTAB
+    cmdsize:         80
+    ilocalsym:       0
+    nlocalsym:       0
+    iextdefsym:      0
+    nextdefsym:      1
+    iundefsym:       1
+    nundefsym:       1
+    tocoff:          0
+    ntoc:            0
+    modtaboff:       0
+    nmodtab:         0
+    extrefsymoff:    0
+    nextrefsyms:     0
+    indirectsymoff:  0
+    nindirectsyms:   0
+    extreloff:       0
+    nextrel:         0
+    locreloff:       0
+    nlocrel:         0
+LinkEditData:    
+  NameList:        
+    - n_strx:          24
+      n_type:          0x0F
+      n_sect:          1
+      n_desc:          0
+      n_value:         0
+    - n_strx:          1
+      n_type:          0x01
+      n_sect:          0
+      n_desc:          0
+      n_value:         0
+  StringTable:     
+    - ''
+    - _compilerrt_abort_impl
+    - ___absvdi2
+    - ''
+DWARF:           
+  debug_str:       
+    - 'clang version 4.0.0 (trunk 290181) (llvm/trunk 290209)'
+    - ../compiler-rt/lib/builtins/absvdi2.c
+    - /Users/cbieneman/dev/open-source/llvm-build-rel
+    - int
+    - di_int
+    - long long int
+    - __absvdi2
+    - a
+    - N
+    - t
+  debug_abbrev:    
+    - Code:            0x00000001
+      Tag:             DW_TAG_compile_unit
+      Children:        DW_CHILDREN_yes
+      Attributes:      
+        - Attribute:       DW_AT_producer
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_language
+          Form:            DW_FORM_data2
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_stmt_list
+          Form:            DW_FORM_sec_offset
+        - Attribute:       DW_AT_comp_dir
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_low_pc
+          Form:            DW_FORM_addr
+        - Attribute:       DW_AT_high_pc
+          Form:            DW_FORM_data4
+    - Code:            0x00000002
+      Tag:             DW_TAG_base_type
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_encoding
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_byte_size
+          Form:            DW_FORM_data1
+    - Code:            0x00000003
+      Tag:             DW_TAG_typedef
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+    - Code:            0x00000004
+      Tag:             DW_TAG_subprogram
+      Children:        DW_CHILDREN_yes
+      Attributes:      
+        - Attribute:       DW_AT_low_pc
+          Form:            DW_FORM_addr
+        - Attribute:       DW_AT_high_pc
+          Form:            DW_FORM_data4
+        - Attribute:       DW_AT_frame_base
+          Form:            DW_FORM_exprloc
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_prototyped
+          Form:            DW_FORM_flag_present
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+        - Attribute:       DW_AT_external
+          Form:            DW_FORM_flag_present
+    - Code:            0x00000005
+      Tag:             DW_TAG_formal_parameter
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_location
+          Form:            DW_FORM_exprloc
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+    - Code:            0x00000006
+      Tag:             DW_TAG_variable
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_location
+          Form:            DW_FORM_exprloc
+        - Attribute:       DW_AT_name
+          Form:            DW_FORM_strp
+        - Attribute:       DW_AT_decl_file
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_decl_line
+          Form:            DW_FORM_data1
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+    - Code:            0x00000007
+      Tag:             DW_TAG_const_type
+      Children:        DW_CHILDREN_no
+      Attributes:      
+        - Attribute:       DW_AT_type
+          Form:            DW_FORM_ref4
+...
+
+#CHECK: DWARF:           
+#CHECK:   debug_str:       
+#CHECK:     - 'clang version 4.0.0 (trunk 290181) (llvm/trunk 290209)'
+#CHECK:     - ../compiler-rt/lib/builtins/absvdi2.c
+#CHECK:     - /Users/cbieneman/dev/open-source/llvm-build-rel
+#CHECK:     - int
+#CHECK:     - di_int
+#CHECK:     - long long int
+#CHECK:     - __absvdi2
+#CHECK:     - a
+#CHECK:     - N
+#CHECK:     - t
+#CHECK:   debug_abbrev:    
+#CHECK:     - Code:            0x00000001
+#CHECK:       Tag:             DW_TAG_compile_unit
+#CHECK:       Children:        DW_CHILDREN_yes
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_producer
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_language
+#CHECK:           Form:            DW_FORM_data2
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_stmt_list
+#CHECK:           Form:            DW_FORM_sec_offset
+#CHECK:         - Attribute:       DW_AT_comp_dir
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_low_pc
+#CHECK:           Form:            DW_FORM_addr
+#CHECK:         - Attribute:       DW_AT_high_pc
+#CHECK:           Form:            DW_FORM_data4
+#CHECK:     - Code:            0x00000002
+#CHECK:       Tag:             DW_TAG_base_type
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_encoding
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_byte_size
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:     - Code:            0x00000003
+#CHECK:       Tag:             DW_TAG_typedef
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:     - Code:            0x00000004
+#CHECK:       Tag:             DW_TAG_subprogram
+#CHECK:       Children:        DW_CHILDREN_yes
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_low_pc
+#CHECK:           Form:            DW_FORM_addr
+#CHECK:         - Attribute:       DW_AT_high_pc
+#CHECK:           Form:            DW_FORM_data4
+#CHECK:         - Attribute:       DW_AT_frame_base
+#CHECK:           Form:            DW_FORM_exprloc
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_prototyped
+#CHECK:           Form:            DW_FORM_flag_present
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:         - Attribute:       DW_AT_external
+#CHECK:           Form:            DW_FORM_flag_present
+#CHECK:     - Code:            0x00000005
+#CHECK:       Tag:             DW_TAG_formal_parameter
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_location
+#CHECK:           Form:            DW_FORM_exprloc
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:     - Code:            0x00000006
+#CHECK:       Tag:             DW_TAG_variable
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_location
+#CHECK:           Form:            DW_FORM_exprloc
+#CHECK:         - Attribute:       DW_AT_name
+#CHECK:           Form:            DW_FORM_strp
+#CHECK:         - Attribute:       DW_AT_decl_file
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_decl_line
+#CHECK:           Form:            DW_FORM_data1
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK:     - Code:            0x00000007
+#CHECK:       Tag:             DW_TAG_const_type
+#CHECK:       Children:        DW_CHILDREN_no
+#CHECK:       Attributes:      
+#CHECK:         - Attribute:       DW_AT_type
+#CHECK:           Form:            DW_FORM_ref4
+#CHECK: ...

Added: llvm/trunk/test/ObjectYAML/MachO/LittleEndian.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/LittleEndian.yaml?rev=290381&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/LittleEndian.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/LittleEndian.yaml Thu Dec 22 15:58:03 2016
@@ -0,0 +1,132 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+IsLittleEndian:  true
+FileHeader:      
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000001
+  ncmds:           4
+  sizeofcmds:      512
+  flags:           0x00002000
+  reserved:        0x00000000
+LoadCommands:    
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         392
+    segname:         ''
+    vmaddr:          0
+    vmsize:          240
+    fileoff:         544
+    filesize:        240
+    maxprot:         7
+    initprot:        7
+    nsects:          4
+    flags:           0
+    Sections:        
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000000000000
+        size:            93
+        offset:          0x00000220
+        align:           4
+        reloff:          0x00000310
+        nreloc:          3
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __cstring
+        segname:         __TEXT
+        addr:            0x000000000000005D
+        size:            48
+        offset:          0x0000027D
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000002
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __compact_unwind
+        segname:         __LD
+        addr:            0x0000000000000090
+        size:            32
+        offset:          0x000002B0
+        align:           3
+        reloff:          0x00000328
+        nreloc:          1
+        flags:           0x02000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __eh_frame
+        segname:         __TEXT
+        addr:            0x00000000000000B0
+        size:            64
+        offset:          0x000002D0
+        align:           3
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x6800000B
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_VERSION_MIN_MACOSX
+    cmdsize:         16
+    version:         658432
+    sdk:             0
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          816
+    nsyms:           2
+    stroff:          848
+    strsize:         36
+  - cmd:             LC_DYSYMTAB
+    cmdsize:         80
+    ilocalsym:       0
+    nlocalsym:       0
+    iextdefsym:      0
+    nextdefsym:      1
+    iundefsym:       1
+    nundefsym:       1
+    tocoff:          0
+    ntoc:            0
+    modtaboff:       0
+    nmodtab:         0
+    extrefsymoff:    0
+    nextrefsyms:     0
+    indirectsymoff:  0
+    nindirectsyms:   0
+    extreloff:       0
+    nextrel:         0
+    locreloff:       0
+    nlocrel:         0
+LinkEditData:    
+  NameList:        
+    - n_strx:          24
+      n_type:          0x0F
+      n_sect:          1
+      n_desc:          0
+      n_value:         0
+    - n_strx:          1
+      n_type:          0x01
+      n_sect:          0
+      n_desc:          0
+      n_value:         0
+  StringTable:     
+    - ''
+    - _compilerrt_abort_impl
+    - ___absvdi2
+    - ''
+...
+
+#CHECK: FileHeader:      
+#CHECK: magic:           0xFEEDFACF
+#CHECK:   cputype:         0x01000007
+#CHECK:   cpusubtype:      0x00000003
+#CHECK:   filetype:        0x00000001
+#CHECK:   ncmds:           4
+#CHECK:   sizeofcmds:      512
+#CHECK:   flags:           0x00002000
+#CHECK:   reserved:        0x00000000

Modified: llvm/trunk/tools/obj2yaml/macho2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/macho2yaml.cpp?rev=290381&r1=290380&r2=290381&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/macho2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/macho2yaml.cpp Thu Dec 22 15:58:03 2016
@@ -36,7 +36,7 @@ class MachODumper {
   void dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y);
   void dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y);
   void dumpDebugAbbrev(DWARFContextInMemory &DCtx,
-                        std::unique_ptr<MachOYAML::Object> &Y);
+                       std::unique_ptr<MachOYAML::Object> &Y);
   void dumpDebugStrings(DWARFContextInMemory &DCtx,
                         std::unique_ptr<MachOYAML::Object> &Y);
 
@@ -165,12 +165,13 @@ const char *MachODumper::processLoadComm
 
 Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
   auto Y = make_unique<MachOYAML::Object>();
+  Y->IsLittleEndian = Obj.isLittleEndian();
   dumpHeader(Y);
   dumpLoadCommands(Y);
   dumpLinkEdit(Y);
 
   DWARFContextInMemory DICtx(Obj);
-  if(auto Err = dwarf2yaml(DICtx, Y->DWARF))
+  if (auto Err = dwarf2yaml(DICtx, Y->DWARF))
     return errorCodeToError(Err);
   return std::move(Y);
 }
@@ -451,12 +452,11 @@ void MachODumper::dumpSymbols(std::uniqu
 
   for (auto Symbol : Obj.symbols()) {
     MachOYAML::NListEntry NLE =
-        Obj.is64Bit() ? constructNameList<MachO::nlist_64>(
-                            *reinterpret_cast<const MachO::nlist_64 *>(
-                                Symbol.getRawDataRefImpl().p))
-                      : constructNameList<MachO::nlist>(
-                            *reinterpret_cast<const MachO::nlist *>(
-                                Symbol.getRawDataRefImpl().p));
+        Obj.is64Bit()
+            ? constructNameList<MachO::nlist_64>(
+                  Obj.getSymbol64TableEntry(Symbol.getRawDataRefImpl()))
+            : constructNameList<MachO::nlist>(
+                  Obj.getSymbolTableEntry(Symbol.getRawDataRefImpl()));
     LEData.NameList.push_back(NLE);
   }
 
@@ -529,6 +529,6 @@ std::error_code macho2yaml(raw_ostream &
     }
     return obj2yaml_error::success;
   }
-  
+
   return obj2yaml_error::unsupported_obj_file_format;
 }

Modified: llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp?rev=290381&r1=290380&r2=290381&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2dwarf.cpp Thu Dec 22 15:58:03 2016
@@ -16,9 +16,31 @@
 #include "llvm/Support/Error.h"
 #include "llvm/Support/LEB128.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/SwapByteOrder.h"
 
 using namespace llvm;
 
+template <typename T>
+void writeInteger(T Integer, raw_ostream &OS, bool IsLittleEndian) {
+  if (IsLittleEndian != sys::IsLittleEndianHost)
+    sys::swapByteOrder(Integer);
+  OS.write(reinterpret_cast<char *>(&Integer), sizeof(T));
+}
+
+void writeVariableSizedInteger(uint64_t Integer, size_t Size, raw_ostream &OS,
+                               bool IsLittleEndian) {
+  if (8 == Size)
+    writeInteger((uint64_t)Integer, OS, IsLittleEndian);
+  else if (4 == Size)
+    writeInteger((uint32_t)Integer, OS, IsLittleEndian);
+  else if (2 == Size)
+    writeInteger((uint16_t)Integer, OS, IsLittleEndian);
+  else if (1 == Size)
+    writeInteger((uint8_t)Integer, OS, IsLittleEndian);
+  else
+    assert(false && "Invalid integer write size.");
+}
+
 void ZeroFillBytes(raw_ostream &OS, size_t Size) {
   std::vector<uint8_t> FillData;
   FillData.insert(FillData.begin(), Size, 0);
@@ -49,34 +71,37 @@ void yaml2debug_abbrev(raw_ostream &OS,
 void yaml2debug_aranges(raw_ostream &OS, const DWARFYAML::Data &DI) {
   for (auto Range : DI.ARanges) {
     auto HeaderStart = OS.tell();
-    OS.write(reinterpret_cast<char *>(&Range.Length), 4);
-    OS.write(reinterpret_cast<char *>(&Range.Version), 2);
-    OS.write(reinterpret_cast<char *>(&Range.CuOffset), 4);
-    OS.write(reinterpret_cast<char *>(&Range.AddrSize), 1);
-    OS.write(reinterpret_cast<char *>(&Range.SegSize), 1);
+    writeInteger((uint32_t)Range.Length, OS, DI.IsLittleEndian);
+    writeInteger((uint16_t)Range.Version, OS, DI.IsLittleEndian);
+    writeInteger((uint32_t)Range.CuOffset, OS, DI.IsLittleEndian);
+    writeInteger((uint8_t)Range.AddrSize, OS, DI.IsLittleEndian);
+    writeInteger((uint8_t)Range.SegSize, OS, DI.IsLittleEndian);
 
     auto HeaderSize = OS.tell() - HeaderStart;
     auto FirstDescriptor = alignTo(HeaderSize, Range.AddrSize * 2);
     ZeroFillBytes(OS, FirstDescriptor - HeaderSize);
 
     for (auto Descriptor : Range.Descriptors) {
-      OS.write(reinterpret_cast<char *>(&Descriptor.Address), Range.AddrSize);
-      OS.write(reinterpret_cast<char *>(&Descriptor.Length), Range.AddrSize);
+      writeVariableSizedInteger(Descriptor.Address, Range.AddrSize, OS,
+                                DI.IsLittleEndian);
+      writeVariableSizedInteger(Descriptor.Length, Range.AddrSize, OS,
+                                DI.IsLittleEndian);
     }
     ZeroFillBytes(OS, Range.AddrSize * 2);
   }
 }
 
-void yaml2pubsection(raw_ostream &OS, const DWARFYAML::PubSection &Sect) {
-  OS.write(reinterpret_cast<const char *>(&Sect.Length), 4);
-  OS.write(reinterpret_cast<const char *>(&Sect.Version), 2);
-  OS.write(reinterpret_cast<const char *>(&Sect.UnitOffset), 4);
-  OS.write(reinterpret_cast<const char *>(&Sect.UnitSize), 4);
+void yaml2pubsection(raw_ostream &OS, const DWARFYAML::PubSection &Sect,
+                     bool IsLittleEndian) {
+  writeInteger((uint32_t)Sect.Length, OS, IsLittleEndian);
+  writeInteger((uint16_t)Sect.Version, OS, IsLittleEndian);
+  writeInteger((uint32_t)Sect.UnitOffset, OS, IsLittleEndian);
+  writeInteger((uint32_t)Sect.UnitSize, OS, IsLittleEndian);
   for (auto Entry : Sect.Entries) {
-    OS.write(reinterpret_cast<const char *>(&Entry.DieOffset), 4);
+    writeInteger((uint32_t)Entry.DieOffset, OS, IsLittleEndian);
     if (Sect.IsGNUStyle)
-      OS.write(reinterpret_cast<const char *>(&Entry.Descriptor), 4);
+      writeInteger((uint32_t)Entry.Descriptor, OS, IsLittleEndian);
     OS.write(Entry.Name.data(), Entry.Name.size());
     OS.write('\0');
   }
-}
+}
\ No newline at end of file

Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=290381&r1=290380&r2=290381&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Thu Dec 22 15:58:03 2016
@@ -41,8 +41,7 @@ private:
   Error writeLoadCommands(raw_ostream &OS);
   Error writeSectionData(raw_ostream &OS);
   Error writeLinkEditData(raw_ostream &OS);
-  Error writeDWARFData(raw_ostream &OS,
-                       std::vector<MachOYAML::Section> &Sections);
+
   void writeBindOpcodes(raw_ostream &OS,
                         std::vector<MachOYAML::BindOpcode> &BindOpcodes);
   // LinkEdit writers
@@ -85,6 +84,9 @@ Error MachOWriter::writeHeader(raw_ostre
   Header.flags = Obj.Header.flags;
   Header.reserved = Obj.Header.reserved;
 
+  if (Obj.IsLittleEndian != sys::IsLittleEndianHost)
+    MachO::swapStruct(Header);
+
   auto header_size =
       is64Bit ? sizeof(MachO::mach_header_64) : sizeof(MachO::mach_header);
   OS.write((const char *)&Header, header_size);
@@ -110,16 +112,20 @@ SectionType constructSection(MachOYAML::
 }
 
 template <typename StructType>
-size_t writeLoadCommandData(MachOYAML::LoadCommand &LC, raw_ostream &OS) {
+size_t writeLoadCommandData(MachOYAML::LoadCommand &LC, raw_ostream &OS,
+                            bool IsLittleEndian) {
   return 0;
 }
 
 template <>
 size_t writeLoadCommandData<MachO::segment_command>(MachOYAML::LoadCommand &LC,
-                                                    raw_ostream &OS) {
+                                                    raw_ostream &OS,
+                                                    bool IsLittleEndian) {
   size_t BytesWritten = 0;
   for (const auto &Sec : LC.Sections) {
     auto TempSec = constructSection<MachO::section>(Sec);
+    if (IsLittleEndian != sys::IsLittleEndianHost)
+      MachO::swapStruct(TempSec);
     OS.write(reinterpret_cast<const char *>(&(TempSec)),
              sizeof(MachO::section));
     BytesWritten += sizeof(MachO::section);
@@ -128,13 +134,14 @@ size_t writeLoadCommandData<MachO::segme
 }
 
 template <>
-size_t
-writeLoadCommandData<MachO::segment_command_64>(MachOYAML::LoadCommand &LC,
-                                                raw_ostream &OS) {
+size_t writeLoadCommandData<MachO::segment_command_64>(
+    MachOYAML::LoadCommand &LC, raw_ostream &OS, bool IsLittleEndian) {
   size_t BytesWritten = 0;
   for (const auto &Sec : LC.Sections) {
     auto TempSec = constructSection<MachO::section_64>(Sec);
     TempSec.reserved3 = Sec.reserved3;
+    if (IsLittleEndian != sys::IsLittleEndianHost)
+      MachO::swapStruct(TempSec);
     OS.write(reinterpret_cast<const char *>(&(TempSec)),
              sizeof(MachO::section_64));
     BytesWritten += sizeof(MachO::section_64);
@@ -153,19 +160,22 @@ size_t writePayloadString(MachOYAML::Loa
 
 template <>
 size_t writeLoadCommandData<MachO::dylib_command>(MachOYAML::LoadCommand &LC,
-                                                  raw_ostream &OS) {
+                                                  raw_ostream &OS,
+                                                  bool IsLittleEndian) {
   return writePayloadString(LC, OS);
 }
 
 template <>
 size_t writeLoadCommandData<MachO::dylinker_command>(MachOYAML::LoadCommand &LC,
-                                                     raw_ostream &OS) {
+                                                     raw_ostream &OS,
+                                                     bool IsLittleEndian) {
   return writePayloadString(LC, OS);
 }
 
 template <>
 size_t writeLoadCommandData<MachO::rpath_command>(MachOYAML::LoadCommand &LC,
-                                                  raw_ostream &OS) {
+                                                  raw_ostream &OS,
+                                                  bool IsLittleEndian) {
   return writePayloadString(LC, OS);
 }
 
@@ -190,20 +200,28 @@ void MachOWriter::ZeroToOffset(raw_ostre
 Error MachOWriter::writeLoadCommands(raw_ostream &OS) {
   for (auto &LC : Obj.LoadCommands) {
     size_t BytesWritten = 0;
+    llvm::MachO::macho_load_command Data = LC.Data;
+
 #define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct)                         \
   case MachO::LCName:                                                          \
-    OS.write(reinterpret_cast<const char *>(&(LC.Data.LCStruct##_data)),       \
+    if (Obj.IsLittleEndian != sys::IsLittleEndianHost)                         \
+      MachO::swapStruct(Data.LCStruct##_data);                                 \
+    OS.write(reinterpret_cast<const char *>(&(Data.LCStruct##_data)),          \
              sizeof(MachO::LCStruct));                                         \
     BytesWritten = sizeof(MachO::LCStruct);                                    \
-    BytesWritten += writeLoadCommandData<MachO::LCStruct>(LC, OS);             \
+    BytesWritten +=                                                            \
+        writeLoadCommandData<MachO::LCStruct>(LC, OS, Obj.IsLittleEndian);     \
     break;
 
     switch (LC.Data.load_command_data.cmd) {
     default:
-      OS.write(reinterpret_cast<const char *>(&(LC.Data.load_command_data)),
+      if (Obj.IsLittleEndian != sys::IsLittleEndianHost)
+        MachO::swapStruct(Data.load_command_data);
+      OS.write(reinterpret_cast<const char *>(&(Data.load_command_data)),
                sizeof(MachO::load_command));
       BytesWritten = sizeof(MachO::load_command);
-      BytesWritten += writeLoadCommandData<MachO::load_command>(LC, OS);
+      BytesWritten +=
+          writeLoadCommandData<MachO::load_command>(LC, OS, Obj.IsLittleEndian);
       break;
 #include "llvm/Support/MachO.def"
     }
@@ -230,41 +248,38 @@ Error MachOWriter::writeLoadCommands(raw
 }
 
 Error MachOWriter::writeSectionData(raw_ostream &OS) {
+  bool FoundLinkEditSeg = false;
   for (auto &LC : Obj.LoadCommands) {
     switch (LC.Data.load_command_data.cmd) {
     case MachO::LC_SEGMENT:
     case MachO::LC_SEGMENT_64:
-      auto currOffset = OS.tell() - fileStart;
-      auto segname = LC.Data.segment_command_data.segname;
       uint64_t segOff = is64Bit ? LC.Data.segment_command_64_data.fileoff
                                 : LC.Data.segment_command_data.fileoff;
-
-      if (0 == strncmp(&segname[0], "__LINKEDIT", 16)) {
+      if (0 == strncmp(&LC.Data.segment_command_data.segname[0], "__LINKEDIT", 16)) {
+        FoundLinkEditSeg = true;
         if (auto Err = writeLinkEditData(OS))
           return Err;
-      } else if (0 == strncmp(&segname[0], "__DWARF", 16)) {
-        if (auto Err = writeDWARFData(OS, LC.Sections))
-          return Err;
-      } else {
+      }
+      for (auto &Sec : LC.Sections) {
+        ZeroToOffset(OS, Sec.offset);
         // Zero Fill any data between the end of the last thing we wrote and the
         // start of this section.
-        if (currOffset < segOff) {
-          ZeroFillBytes(OS, segOff - currOffset);
-        }
-
-        for (auto &Sec : LC.Sections) {
-          // Zero Fill any data between the end of the last thing we wrote and
-          // the
-          // start of this section.
-          assert(
-              (OS.tell() - fileStart <= Sec.offset ||
-               Sec.offset == (uint32_t)0) &&
-              "Wrote too much data somewhere, section offsets don't line up.");
-          currOffset = OS.tell() - fileStart;
-          if (currOffset < Sec.offset) {
-            ZeroFillBytes(OS, Sec.offset - currOffset);
+        assert((OS.tell() - fileStart <= Sec.offset ||
+                Sec.offset == (uint32_t)0) &&
+               "Wrote too much data somewhere, section offsets don't line up.");
+        if (0 == strncmp(&Sec.segname[0], "__DWARF", 16)) {
+          if (0 == strncmp(&Sec.sectname[0], "__debug_str", 16)) {
+            yaml2debug_str(OS, Obj.DWARF);
+          } else if (0 == strncmp(&Sec.sectname[0], "__debug_abbrev", 16)) {
+            yaml2debug_abbrev(OS, Obj.DWARF);
+          } else if (0 == strncmp(&Sec.sectname[0], "__debug_aranges", 16)) {
+            yaml2debug_aranges(OS, Obj.DWARF);
+          } else if (0 == strncmp(&Sec.sectname[0], "__debug_pubnames", 16)) {
+            yaml2pubsection(OS, Obj.DWARF.PubNames, Obj.IsLittleEndian);
+          } else if (0 == strncmp(&Sec.sectname[0], "__debug_pubtypes", 16)) {
+            yaml2pubsection(OS, Obj.DWARF.PubTypes, Obj.IsLittleEndian);
           }
-
+        } else {
           // Fills section data with 0xDEADBEEF
           Fill(OS, Sec.size, 0xDEADBEEFu);
         }
@@ -275,6 +290,12 @@ Error MachOWriter::writeSectionData(raw_
       break;
     }
   }
+  // Old PPC Object Files didn't have __LINKEDIT segments, the data was just
+  // stuck at the end of the file.
+  if (!FoundLinkEditSeg) {
+    if (auto Err = writeLinkEditData(OS))
+      return Err;
+  }
   return Error::success();
 }
 
@@ -328,13 +349,17 @@ Error MachOWriter::writeExportTrie(raw_o
 }
 
 template <typename NListType>
-void writeNListEntry(MachOYAML::NListEntry &NLE, raw_ostream &OS) {
+void writeNListEntry(MachOYAML::NListEntry &NLE, raw_ostream &OS,
+                     bool IsLittleEndian) {
   NListType ListEntry;
   ListEntry.n_strx = NLE.n_strx;
   ListEntry.n_type = NLE.n_type;
   ListEntry.n_sect = NLE.n_sect;
   ListEntry.n_desc = NLE.n_desc;
   ListEntry.n_value = NLE.n_value;
+
+  if (sys::IsBigEndianHost)
+    MachO::swapStruct(ListEntry);
   OS.write(reinterpret_cast<const char *>(&ListEntry), sizeof(NListType));
 }
 
@@ -384,25 +409,6 @@ Error MachOWriter::writeLinkEditData(raw
   return Error::success();
 }
 
-Error MachOWriter::writeDWARFData(raw_ostream &OS,
-                                  std::vector<MachOYAML::Section> &Sections) {
-  for (auto Section : Sections) {
-    ZeroToOffset(OS, Section.offset);
-    if (0 == strncmp(&Section.sectname[0], "__debug_str", 16)) {
-      yaml2debug_str(OS, Obj.DWARF);
-    } else if (0 == strncmp(&Section.sectname[0], "__debug_abbrev", 16)) {
-      yaml2debug_abbrev(OS, Obj.DWARF);
-    } else if (0 == strncmp(&Section.sectname[0], "__debug_aranges", 16)) {
-      yaml2debug_aranges(OS, Obj.DWARF);
-    } else if (0 == strncmp(&Section.sectname[0], "__debug_pubnames", 16)) {
-      yaml2pubsection(OS, Obj.DWARF.PubNames);
-    } else if (0 == strncmp(&Section.sectname[0], "__debug_pubtypes", 16)) {
-      yaml2pubsection(OS, Obj.DWARF.PubTypes);
-    }
-  }
-  return Error::success();
-}
-
 Error MachOWriter::writeRebaseOpcodes(raw_ostream &OS) {
   MachOYAML::LinkEditData &LinkEdit = Obj.LinkEdit;
 
@@ -434,9 +440,9 @@ Error MachOWriter::writeLazyBindOpcodes(
 Error MachOWriter::writeNameList(raw_ostream &OS) {
   for (auto NLE : Obj.LinkEdit.NameList) {
     if (is64Bit)
-      writeNListEntry<MachO::nlist_64>(NLE, OS);
+      writeNListEntry<MachO::nlist_64>(NLE, OS, Obj.IsLittleEndian);
     else
-      writeNListEntry<MachO::nlist>(NLE, OS);
+      writeNListEntry<MachO::nlist>(NLE, OS, Obj.IsLittleEndian);
   }
   return Error::success();
 }

Modified: llvm/trunk/tools/yaml2obj/yaml2obj.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.h?rev=290381&r1=290380&r2=290381&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2obj.h (original)
+++ llvm/trunk/tools/yaml2obj/yaml2obj.h Thu Dec 22 15:58:03 2016
@@ -38,13 +38,12 @@ int yaml2coff(llvm::COFFYAML::Object &Do
 int yaml2elf(llvm::ELFYAML::Object &Doc, llvm::raw_ostream &Out);
 int yaml2macho(llvm::yaml::YamlObjectFile &Doc, llvm::raw_ostream &Out);
 
-void yaml2debug_abbrev(llvm::raw_ostream &OS,
-                       const llvm::DWARFYAML::Data &DI);
-void yaml2debug_str(llvm::raw_ostream &OS,
-                    const llvm::DWARFYAML::Data &DI);
+void yaml2debug_abbrev(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI);
+void yaml2debug_str(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI);
 
 void yaml2debug_aranges(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI);
 void yaml2pubsection(llvm::raw_ostream &OS,
-                     const llvm::DWARFYAML::PubSection &Sect);
+                     const llvm::DWARFYAML::PubSection &Sect,
+                     bool IsLittleEndian);
 
 #endif




More information about the llvm-commits mailing list