llvm/llvm/test/tools/yaml2obj/ELF/DWARF/debug-aranges.yaml

## Test that yaml2obj emits .debug_aranges section.

## a) Generate the .debug_aranges section from the "DWARF" entry.

## Generate and verify a big endian DWARF32 .debug_aranges section.

# RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2MSB -DFORMAT=DWARF32 %s -o %t.be.o
# RUN: llvm-readobj --sections --section-data %t.be.o | \
# RUN:   FileCheck -DADDRALIGN=1 -DSIZE=96 %s --check-prefixes=DWARF-HEADER,DWARF-BE-CONTENT

#          DWARF-HEADER: Index: 1
#     DWARF-HEADER-NEXT: Name: .debug_aranges (1)
#     DWARF-HEADER-NEXT: Type: SHT_PROGBITS (0x1)
#     DWARF-HEADER-NEXT: Flags [ (0x0)
#     DWARF-HEADER-NEXT: ]
#     DWARF-HEADER-NEXT: Address: 0x0
#     DWARF-HEADER-NEXT: Offset: 0x40
#     DWARF-HEADER-NEXT: Size: [[SIZE]]
#     DWARF-HEADER-NEXT: Link: 0
#     DWARF-HEADER-NEXT: Info: 0
#     DWARF-HEADER-NEXT: AddressAlignment: [[ADDRALIGN]]
#     DWARF-HEADER-NEXT: EntrySize: 0
# DWARF-BE-CONTENT-NEXT: SectionData (
# DWARF-BE-CONTENT-NEXT:   0000: 0000002C 00020000 00000400 00000000
##                               |        |   |        | |  |
##                               |        |   |        | |  +------- Padding zeros (4-byte)
##                               |        |   |        | +- SegSize (1-byte) 0x00
##                               |        |   |        +- AddrSize (1-byte) 0x04
##                               |        |   +-------- CuOffset (4-byte) 0x00
##                               |        +--- Version (2-byte) 0x02
##                               +------- InitialLength (4-byte) 0x2c
##
# DWARF-BE-CONTENT-NEXT:   0010: 00001234 00000020 00000000 00000000
##                               |        |        |
##                               |        |        +---------------- Terminating Entry
##                               |        +------- Length (4-byte) 0x20
##                               +------- Address (4-byte) 0x1234
##
# DWARF-BE-CONTENT-NEXT:   0020: 0000002C 00020000 00650800 00000000
##                               |        |   |        | |  |
##                               |        |   |        | |  +------- Padding zeros (4-byte)
##                               |        |   |        | +- SegSize (1-byte) 0x00
##                               |        |   |        +- AddrSize (1-byte) 0x08
##                               |        |   +-------- CuOffset (4-byte) 0x00
##                               |        +--- Version (2-byte) 0x02
##                               +------- InitialLength (4-byte) 0x2c
##
# DWARF-BE-CONTENT-NEXT:   0030: 00000000 00005678 00000000 00000020
##                               |                 |
##                               |                 +---------------- Length (8-byte) 0x20
##                               +---------------- Address (8-byte) 0x5678
##
# DWARF-BE-CONTENT-NEXT:   0040: 00000000 56780000 00000000 00000010
##                               |                 |
##                               |                 +---------------- Length (8-byte) 0x10
##                               +---------------- Address (8-byte) 0x5678
##
# DWARF-BE-CONTENT-NEXT:   0050: 00000000 00000000 00000000 00000000
##                               |
##                               +---------------------------------- Terminating entry
##
# DWARF-BE-CONTENT-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  [[ENDIAN]]
  Type:  ET_EXEC
