## Test how we dump the .debug_ranges section.

## a) Test dumping the .debug_ranges section from various object files with
## different endian and bits.

## Dump the .debug_ranges section from a 32-bit little endian object file where
## the address_size of debug_info is 4.
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DLOWOFFSET=0xFFFFFFFF \
# RUN:   -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x4 \
# RUN:     -DOFFSET=0x18 -DLOWOFFSET=0xFFFFFFFF -DHIGHOFFSET=0x10

## Dump the .debug_ranges section from a 32-bit big endian object file where the
## address_size of debug_info is 4.
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DENDIAN=MSB -DLOWOFFSET=0xFFFFFFFF \
# RUN:   -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x4 \
# RUN:     -DOFFSET=0x18 -DLOWOFFSET=0xFFFFFFFF -DHIGHOFFSET=0x10

## Dump the .debug_ranges section from a 32-bit little endian object file where
## the address_size of debug_info is 8.
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DADDRSIZE1=8 \
# RUN:   -DADDRSIZE2=8 -DADDRSIZE3=8 -DADDRSIZE4=8 \
# RUN:   -DLOWOFFSET=0xFFFFFFFFFFFFFFFF -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x8 \
# RUN:     -DOFFSET=0x30 -DLOWOFFSET=0xFFFFFFFFFFFFFFFF \
# RUN:     -DHIGHOFFSET=0x10

## Dump the .debug_ranges section from a 32-bit big endian object file where the
## address_size of debug_info is 8.
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DENDIAN=MSB -DADDRSIZE1=8 \
# RUN:   -DADDRSIZE2=8 -DADDRSIZE3=8 -DADDRSIZE4=8 \
# RUN:   -DLOWOFFSET=0xFFFFFFFFFFFFFFFF -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x8 \
# RUN:     -DOFFSET=0x30 -DLOWOFFSET=0xFFFFFFFFFFFFFFFF -DHIGHOFFSET=0x10

## Dump the .debug_ranges section from a 64-bit little endian object file where
## the address_size of debug_info is 8.
# RUN: yaml2obj --docnum=1 %s -DLOWOFFSET=0xFFFFFFFFFFFFFFFF \
# RUN:   -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x8 \
# RUN:     -DOFFSET=0x30 -DLOWOFFSET=0xFFFFFFFFFFFFFFFF -DHIGHOFFSET=0x10

## Dump the .debug_ranges section from a 64-bit big endian object file where the
## address_size of debug_info is 8.
# RUN: yaml2obj --docnum=1 %s -DENDIAN=MSB -DLOWOFFSET=0xFFFFFFFFFFFFFFFF \
# RUN:   -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x8 \
# RUN:     -DOFFSET=0x30 -DLOWOFFSET=0xFFFFFFFFFFFFFFFF -DHIGHOFFSET=0x10

## Dump the .debug_ranges section from a 64-bit little endian object file where
## the address_size of debug_info is 4.
# RUN: yaml2obj --docnum=1 %s -DADDRSIZE1=4 -DADDRSIZE2=4 -DADDRSIZE3=4 \
# RUN:   -DADDRSIZE4=4 -DLOWOFFSET=0xFFFFFFFFFFFFFFFF \
# RUN:   -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x4 \
# RUN:     -DOFFSET=0x18 -DLOWOFFSET=0xFFFFFFFF -DHIGHOFFSET=0x10

## Dump the .debug_ranges section from a 64-bit big endian object file where the
## address_size of debug_info is 4.
# RUN: yaml2obj --docnum=1 %s -DADDRSIZE1=4 -DADDRSIZE2=4 -DADDRSIZE3=4 \
# RUN:   -DADDRSIZE4=4 -DLOWOFFSET=0xFFFFFFFFFFFFFFFF \
# RUN:   -DHIGHOFFSET=0x10 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC -DADDRSIZE=0x4 \
# RUN:     -DOFFSET=0x18 -DLOWOFFSET=0xFFFFFFFF -DHIGHOFFSET=0x10


#  BASIC-NOT: debug_ranges
#      BASIC: debug_ranges:
# BASIC-NEXT:   - Offset:   0x0
# BASIC-NEXT:     AddrSize: [[ADDRSIZE]]
# BASIC-NEXT:     Entries:
# BASIC-NEXT:       - LowOffset:  0x10
# BASIC-NEXT:         HighOffset: 0x20
# BASIC-NEXT:       - LowOffset:  0x30
# BASIC-NEXT:         HighOffset: 0x40
# BASIC-NEXT:   - Offset:   [[OFFSET]]
# BASIC-NEXT:     AddrSize: [[ADDRSIZE]]
# BASIC-NEXT:     Entries:
# BASIC-NEXT:       - LowOffset:  [[LOWOFFSET]]
# BASIC-NEXT:         HighOffset: [[HIGHOFFSET]]

--- !ELF
FileHeader:
  Class: ELFCLASS[[BITS=64]]
  Data:  ELFDATA2[[ENDIAN=LSB]]
  Type:  ET_EXEC
