Compiler projects using llvm
## This file contains test cases for generating .debug_pubnames/.debug_pubtypes
## section in object files from the DWARF entry of Mach-O YAML inputs

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

# RUN: yaml2obj %s | obj2yaml | FileCheck %s

--- !mach-o
FileHeader:      
  magic:           0xFEEDFACF
  cputype:         0x01000007
  cpusubtype:      0x00000003
  filetype:        0x0000000A
  ncmds:           1
  sizeofcmds:      1800
  flags:           0x00000000
  reserved:        0x00000000
LoadCommands:    
  - cmd:             LC_SEGMENT_64
    cmdsize:         232
    segname:         __DWARF
    vmaddr:          0
    vmsize:          0
    fileoff:         152
    filesize:        0xffff
    maxprot:         0
    initprot:        0
    nsects:          2
    flags:           0
    Sections:        
      - sectname:  __debug_pubnames
        segname:   __DWARF
        addr:      0x0000000000000000
        size:      27
        offset:    0x00000152
        align:     0
        reloff:    0x00000000
        nreloc:    0
        flags:     0x00000000
        reserved1: 0x00000000
        reserved2: 0x00000000
        reserved3: 0x00000000
      - sectname:  __debug_pubtypes
        segname:   __DWARF
        addr:      0x0000000000000000
        size:      35
        offset:    0x00000720
        align:     0
        reloff:    0x00000000
        nreloc:    0
        flags:     0x00000000
        reserved1: 0x00000000
        reserved2: 0x00000000
        reserved3: 0x00000000
DWARF:           
  debug_pubnames:  
    Length:          23
    Version:         2
    UnitOffset:      0
    UnitSize:        121
    Entries:         
      - DieOffset:       0x0000002A
        Name:            main
  debug_pubtypes:  
    Length:          31
    Version:         2
    UnitOffset:      0
    UnitSize:        121
    Entries:         
      - DieOffset:       0x00000060
        Name:            int
      - DieOffset:       0x00000071
        Name:            char

#      CHECK: DWARF:
#      CHECK:   debug_pubnames:
# CHECK-NEXT:     Length:          0x17
# CHECK-NEXT:     Version:         2
# CHECK-NEXT:     UnitOffset:      0
# CHECK-NEXT:     UnitSize:        121
# CHECK-NEXT:     Entries:
# CHECK-NEXT:       - DieOffset:       0x2A
# CHECK-NEXT:         Name:            main
# CHECK-NEXT:   debug_pubtypes:
# CHECK-NEXT:     Length:          0x1F
# CHECK-NEXT:     Version:         2
# CHECK-NEXT:     UnitOffset:      0
# CHECK-NEXT:     UnitSize:        121
# CHECK-NEXT:     Entries:
# CHECK-NEXT:       - DieOffset:       0x60
# CHECK-NEXT:         Name:            int
# CHECK-NEXT:       - DieOffset:       0x71
# CHECK-NEXT:         Name:            char
# CHECK-NEXT: ...

## b) Test that yaml2obj will not emit the .debug_pubnames/.debug_pubtypes section's
## contents, if the "debug_pubnames"/"debug_pubtypes" entry doesn't exist in the
## "DWARF" entry.

# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=EMPTY

#      EMPTY: Sections:
# EMPTY-NEXT:   - sectname:        __debug_pubnames
# EMPTY-NEXT:     segname:         __DWARF
# EMPTY-NEXT:     addr:            0x0
# EMPTY-NEXT:     size:            0
# EMPTY-NEXT:     offset:          0x0
# EMPTY-NEXT:     align:           0
# EMPTY-NEXT:     reloff:          0x0
# EMPTY-NEXT:     nreloc:          0
# EMPTY-NEXT:     flags:           0x0
# EMPTY-NEXT:     reserved1:       0x0
# EMPTY-NEXT:     reserved2:       0x0
# EMPTY-NEXT:     reserved3:       0x0
# EMPTY-NEXT:   - sectname:        __debug_pubtypes
# EMPTY-NEXT:     segname:         __DWARF
# EMPTY-NEXT:     addr:            0x0
# EMPTY-NEXT:     size:            0
# EMPTY-NEXT:     offset:          0x720
# EMPTY-NEXT:     align:           0
# EMPTY-NEXT:     reloff:          0x0
# EMPTY-NEXT:     nreloc:          0
# EMPTY-NEXT:     flags:           0x0
# EMPTY-NEXT:     reserved1:       0x0
# EMPTY-NEXT:     reserved2:       0x0
# EMPTY-NEXT:     reserved3:       0x0
# EMPTY-NEXT: ...

