## Check we are able to dump SHT_GNU_verneed sections properly.
## Check that we link the SHT_GNU_verneed section to
## the `.dynstr` section by default.
## Check that we set the value of `sh_info` field to the number
## of version dependencies by default.

# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readobj -V %t1 | FileCheck %s
# RUN: llvm-readelf --sections %t1 | \
# RUN:   FileCheck %s -DLINK=3 -DINFO=2 --check-prefix=FIELDS

# FIELDS: [Nr] Name           Type    {{.*}} Flg Lk       Inf      Al
# FIELDS: [ 1] .gnu.version_r VERNEED {{.*}}   A [[LINK]] [[INFO]] 4
# FIELDS: [ 3] .dynstr

# CHECK:      VersionRequirements [
# CHECK-NEXT:   Dependency {
# CHECK-NEXT:     Version: 1
# CHECK-NEXT:     Count: 2
# CHECK-NEXT:     FileName: dso.so.0
# CHECK-NEXT:     Entries [
# CHECK-NEXT:       Entry {
# CHECK-NEXT:         Hash: 1937
# CHECK-NEXT:         Flags [ (0xA)
# CHECK-NEXT:           Weak (0x2)
# CHECK-NEXT:         ]
# CHECK-NEXT:         Index: 3
# CHECK-NEXT:         Name: v1
# CHECK-NEXT:       }
# CHECK-NEXT:       Entry {
# CHECK-NEXT:         Hash: 1938
# CHECK-NEXT:         Flags [ (0xB)
# CHECK-NEXT:           Base (0x1)
# CHECK-NEXT:           Weak (0x2)
# CHECK-NEXT:         ]
# CHECK-NEXT:         Index: 4
# CHECK-NEXT:         Name: v2
# CHECK-NEXT:       }
# CHECK-NEXT:     ]
# CHECK-NEXT:   }
# CHECK-NEXT:   Dependency {
# CHECK-NEXT:     Version: 1
# CHECK-NEXT:     Count: 1
# CHECK-NEXT:     FileName: dso.so.1
# CHECK-NEXT:     Entries [
# CHECK-NEXT:       Entry {
# CHECK-NEXT:         Hash: 1939
# CHECK-NEXT:         Flags [ (0xC)
# CHECK-NEXT:           Info (0x4)
# CHECK-NEXT:         ]
# CHECK-NEXT:         Index: 2
# CHECK-NEXT:         Name: v3
# CHECK-NEXT:       }
# CHECK-NEXT:     ]
# CHECK-NEXT:   }
# CHECK-NEXT: ]

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
  Entry: 0x0000000000201000
Sections:
  - Name:         .gnu.version_r
    Type:         SHT_GNU_verneed
    Flags:        [ SHF_ALLOC ]
    Address:      0x0000000000200250
    AddressAlign: 0x0000000000000004
    Info:         [[INFO=<none>]]
    Link:         [[LINK=<none>]]
    Dependencies:
      - Version:         1
        File:            dso.so.0
        Entries:
          - Name:            v1
            Hash:            1937
            Flags:           10
            Other:           3
          - Name:            v2
            Hash:            1938
            Flags:           11
            Other:           4
      - Version:         1
        File:            dso.so.1
        Entries:
          - Name:            v3
            Hash:            1939
            Flags:           12
            Other:           2
DynamicSymbols:
  - Name:    f1
    Binding: STB_GLOBAL

## Check that we are able to set sh_info and sh_link fields to arbitrary values.

# RUN: yaml2obj --docnum=1 -DINFO=123 -DLINK=234 %s -o %t1.fields
# RUN: llvm-readelf --sections %t1.fields | \
# RUN:   FileCheck %s -DINFO=123 -DLINK=234 --check-prefix=FIELDS

## Check we can omit "Content", "Size" and "Dependencies" fields to
## produce an empty SHT_GNU_verneed section.
## Check we set the sh_link field to 0 when there is no .dynstr section.

# RUN: yaml2obj --docnum=2 %s -o %t3
# RUN: llvm-readelf --sections %t3 | FileCheck %s --check-prefix=NO-PROPS

# NO-PROPS: [Nr] Name           Type    Address          Off    Size   ES Flg Lk Inf
# NO-PROPS: [ 1] .gnu.version_r VERNEED 0000000000000000 000040 000000 00   A 0  0

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name:         .gnu.version_r
    Type:         SHT_GNU_verneed
    Flags:        [ SHF_ALLOC ]
    Size:         [[SIZE=<none>]]
    Content:      [[CONTENT=<none>]]
    Dependencies: [[DEPS=<none>]]

## Check we can use the "Content" key with the "Size" key when the size is greater
## than or equal to the content size.

# RUN: not yaml2obj --docnum=2 -DCONTENT="'00'" -DSIZE=0 %s 2>&1 | \
# RUN:   FileCheck %s --check-prefix=CONTENT-SIZE-ERR

# CONTENT-SIZE-ERR: error: Section size must be greater than or equal to the content size

# RUN: yaml2obj --docnum=2 -DCONTENT="'00'" -DSIZE=1 %s -o %t.cont.size.eq.o
# RUN: llvm-readobj --sections --section-data %t.cont.size.eq.o | \
# RUN:   FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="00"

# RUN: yaml2obj --docnum=2 -DCONTENT="'00'" -DSIZE=2 %s -o %t.cont.size.gr.o
# RUN: llvm-readobj --sections --section-data %t.cont.size.gr.o | \
# RUN:   FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="0000"

# CHECK-CONTENT:      Name: .gnu.version_r
# CHECK-CONTENT:      SectionData (
# CHECK-CONTENT-NEXT:   0000: [[DATA]] |
# CHECK-CONTENT-NEXT: )

## Check we can use the "Size" key alone to create the section.

# RUN: yaml2obj --docnum=2 -DSIZE=3 %s -o %t.size.o
# RUN: llvm-readobj --sections --section-data %t.size.o | \
# RUN:   FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="000000"

## Check we can use the "Content" key alone to create the section.

# RUN: yaml2obj --docnum=2 -DCONTENT="'112233'" %s -o %t.content.o
# RUN: llvm-readobj --sections --section-data %t.content.o | \
# RUN:   FileCheck %s --check-prefix=CHECK-CONTENT -DDATA="112233"

## Check we can't use the "Dependencies" key together with the "Content" or "Size" keys.

# RUN: not yaml2obj --docnum=2 -DSIZE=0 -DDEPS="[]" %s 2>&1 | \
# RUN:   FileCheck %s --check-prefix=DEPS-ERR
# RUN: not yaml2obj --docnum=2 -DCONTENT="'00'" -DDEPS="[]" %s 2>&1 | \
# RUN:   FileCheck %s --check-prefix=DEPS-ERR

# DEPS-ERR: error: "Dependencies" cannot be used with "Content" or "Size"

## Check we set the sh_link field to 0 when the .dynstr section is excluded
## from the section header table.

# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: llvm-readelf --sections %t3 | FileCheck %s --check-prefix=EXCLUDED

# EXCLUDED: [Nr] Name           {{.*}} ES Flg Lk Inf
# EXCLUDED: [ 1] .gnu.version_r {{.*}} 00     0   0

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .gnu.version_r
    Type: SHT_GNU_verneed
  - Name: .dynstr
    Type: SHT_STRTAB
  - Type: SectionHeaderTable
    Sections:
      - Name: .gnu.version_r
      - Name: .strtab
      - Name: .shstrtab
    Excluded:
      - Name: .dynstr