DWARF:
  debug_aranges:
    - Format:               [[FORMAT]]
      Length:               0x2c
      Version:              2
      CuOffset:             0
      AddressSize:          0x04
      SegmentSelectorSize:  0x00
      Descriptors:
        - Address: 0x00001234
          Length:  0x20
    - Format:              [[FORMAT]]
      Length:              0x2c
      Version:             2
      CuOffset:            0x65
      AddressSize:         0x08
      SegmentSelectorSize: 0x00
      Descriptors:
        - Address: 0x0000000000005678
          Length:  0x20
        - Address: 0x0000000056780000
          Length:  0x10

## Generate and verify a little endian DWARF32 .debug_aranges section.

# RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2LSB -DFORMAT=DWARF32 %s -o %t.le.o
# RUN: llvm-readobj --sections --section-data %t.le.o | \
# RUN:   FileCheck -DADDRALIGN=1 -DSIZE=96 %s --check-prefixes=DWARF-HEADER,DWARF-LE-CONTENT

# DWARF-LE-CONTENT-NEXT: SectionData (
# DWARF-LE-CONTENT-NEXT:   0000: 2C000000 02000000 00000400 00000000
##                               |        |   |        | |  |
##                               |        |   |        | |  +------- Padding zeros (4-byte)
##                               |        |   |        | +- SegSize (1-byte) 0x00
##                               |        |   |        +- AddrSize (1-byte) 0x04
##                               |        |   +-------- CuOffset (4-byte) 0x00
##                               |        +--- Version (2-byte) 0x02
##                               +------- InitialLength (4-byte) 0x2c
##
# DWARF-LE-CONTENT-NEXT:   0010: 34120000 20000000 00000000 00000000
##                               |        |        |
##                               |        |        +---------------- Terminating Entry
##                               |        +------- Length (4-byte) 0x20
##                               +------- Address (4-byte) 0x1234
##
# DWARF-LE-CONTENT-NEXT:   0020: 2C000000 02006500 00000800 00000000
##                               |        |   |        | |  |
##                               |        |   |        | |  +------- Padding zeros (4-byte)
##                               |        |   |        | +- SegSize (1-byte) 0x00
##                               |        |   |        +- AddrSize (1-byte) 0x08
##                               |        |   +-------- CuOffset (4-byte) 0x00
##                               |        +--- Version (2-byte) 0x02
##                               +------- InitialLength (4-byte) 0x2c
##
# DWARF-LE-CONTENT-NEXT:   0030: 78560000 00000000 20000000 00000000
##                               |                 |
##                               |                 +---------------- Length (8-byte) 0x20
##                               +---------------- Address (8-byte) 0x5678
##
# DWARF-LE-CONTENT-NEXT:   0040: 00007856 00000000 10000000 00000000
##                               |                 |
##                               |                 +---------------- Length (8-byte) 0x10
##                               +---------------- Address (8-byte) 0x5678
##
# DWARF-LE-CONTENT-NEXT:   0050: 00000000 00000000 00000000 00000000
##                               |
##                               +---------------------------------- Terminating entry
##
# DWARF-LE-CONTENT-NEXT: )

## Generate and verify a big endian DWARF64 .debug_aranges section.

# RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2MSB -DFORMAT=DWARF64 %s -o %t.be.dwarf64.o
# RUN: llvm-readobj --sections --section-data %t.be.dwarf64.o | \
# RUN:   FileCheck -DADDRALIGN=1 -DSIZE=120 %s --check-prefixes=DWARF-HEADER,DWARF64-BE-CONTENT

