## Test how we dump the .debug_addr section.

## a) Dumping address tables from various object files.

## Dumping address tables from a little endian 64-bit object file.
# RUN: yaml2obj --docnum=1 %s -DADDRESS=0xFFFFFFFFFFFFFFFF \
# RUN:   -DADDRSIZE=4 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
# RUN:     -DLENGTH1=0x14 -DADDRSIZE1=0x8 -DADDR=0xFFFFFFFFFFFFFFFF \
# RUN:     -DLENGTH2=0xC -DADDRSIZE2=0x4

## Dumping address tables from a big endian 64-bit object file.
# RUN: yaml2obj --docnum=1 %s -DENDIAN=MSB -DADDRESS=0xFFFFFFFFFFFFFFFF \
# RUN:   -DADDRSIZE=4 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
# RUN:     -DLENGTH1=0x14 -DADDRSIZE1=0x8 -DADDR=0xFFFFFFFFFFFFFFFF \
# RUN:     -DLENGTH2=0xC -DADDRSIZE2=0x4

## Dumping address tables from a little endian 32-bit object file.
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DADDRESS=0xFFFFFFFF \
# RUN:   -DADDRSIZE=8 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
# RUN:     -DLENGTH1=0xC -DADDRSIZE1=0x4 -DADDR=0xFFFFFFFF \
# RUN:     -DLENGTH2=0x14 -DADDRSIZE2=0x8

## Dumping address tables from a big endian 32-bit object file.
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DENDIAN=MSB -DADDRESS=0xFFFFFFFF \
# RUN:   -DADDRSIZE=8 | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
# RUN:     -DLENGTH1=0xC -DADDRSIZE1=0x4 -DADDR=0xFFFFFFFF \
# RUN:     -DLENGTH2=0x14 -DADDRSIZE2=0x8

#      BASIC: DWARF:
# BASIC-NEXT:   debug_addr:
# BASIC-NEXT:     - Length:      [[LENGTH1]]
# BASIC-NEXT:       Version:     0x5
# BASIC-NEXT:       AddressSize: [[ADDRSIZE1]]
# BASIC-NEXT:       Entries:
# BASIC-NEXT:         - Address: 0x1234
# BASIC-NEXT:         - Address: 0x5678
# BASIC-NEXT:     - Format:      DWARF64
# BASIC-NEXT:       Length:      [[LENGTH1]]
# BASIC-NEXT:       Version:     0x5
# BASIC-NEXT:       AddressSize: [[ADDRSIZE1]]
# BASIC-NEXT:       Entries:
# BASIC-NEXT:         - Address: 0x1234
# BASIC-NEXT:         - Address: [[ADDR]]
# BASIC-NEXT:     - Length:      [[LENGTH2]]
# BASIC-NEXT:       Version:     0x5
# BASIC-NEXT:       AddressSize: [[ADDRSIZE2]]
# BASIC-NEXT:       Entries:
# BASIC-NEXT:         - Address: 0x1234
# BASIC-NEXT:         - Address: 0x5678
# BASIC-NEXT:     - Format:      DWARF64
# BASIC-NEXT:       Length:      [[LENGTH2]]
# BASIC-NEXT:       Version:     0x5
# BASIC-NEXT:       AddressSize: [[ADDRSIZE2]]
# BASIC-NEXT:       Entries:
# BASIC-NEXT:         - Address: 0x1234
# BASIC-NEXT:         - Address: 0x5678
# BASIC-NEXT: ...

--- !ELF
FileHeader:
  Class: ELFCLASS[[BITS=64]]
  Data:  ELFDATA2[[ENDIAN=LSB]]
  Type:  ET_EXEC
DWARF:
  debug_addr:
    ## A DWARF32 address table.
    - Version:     5
      Entries:
        - Address: 0x1234
        - Address: 0x5678
    ## A DWARF64 address table.
    - Format:      DWARF64
      Version:     5
      Entries:
        - Address: 0x1234
        - Address: [[ADDRESS]]
    ## A DWARF32 address table with a mutable address size.
    - Version:     5
      AddressSize: [[ADDRSIZE]]
      Entries:
        - Address: 0x1234
        - Address: 0x5678
    ## A DWARF64 address table with a mutable address size.
    - Format:      DWARF64
      Version:     5
      AddressSize: [[ADDRSIZE]]
      Entries:
        - Address: 0x1234
        - Address: 0x5678

## b) Test dumping a .debug_addr section whose section header properties are
## overridden.

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

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

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

## Override the sh_addr field.
# RUN: yaml2obj --docnum=2 %s -DADDRESS=0x2020 | obj2yaml | \
# RUN:   FileCheck %s -DTYPE=SHT_PROGBITS --check-prefixes=COMMON,ADDR

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

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

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

#         COMMON: Sections:
#    COMMON-NEXT:   - Name:         .debug_addr
#    COMMON-NEXT:     Type:         [[TYPE]]
#     FLAGS-NEXT:     Flags:        [ SHF_ALLOC ]
#      LINK-NEXT:     Link:         .sec
#      ADDR-NEXT:     Address:      0x2020
# ADDRALIGN-NEXT:     AddressAlign: 0x3
#   ENTSIZE-NEXT:     EntSize:      0x3
#      INFO-NEXT:     Info:         0x3
#    COMMON-NEXT:   - Name:         .sec
#    COMMON-NEXT:     Type:         SHT_PROGBITS
#    COMMON-NEXT: DWARF:
#    COMMON-NEXT:   debug_addr:
#    COMMON-NEXT:     - Length:      0x14
#    COMMON-NEXT:       Version:     0x5
#    COMMON-NEXT:       AddressSize: 0x8
#    COMMON-NEXT:       Entries:
#    COMMON-NEXT:         - Address: 0x1234
#    COMMON-NEXT:         - Address: 0x5678
#    COMMON-NEXT: ...

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name:         .debug_addr
    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_addr:
    - Version: 5
      Entries:
        - Address: 0x1234
        - Address: 0x5678

## c) Test dumping an address table whose version isn't 5.
## This causes the DWARF parser to fail to parse it and we will dump it as a raw
## content section.

# RUN: yaml2obj --docnum=3 %s -DCONTENT="AABBCC" | obj2yaml | \
# RUN:   FileCheck %s --check-prefix=RAW --implicit-check-not=DWARF:

#      RAW: Sections:
# RAW-NEXT:   - Name:         .debug_addr
# RAW-NEXT:     Type:         SHT_PROGBITS
# RAW-NEXT:     AddressAlign: 0x1
# RAW-NEXT:     Content:      AABBCC
# RAW-NEXT: ...

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name:         .debug_addr
    Type:         SHT_PROGBITS
    AddressAlign: 1
    Size:         [[SIZE=<none>]]
    Content:      [[CONTENT=<none>]]

## d) Test dumping an empty .debug_addr section.

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

#      EMPTY: DWARF:
# EMPTY-NEXT:   debug_addr: []
# EMPTY-NEXT: ...