DWARF:
  ## The debug_ranges parser depends on the address_size field
  ## of compilation units. We add the .debug_info section to
  ## assist the parser.
  debug_info:
    - Version:  4
      AddrSize: [[ADDRSIZE1=<none>]]
    - Version:  4
      AddrSize: [[ADDRSIZE2=<none>]]
  debug_ranges:
    - AddrSize: [[ADDRSIZE3=<none>]]
      Entries:
        - LowOffset:  0x10
          HighOffset: 0x20
        - LowOffset:  0x30
          HighOffset: 0x40
    - AddrSize: [[ADDRSIZE4=<none>]]
      Entries:
        - LowOffset:  [[LOWOFFSET=0x10]]
          HighOffset: [[HIGHOFFSET=0x20]]

## b) Test that obj2yaml dumps the .debug_ranges as a raw content section when
## the parser fails. In this case, the address_size of the two compilation units
## doesn't match.

# RUN: yaml2obj --docnum=1 -DADDRSIZE1=4 -DADDRSIZE2=8 %s | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=RAW --implicit-check-not=debug_ranges

#      RAW: - Name:         .debug_ranges
# RAW-NEXT:   Type:         SHT_PROGBITS
# RAW-NEXT:   AddressAlign: 0x1
# RAW-NEXT:   Content:      '1000000000000000
##                           ^--------------- LowOffset
# RAW-SAME:             {{^}}2000000000000000
##                           ^--------------- HighOffset
# RAW-SAME:             {{^}}3000000000000000
##                           ^--------------- LowOffset
# RAW-SAME:             {{^}}4000000000000000
##                           ^--------------- HighOffset
# RAW-SAME:             {{^}}0000000000000000
##                           ^---------------
# RAW-SAME:             {{^}}0000000000000000
##                           ---------------- terminator
# RAW-SAME:             {{^}}1000000000000000
##                           ^--------------- LowOffset
# RAW-SAME:             {{^}}2000000000000000
##                           ^--------------- HighOffset
# RAW-SAME:             {{^}}0000000000000000
##                           ^---------------
# RAW-SAME:             {{^}}0000000000000000'
##                           ---------------- terminator

## c) Test dumping an empty .debug_ranges section.

# RUN: yaml2obj --docnum=2 %s | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=EMPTY --implicit-check-not=Sections:

#      EMPTY: DWARF:
# EMPTY-NEXT:   debug_ranges: []

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
DWARF:
  debug_ranges: []

## d) Test dumping a .debug_ranges section whose section header properties are
## overridden.

## Override the sh_type field.
# RUN: yaml2obj --docnum=3 -DTYPE=SHT_STRTAB %s | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=STRTAB --check-prefixes=COMMON

## Override the sh_flags field.
# RUN: yaml2obj --docnum=3 -DFLAGS=[SHF_ALLOC] %s | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=PROGBITS --check-prefixes=COMMON,FLAGS

## Override the sh_link field.
# RUN: yaml2obj --docnum=3 -DLINK='.sec' %s | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=PROGBITS --check-prefixes=COMMON,LINK

## Override the sh_entsize field.
# RUN: yaml2obj --docnum=3 -DENTSIZE=3 %s | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=PROGBITS --check-prefixes=COMMON,ENTSIZE

## Override the sh_info field.
# RUN: yaml2obj --docnum=3 -DINFO=3 %s | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=PROGBITS --check-prefixes=COMMON,INFO

## Override the sh_addralign field.
# RUN: yaml2obj --docnum=3 -DADDRALIGN=3 %s | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=PROGBITS --check-prefixes=COMMON,ADDRALIGN

## Override the sh_address field.
# RUN: yaml2obj --docnum=3 -DADDRESS=0x2020 %s | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=PROGBITS --check-prefixes=COMMON,ADDRESS

#         COMMON: - Name:         .debug_ranges
#    COMMON-NEXT:   Type:         SHT_[[TYPE]]
#     FLAGS-NEXT:   Flags:        [ SHF_ALLOC ]
#      LINK-NEXT:   Link:         .sec
#   ENTSIZE-NEXT:   EntSize:      0x3
#      INFO-NEXT:   Info:         0x3
# ADDRALIGN-NEXT:   AddressAlign: 0x3
#   ADDRESS-NEXT:   Address:      0x2020

#         COMMON: debug_ranges:
#    COMMON-NEXT:   - Offset:   0x0
#    COMMON-NEXT:     AddrSize: 0x8
#    COMMON-NEXT:     Entries:
#    COMMON-NEXT:       - LowOffset:  0x10
#    COMMON-NEXT:         HighOffset: 0x20

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name:         .debug_ranges
    Type:         [[TYPE=SHT_PROGBITS]]
    Flags:        [[FLAGS=<none>]]
    Link:         [[LINK=<none>]]
    EntSize:      [[ENTSIZE=<none>]]
    Info:         [[INFO=<none>]]
    AddressAlign: [[ADDRALIGN=0]]
    Address:      [[ADDRESS=<none>]]
  - Name:         .sec
    Type:         SHT_PROGBITS
DWARF:
  debug_info:
    - Version:  4
      AddrSize: 8
  debug_ranges:
    - Entries:
        - LowOffset:  0x10
          HighOffset: 0x20