# DWARF64-BE-CONTENT-NEXT: SectionData (
# DWARF64-BE-CONTENT-NEXT:   0000: FFFFFFFF 00000000 0000002C 00020000
##                                 |        |                 |   |
##                                 |        |                 |   +--- CuOffset (8-byte) 0x00
##                                 |        |                 +--- Version (2-byte) 0x02
##                                 |        +---------------- Length (8-byte) 0x2c
##                                 +------- DWARF64 Prefix (4-byte) UINT32_MAX
##
# DWARF64-BE-CONTENT-NEXT:   0010: 00000000 00000400 00001234 00000020
##                                 |            | |  |        |
##                                 |            | |  |        +------- Length (4-byte) 0x20
##                                 |            | |  +------- Address (4-byte) 0x1234
##                                 |            | +- SegSize (1-byte) 0x00
##                                 |            +- AddrSize (1-byte) 0x04
##                                 +------------ Lower bytes of CuOffset
##
# DWARF64-BE-CONTENT-NEXT:   0020: 00000000 00000000 FFFFFFFF 00000000
##                                 |                 |        +------- Length (8-byte) 0x2c
##                                 |                 +------- DWARF64 Prefix
##                                 +---------------- Terminating Entry (8-byte) 0x00
##
# DWARF64-BE-CONTENT-NEXT:   0030: 0000002C 00020000 00000000 00650800
##                                 |        |   |                 | |
##                                 |        |   |                 | +- SegSize (1-byte) 0x00
##                                 |        |   |                 +- AddrSize (1-byte) 0x08
##                                 |        |   +----------------- CuOffset (8-byte) 0x65
##                                 |        +--- Version (2-byte) 0x02
##                                 +------- Lower bytes of Length
##
# DWARF64-BE-CONTENT-NEXT:   0040: 00000000 00000000 00000000 00005678
##                                 |                 |
##                                 |                 +---------------- Address (8-byte) 0x5678
##                                 +---------------- Padding zeros (8-byte)
##
# DWARF64-BE-CONTENT-NEXT:   0050: 00000000 00000020 00000000 56780000
##                                 |                 |
##                                 |                 +---------------- Address (8-byte) 0x56780000
##                                 +---------------- Length (8-byte) 0x20
##
# DWARF64-BE-CONTENT-NEXT:   0060: 00000000 00000010 00000000 00000000
##                                 |                 |
##                                 |                 +---------------- Terminating Entry (16-byte) 0x00
##                                 +---------------- Length (8-byte) 0x10
##
# DWARF64-BE-CONTENT-NEXT:   0070: 00000000 00000000
##                                 |
##                                 +---------------- The last bytes of terminating entry.
# DWARF64-BE-CONTENT-NEXT: )

## Generate and verify a little endian DWARF64 .debug_aranges section.

# RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2LSB -DFORMAT=DWARF64 %s -o %t.le.dwarf64.o
# RUN: llvm-readobj --sections --section-data %t.le.dwarf64.o | \
# RUN:   FileCheck -DADDRALIGN=1 -DSIZE=120 %s --check-prefixes=DWARF-HEADER,DWARF64-LE-CONTENT

