## This file contains test cases for generating sections in Mach-O object files.

## a) Test that yaml2obj emits sections and obj2yaml converts them back.

# RUN: yaml2obj --docnum=1 %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
    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:            0x100001160
#CHECK:         size:            3099
#CHECK:         offset:          0x1160
#CHECK:         align:           4
#CHECK:         reloff:          0x0
#CHECK:         nreloc:          0
#CHECK:         flags:           0x80000400
#CHECK:         reserved1:       0x0
#CHECK:         reserved2:       0x0
#CHECK:         reserved3:       0x0
#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

## b) Test that yaml2obj emits an error message if we specify an offset that
## makes the current section and the previous one overlap.

# RUN: not yaml2obj --docnum=2 %s -o %t2.macho 2>&1 | FileCheck %s --check-prefix=OVERLAP

# OVERLAP: yaml2obj: error: wrote too much data somewhere, section offsets in section __sec2 for segment __SEC don't line up: [cursor=0x121], [fileStart=0x0], [sectionOffset=0x1]

--- !mach-o
FileHeader:
  magic:      0xFEEDFACF
  cputype:    0x01000007
  cpusubtype: 0x80000003
  filetype:   0x00000002
  ncmds:      1
  sizeofcmds: 1024
  flags:      0x00000000
  reserved:   0x00000000
LoadCommands:
  - cmd:      LC_SEGMENT_64
    cmdsize:  0xff
    segname:  __SEC
    vmaddr:   0
    vmsize:   0
    fileoff:  0
    filesize: 0
    maxprot:  0
    initprot: 0
    nsects:   2
    flags:    0
    Sections:
      - sectname:  __sec1
        segname:   __SEC
        addr:      0x0000000000000000
        size:      2
        offset:    0x00000000
        align:     0
        reloff:    0x00000000
        nreloc:    0
        flags:     0x00000000
        reserved1: 0x00000000
        reserved2: 0x00000000
        reserved3: 0x00000000
      - sectname:  __sec2
        segname:   __SEC
        addr:      0x0000000000000000
        size:      2
        offset:    0x00000001 ## Specify an offset that makes __sec1 and __sec2 overlap.
        align:     1
        reloff:    0x00000000
        nreloc:    0
        flags:     0x00000000
        reserved1: 0x00000000
        reserved2: 0x00000000
        reserved3: 0x00000000