--- !mach-o
FileHeader:
  magic:      0xFEEDFACF
  cputype:    0x01000007
  cpusubtype: 0x00000003
  filetype:   0x0000000A
  ncmds:      1
  sizeofcmds: 1772
  flags:      0x00000000
  reserved:   0x00000000
LoadCommands:
  - cmd:      LC_SEGMENT_64
    cmdsize:  232
    segname:  __DWARF
    vmaddr:   0x00000000
    vmsize:   0x00000000
    fileoff:  0
    filesize: 0
    maxprot:  0
    initprot: 0
    nsects:   2
    flags:    0
    Sections:
      - sectname:  __debug_pubnames
        segname:   __DWARF
        addr:      0x0000000000000000
        size:      0
        offset:    0x00000000
        align:     0
        reloff:    0x00000000
        nreloc:    0
        flags:     0x00000000
        reserved1: 0x00000000
        reserved2: 0x00000000
        reserved3: 0x00000000
      - sectname:  __debug_pubtypes
        segname:   __DWARF
        addr:      0x0000000000000000
        size:      0
        offset:    0x00000720
        align:     0
        reloff:    0x00000000
        nreloc:    0
        flags:     0x00000000
        reserved1: 0x00000000
        reserved2: 0x00000000
        reserved3: 0x00000000
DWARF:

## c) Test that obj2yaml is able to dump a __debug_pubnames section whose length field is greater than the section size.

# RUN: yaml2obj --docnum=3 %s | obj2yaml | FileCheck %s --check-prefix=INVALID-LENGTH

#      INVALID-LENGTH: DWARF:
# INVALID-LENGTH-NEXT:   debug_pubnames:
# INVALID-LENGTH-NEXT:     Length:          0xDEADBEEF
# INVALID-LENGTH-NEXT:     Version:         2
# INVALID-LENGTH-NEXT:     UnitOffset:      0
# INVALID-LENGTH-NEXT:     UnitSize:        121
# INVALID-LENGTH-NEXT:     Entries:
# INVALID-LENGTH-NEXT:       - DieOffset:       0x2A
# INVALID-LENGTH-NEXT:         Name:            main

--- !mach-o
FileHeader:
  magic:      0xFEEDFACF
  cputype:    0x01000007
  cpusubtype: 0x00000003
  filetype:   0x0000000A
  ncmds:      1
  sizeofcmds: 1888
  flags:      0x00000000
  reserved:   0x00000000
LoadCommands:
  - cmd:      LC_SEGMENT_64
    cmdsize:  152
    segname:  __DWARF
    vmaddr:   0x00000000
    vmsize:   0x00000000
    fileoff:  0
    filesize: 0xffff
    maxprot:  0
    initprot: 0
    nsects:   1
    flags:    0
    Sections:
      - sectname:  __debug_pubnames
        segname:   __DWARF
        addr:      0x0000000000000000
        size:      24
        offset:    0x000000b8
        align:     0
        reloff:    0x00000000
        nreloc:    0
        flags:     0x00000000
        reserved1: 0x00000000
        reserved2: 0x00000000
        reserved3: 0x00000000
DWARF:
  debug_pubnames:
    Length:     0xdeadbeef
    Version:    2
    UnitOffset: 0
    UnitSize:   121
    Entries:
      - DieOffset: 0x0000002A
        Name:      main