# DWARF64-LE-CONTENT-NEXT: SectionData (
# DWARF64-LE-CONTENT-NEXT:   0000: FFFFFFFF 2C000000 00000000 02000000
##                                 |        |                 |   |
##                                 |        |                 |   +--- CuOffset (8-byte) 0x00
##                                 |        |                 +--- Version (2-byte) 0x02
##                                 |        +---------------- Length (8-byte) 0x2c
##                                 +------- DWARF64 Prefix (4-byte) UINT32_MAX
##
# DWARF64-LE-CONTENT-NEXT:   0010: 00000000 00000400 34120000 20000000
##                                 |            | |  |        |
##                                 |            | |  |        +------- Length (4-byte) 0x20
##                                 |            | |  +------- Address (4-byte) 0x1234
##                                 |            | +- SegSize (1-byte) 0x00
##                                 |            +- AddrSize (1-byte) 0x04
##                                 +------------ Lower bytes of CuOffset
##
# DWARF64-LE-CONTENT-NEXT:   0020: 00000000 00000000 FFFFFFFF 2C000000
##                                 |                 |        +------- Length (8-byte) 0x2c
##                                 |                 +------- DWARF64 Prefix
##                                 +---------------- Terminating Entry (8-byte) 0x00
##
# DWARF64-LE-CONTENT-NEXT:   0030: 00000000 02006500 00000000 00000800
##                                 |        |   |                 | |
##                                 |        |   |                 | +- SegSize (1-byte) 0x00
##                                 |        |   |                 +- AddrSize (1-byte) 0x08
##                                 |        |   +----------------- CuOffset (8-byte) 0x65
##                                 |        +--- Version (2-byte) 0x02
##                                 +------- Lower bytes of Length
##
# DWARF64-LE-CONTENT-NEXT:   0040: 00000000 00000000 78560000 00000000
##                                 |                 |
##                                 |                 +---------------- Address (8-byte) 0x5678
##                                 +---------------- Padding zeros (8-byte)
##
# DWARF64-LE-CONTENT-NEXT:   0050: 20000000 00000000 00007856 00000000
##                                 |                 |
##                                 |                 +---------------- Address (8-byte) 0x56780000
##                                 +---------------- Length (8-byte) 0x20
##
# DWARF64-LE-CONTENT-NEXT:   0060: 10000000 00000000 00000000 00000000
##                                 |                 |
##                                 |                 +---------------- Terminating Entry (16-byte) 0x00
##                                 +---------------- Length (8-byte) 0x10
##
# DWARF64-LE-CONTENT-NEXT:   0070: 00000000 00000000
##                                 |
##                                 +---------------- The last bytes of terminating entry.
# DWARF64-LE-CONTENT-NEXT: )

## b) Generate the .debug_aranges section from raw section content.

# RUN: yaml2obj --docnum=2 %s -o %t2.o
# RUN: llvm-readobj --sections --section-data %t2.o | \
# RUN:   FileCheck %s -DADDRALIGN=0 -DSIZE=3 --check-prefixes=DWARF-HEADER,ARBITRARY-CONTENT

#      ARBITRARY-CONTENT: SectionData (
# ARBITRARY-CONTENT-NEXT:   0000: 112233
# ARBITRARY-CONTENT-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2MSB
  Type:  ET_EXEC
Sections:
  - Name:    .debug_aranges
    Type:    SHT_PROGBITS
    Content: "112233"

## c) Generate the .debug_aranges section when the "Size" is specified.

# RUN: yaml2obj --docnum=3 %s -o %t3.o
# RUN: llvm-readobj --hex-dump=.debug_aranges %t3.o | FileCheck %s --check-prefix=SIZE

#       SIZE: Hex dump of section '.debug_aranges':
#  SIZE-NEXT: 0x00000000 00000000 00000000 00000000 00000000 ................
# SIZE-EMPTY:

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2MSB
  Type:  ET_EXEC
Sections:
  - Name: .debug_aranges
    Type: SHT_PROGBITS
    Size: 0x10

## d) Test that yaml2obj emits an error message when both the "Size" and the
## "debug_aranges" entry are specified at the same time.

# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=ERROR

# ERROR: yaml2obj: error: cannot specify section '.debug_aranges' contents in the 'DWARF' entry and the 'Content' or 'Size' in the 'Sections' entry at the same time

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2MSB
  Type:  ET_EXEC
Sections:
  - Name: .debug_aranges
    Type: SHT_PROGBITS
    Size: 0x10
DWARF:
  debug_aranges:
    - Length:              0x2c
      Version:             2
      CuOffset:            0
      AddressSize:         0x08
      SegmentSelectorSize: 0x00
      Descriptors:
        - Address: 0x0000000000001234
          Length:  0x20

## e) Test that yaml2obj emits an error message when both the "Content" and the
## "debug_aranges" entry are specified at the same time.

# RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=ERROR

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2MSB
  Type:  ET_EXEC
Sections:
  - Name:    .debug_aranges
    Type:    SHT_PROGBITS
    Content: "00"
DWARF:
  debug_aranges:
    - Length:              0x2c
      Version:             2
      CuOffset:            0
      AddressSize:         0x08
      SegmentSelectorSize: 0x00
      Descriptors:
        - Address: 0x0000000000001234
          Length:  0x20

