## Test that yaml2obj automatically assigns sh_addr to allocatable sections for ET_EXEC/ET_DYN files.

# RUN: yaml2obj %s -o %t.so -D TYPE=ET_DYN
# RUN: llvm-readelf --sections %t.so | FileCheck %s --check-prefix=EXE-DSO

# RUN: yaml2obj %s -o %t -D TYPE=ET_EXEC
# RUN: llvm-readelf --sections %t | FileCheck %s --check-prefix=EXE-DSO

# RUN: yaml2obj %s -o %t.o -D TYPE=ET_REL
# RUN: llvm-readelf --sections %t.o | FileCheck %s --check-prefix=REL

## We assign virtual addresses to allocatable sections automatically for executables and shared libraries.

# EXE-DSO:      Section Headers:
# EXE-DSO-NEXT:   [Nr] Name              Type     Address          Off    Size   ES Flg Lk Inf Al
# EXE-DSO-NEXT:   [ 0]                   NULL     0000000000000000 000000 000000 00     0   0  0
# EXE-DSO-NEXT:   [ 1] .text.any.addr    PROGBITS 0000000000001000 000040 000003 00   A 0   0  0
# EXE-DSO-NEXT:   [ 2] .text.shsize      PROGBITS 0000000000001003 000043 001234 00   A 0   0  0
# EXE-DSO-NEXT:   [ 3] .text.align       PROGBITS 0000000000001100 000100 000004 00   A 0   0  256
# EXE-DSO-NEXT:   [ 4] .data.any.addr    PROGBITS 0000000000002000 000104 000001 00   A 0   0  0
# EXE-DSO-NEXT:   [ 5] .data.after.fill  PROGBITS 0000000000002101 000205 000001 00   A 0   0  0
# EXE-DSO-NEXT:   [ 6] .data.go.back     PROGBITS 0000000000001500 000206 000001 00   A 0   0  0
# EXE-DSO-NEXT:   [ 7] .data.go.back.foo PROGBITS 0000000000001501 000207 000000 00   A 0   0  0
# EXE-DSO-NEXT:   [ 8] .dynsym           DYNSYM   0000000000001508 000208 000018 18   A 9   1  8
# EXE-DSO-NEXT:   [ 9] .dynstr           STRTAB   0000000000001520 000220 000001 00   A 0   0  1
# EXE-DSO-NEXT:   [10] .strtab           STRTAB   0000000000000000 000221 000001 00     0   0  1
# EXE-DSO-NEXT:   [11] .shstrtab         STRTAB   0000000000000000 000222 00008b 00     0   0  1

## We do not assign virtual addresses to allocatable sections in a relocatable object
## unless YAML document has an explicit request.

# REL:      Section Headers:
# REL-NEXT:   [Nr] Name              Type     Address          Off    Size   ES Flg Lk Inf Al
# REL-NEXT:   [ 0]                   NULL     0000000000000000 000000 000000 00     0   0  0
# REL-NEXT:   [ 1] .text.any.addr    PROGBITS 0000000000001000 000040 000003 00   A 0   0  0
# REL-NEXT:   [ 2] .text.shsize      PROGBITS 0000000000000000 000043 001234 00   A 0   0  0
# REL-NEXT:   [ 3] .text.align       PROGBITS 0000000000000000 000100 000004 00   A 0   0  256
# REL-NEXT:   [ 4] .data.any.addr    PROGBITS 0000000000002000 000104 000001 00   A 0   0  0
# REL-NEXT:   [ 5] .data.after.fill  PROGBITS 0000000000000000 000205 000001 00   A 0   0  0
# REL-NEXT:   [ 6] .data.go.back     PROGBITS 0000000000001500 000206 000001 00   A 0   0  0
# REL-NEXT:   [ 7] .data.go.back.foo PROGBITS 0000000000000000 000207 000000 00   A 0   0  0
# REL-NEXT:   [ 8] .dynsym           DYNSYM   0000000000000000 000208 000018 18   A 9   1  8
# REL-NEXT:   [ 9] .dynstr           STRTAB   0000000000000000 000220 000001 00   A 0   0  1
# REL-NEXT:   [10] .strtab           STRTAB   0000000000000000 000221 000001 00     0   0  1
# REL-NEXT:   [11] .shstrtab         STRTAB   0000000000000000 000222 00008b 00     0   0  1

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  [[TYPE]]
Sections:
## Show we can place a section at any address.
  - Name:    .text.any.addr
    Type:    SHT_PROGBITS
    Flags:   [ SHF_ALLOC ]
    Address: 0x1000
    Size:    0x3
## Test that ShSize does not affect virtual addresses.
  - Name:   .text.shsize
    Type:   SHT_PROGBITS
    Flags:  [ SHF_ALLOC ]
    ShSize: 0x1234
## Show we respect an address align when automatically
## assign virtual addresses.
  - Name:         .text.align
    Type:         SHT_PROGBITS
    Flags:        [ SHF_ALLOC ]
    AddressAlign: 0x100
    Size:         0x4
## We can set another address for a subsequent section.
  - Name:    .data.any.addr
    Type:    SHT_PROGBITS
    Flags:   [ SHF_ALLOC ]
    Address: 0x2000
    Size:    0x1
## Show that Fill occupies VA space.
  - Type:    Fill
    Pattern: "AABB"
    Size:    0x100
  - Name:  .data.after.fill
    Type:  SHT_PROGBITS
    Flags: [ SHF_ALLOC ]
    Size:  0x1
## Show we can go back in the address space and
## continue placing sections. The order of sections in the
## section header table will match the order in the YAML description.
  - Name:    .data.go.back
    Address: 0x1500
    Type:    SHT_PROGBITS
    Flags:   [ SHF_ALLOC ]
    Size:    0x1
  - Name:    .data.go.back.foo
    Type:    SHT_PROGBITS
    Flags:   [ SHF_ALLOC ]
## Used to trigger creation of .dynsym and .dynstr.
DynamicSymbols: []