## f) Test that all the properties can be overridden by the section header when
## the "debug_aranges" entry doesn't exist.

# RUN: yaml2obj --docnum=6 %s -o %t6.o
# RUN: llvm-readelf --sections %t6.o | FileCheck %s --check-prefix=OVERRIDDEN

#      OVERRIDDEN: [Nr] Name           Type   Address          Off    Size   ES Flg Lk Inf Al
#      OVERRIDDEN: [ 1] .debug_aranges STRTAB 0000000000002020 000050 000030 01   A  2   1  2
# OVERRIDDEN-NEXT: [ 2] .sec           STRTAB 0000000000000000 000080 000000 00      0   0  0

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2MSB
  Type:  ET_EXEC
Sections:
  - Name:         .debug_aranges
    Type:         SHT_STRTAB         # SHT_PROGBITS by default.
    Flags:        [SHF_ALLOC]        # 0 by default.
    Link:         .sec               # 0 by default.
    EntSize:      1                  # 0 by default.
    Info:         1                  # 0 by default.
    AddressAlign: 2                  # 0 by default.
    Address:      0x0000000000002020 # 0x00 by default.
    Offset:       0x00000050         # 0x40 for the first section.
    Size:         0x30               # Set the "Size" so that we can reuse the check tag "OVERRIDDEN".
  - Name:         .sec               # Linked by .debug_aranges.
    Type:         SHT_STRTAB

## g) Test that all the properties can be overridden by the section header when
## the "debug_aranges" entry exists.

# RUN: yaml2obj --docnum=7 %s -o %t7.o
# RUN: llvm-readelf --sections %t7.o | FileCheck %s --check-prefix=OVERRIDDEN

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2MSB
  Type:  ET_EXEC
Sections:
  - Name:         .debug_aranges
    Type:         SHT_STRTAB         # SHT_PROGBITS by default.
    Flags:        [SHF_ALLOC]        # 0 by default.
    Link:         .sec               # 0 by default.
    EntSize:      1                  # 0 by default.
    Info:         1                  # 0 by default.
    AddressAlign: 2                  # 1 by default.
    Address:      0x0000000000002020 # 0x00 by default.
    Offset:       0x00000050         # 0x40 for the first section.
  - Name:         .sec               # Linked by .debug_aranges.
    Type:         SHT_STRTAB
DWARF:
  debug_aranges:
    - Length:              0x2c
      Version:             2
      CuOffset:            0
      AddressSize:         0x08
      SegmentSelectorSize: 0x00
      Descriptors:
        - Address: 0x0000000000001234
          Length:  0x20

## h) Test that yaml2obj still generates a .debug_aranges section if we assign an invalid value
## to 'AddrSize' when the 'Descriptors' list is empty.

# RUN: yaml2obj --docnum=8 %s -o %t8.o
# RUN: llvm-readelf --hex-dump=.debug_aranges %t8.o | \
# RUN:   FileCheck %s --check-prefix=ADDR-SIZE

#      ADDR-SIZE: Hex dump of section '.debug_aranges':
# ADDR-SIZE-NEXT: 0x00000000 2c000000 02000000 00000700 00000000
##                                                 ^~ address_size (1-byte) 0x07
# ADDR-SIZE-NEXT: 0x00000010 00000000 00000000 00000000

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
DWARF:
  debug_aranges:
    - Length:              0x2c
      Version:             2
      CuOffset:            0
      AddressSize:         0x07 ## Invalid address_size.
      SegmentSelectorSize: 0
      Descriptors:         []

## i) Test that yaml2obj emits an error message if we try to assign an invalid value to
## 'AddrSize' when the 'Descriptors' list isn't empty.

# RUN: not yaml2obj --docnum=9 %s 2>&1 | \
# RUN:   FileCheck %s --check-prefix=INVALID-SIZE

# INVALID-SIZE: yaml2obj: error: unable to write debug_aranges address: invalid integer write size: 7

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
DWARF:
  debug_aranges:
    - Length:              0x2c
      Version:             2
      CuOffset:            0
      AddressSize:         0x07 ## Invalid address_size.
      SegmentSelectorSize: 0
      Descriptors:
        - Address: 0x1234
          Length:  0x1000

## j) Test the default value of address_size and segment_selector_size in a 64/32-bit object file.

# RUN: yaml2obj --docnum=10 -DCLASS=ELFCLASS64 %s -o %t10.64-bit.o
# RUN: llvm-readelf --hex-dump=.debug_aranges %t10.64-bit.o | \
# RUN:   FileCheck %s --check-prefix=DEFAULT64

#      DEFAULT64: Hex dump of section '.debug_aranges':
# DEFAULT64-NEXT: 0x00000000 2c000000 02000000 00000800 00000000 ,...............
##                           ^-------                            unit_length (4-byte)
##                                    ^---                       version (2-byte)
##                                        ^--------              debug_info_offset (4-byte)
##                                                 ^-            address_size (1-byte)
##                                                   ^-          segment_selector_size (1-byte)
##                                                      ^------- padding (4-byte)
# DEFAULT64-NEXT: 0x00000010 34120000 00000000 00100000 00000000 4...............
##                           ^----------------                   address (8-byte)
##                                             ^---------------- length (8-byte)
# DEFAULT64-NEXT: 0x00000020 00000000 00000000 00000000 00000000 ................
##                           ^---------------------------------- terminating entry (16-byte)

# RUN: yaml2obj --docnum=10 -DCLASS=ELFCLASS32 %s -o %t10.32-bit.o
# RUN: llvm-readelf --hex-dump=.debug_aranges %t10.32-bit.o | \
# RUN:   FileCheck %s --check-prefix=DEFAULT32

#      DEFAULT32: Hex dump of section '.debug_aranges':
# DEFAULT32-NEXT: 0x00000000 2c000000 02000000 00000400 00000000 ,...............
##                           ^-------                            unit_length (4-byte)
##                                    ^---                       version (2-byte)
##                                        ^--------              debug_info_offset (4-byte)
##                                                 ^-            address_size (1-byte)
##                                                   ^-          segment_selector_size (1-byte)
##                                                      ^------- padding (4-byte)
# DEFAULT32-NEXT: 0x00000010 34120000 00100000 00000000 00000000 4...............
##                           ^-------                            address (4-byte)
##                                    ^-------                   length (4-byte)
##                                             ^---------------- terminating entry (8-byte)

--- !ELF
FileHeader:
  Class: [[CLASS]]
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
DWARF:
  debug_aranges:
    - Length:              0x2c
      Version:             2
      CuOffset:            0
      Descriptors:
        - Address: 0x1234
          Length:  0x1000

## k) Test that yaml2obj is able to determine the correct length for the address range table
## if the 'Length' field isn't specified.

# RUN: yaml2obj --docnum=11 -DCLASS=ELFCLASS64 -DADDRSIZE=4 %s -o %t11.64-bit.o
# RUN: llvm-readelf --hex-dump=.debug_aranges %t11.64-bit.o | \
# RUN:   FileCheck %s --check-prefix=LENGTH64

#      LENGTH64: Hex dump of section '.debug_aranges':
# LENGTH64-NEXT: 0x00000000 2c000000 02000000 00000800 00000000 ,...............
##                          ^-------                            unit_length (4-byte)
##                                   ^---                       version (2-byte)
##                                       ^--------              debug_info_offset (4-byte)
##                                                ^-            address_size (1-byte)
##                                                  ^-          segment_selector_size (1-byte)
##                                                     ^------- padding (4-byte)
# LENGTH64-NEXT: 0x00000010 34120000 00000000 00100000 00000000 4...............
##                          ^----------------                   address (8-byte)
##                                            ^---------------- length (8-byte)
# LENGTH64-NEXT: 0x00000020 00000000 00000000 00000000 00000000 ................
##                          ^---------------------------------- terminating entry (16-byte)
# LENGTH64-NEXT: 0x00000030 ffffffff 1c000000 00000000 02000000 ................
##                          ^-------------------------          unit_length (12-byte)
##                                                     ^---     version (2-byte)
##                                                         ^--- debug_info_offset (8-byte)
# LENGTH64-NEXT: 0x00000040 00000000 00000400 34120000 21430000 ........4...!C..
##                          -------------
##                                       ^-                     address_size (1-byte)
##                                         ^-                   segment_selector_size (1-byte)
##                                            ^-------          address (4-byte)
##                                                     ^------- length (4-byte)
# LENGTH64-NEXT: 0x00000050 00000000 00000000                   ........
##                          ^----------------                   terminating entry (8-byte)

# RUN: yaml2obj --docnum=11 -DCLASS=ELFCLASS32 -DADDRSIZE=8 %s -o %t11.32-bit.o
# RUN: llvm-readelf --hex-dump=.debug_aranges %t11.32-bit.o | \
# RUN:   FileCheck %s --check-prefix=LENGTH32

#      LENGTH32: Hex dump of section '.debug_aranges':
# LENGTH32-NEXT: 0x00000000 1c000000 02000000 00000400 00000000 ................
##                          ^-------                            unit_length (4-byte)
##                                   ^---                       version (2-byte)
##                                       ^--------              debug_info_offset (4-byte)
##                                                ^-            address_size (1-byte)
##                                                  ^-          segment_selector_size (1-byte)
##                                                     ^------- padding (4-byte)
# LENGTH32-NEXT: 0x00000010 34120000 00100000 00000000 00000000 4...............
##                          ^-------                            address (4-byte)
##                                   ^-------                   length (4-byte)
##                                            ^---------------- terminating entry (8-byte)
# LENGTH32-NEXT: 0x00000020 ffffffff 34000000 00000000 02000000 ....4...........
##                          ^-------------------------          unit_length (12-byte)
##                                                     ^---     version (2-byte)
##                                                         ^--- debug_info_offset (8-byte)
# LENGTH32-NEXT: 0x00000030 00000000 00000800 00000000 00000000 ................
##                          -------------
##                                       ^-                     address_size (1-byte)
##                                         ^-                   segment_selector_size (1-byte)
##                                            ^---------------- padding (8-byte)
# LENGTH32-NEXT: 0x00000040 34120000 00000000 21430000 00000000 4.......!C......
##                          ^----------------                   address (8-byte)
##                                            ^---------------- length (8-byte)
# LENGTH32-NEXT: 0x00000050 00000000 00000000 00000000 00000000 ................
##                          ^---------------------------------- terminating entry (16-byte)

--- !ELF
FileHeader:
  Class: [[CLASS]]
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
DWARF:
  debug_aranges:
    - Version:  2
      CuOffset: 0
      Descriptors:
        - Address: 0x1234
          Length:  0x1000
    - Format:      DWARF64
      Version:     2
      AddressSize: [[ADDRSIZE]]
      CuOffset:    0
      Descriptors:
        - Address: 0x1234
          Length:  0x4321

## l) Test that the .debug_aranges section header is emitted if the "debug_aranges"
## entry is empty.

# RUN: yaml2obj --docnum=12 %s -o %t12.o
# RUN: llvm-readobj --sections --section-data %t12.o | \
# RUN:   FileCheck -DSIZE=0 -DADDRALIGN=1 %s --check-prefixes=DWARF-HEADER,EMPTY-CONTENT

# EMPTY-CONTENT-NEXT: SectionData (
# EMPTY-CONTENT-NEXT: )

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