llvm/llvm/test/tools/llvm-objdump/ELF/dynsym-version.test

## Check we print symbol versions, when they are available.

## Test undefined symbols.
# RUN: yaml2obj %s -o %t-undef.o
# RUN: llvm-objdump -T %t-undef.o 2>&1 | tr '\t' '|' | FileCheck %s \
# RUN:   -DFILE=%t-undef.o --check-prefix=UNDEF --match-full-lines --strict-whitespace

## version2sym and version3sym are invalid: undefined symbols cannot refer to .gnu.version_d.
## We still check their behaviors.
#      UNDEF:DYNAMIC SYMBOL TABLE:
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000              localversym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000              globalversym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v2)         version2sym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v3hidden)   version3sym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v4)         version4sym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v5hidden)   .hidden version5sym

## Test defined symbols.
# RUN: yaml2obj -DINDEX=0x1 %s -o %t-def.o
# RUN: llvm-objdump -T %t-def.o 2>&1 | tr '\t' '|' | FileCheck %s \
# RUN:   -DFILE=%t-def.o --check-prefix=DEF --match-full-lines --strict-whitespace

#      DEF:DYNAMIC SYMBOL TABLE:
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000              localversym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000              globalversym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000  v2          version2sym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000 (v3hidden)   version3sym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000 (v4)         version4sym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000 (v5hidden)   .hidden version5sym

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name:    .gnu.version
    Type:    SHT_GNU_versym
    Flags:   [ SHF_ALLOC ]
## 0x8000 is a special VERSYM_HIDDEN bit.
    Entries: [ 0, 0, 1, 2, 0x8003, 4, 0x8005 ]
    ShSize:  [[VERSYMSIZE=<none>]]
  - Name:         .gnu.version_d
    Type:         SHT_GNU_verdef
    Flags:        [ SHF_ALLOC ]
    Link:         .dynstr
    AddressAlign: 0x4
    Info:         0x2
    ShOffset:     [[VERDEFOFFSET=<none>]]
    Entries:
      - VersionNdx: 2
        Names:
          - v2
      - VersionNdx: 3
        Names:
          - v3hidden
  - Name:  .gnu.version_r
    Type:  SHT_GNU_verneed
    Flags: [ SHF_ALLOC ]
    Link:  .dynstr
    Info:  0x2
    Dependencies:
      - Version: 1
        File:    file1.so
        Entries:
          - Name:  v4
            Hash:  0
            Flags: 0
            Other: 4
      - Version: 1
        File:    file2.0
        Entries:
          - Name:  v5hidden
            Hash:  0
            Flags: 0
            Other: 5
  - Name:    .dynsym
    Type:    SHT_DYNSYM
    EntSize: [[ENTSIZE=<none>]]
DynamicSymbols:
  - Name:  localversym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  globalversym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version2sym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version3sym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version4sym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version5sym
    Index: [[INDEX=<none>]]
    Other: [ STV_HIDDEN ]
    Binding: STB_GLOBAL

## Test the output with a long version name.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: llvm-objdump -T %t2 2>&1 | tr '\t' '|' | FileCheck %s \
# RUN:   --check-prefix=LONGNAME --match-full-lines --strict-whitespace

#      LONGNAME:DYNAMIC SYMBOL TABLE:
# LONGNAME-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000  v2          sym1
# LONGNAME-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000  v3withverylongname sym2

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name:    .gnu.version
    Type:    SHT_GNU_versym
    Flags:   [ SHF_ALLOC ]
    Entries: [ 1, 2, 3 ]
  - Name:         .gnu.version_d
    Type:         SHT_GNU_verdef
    Flags:        [ SHF_ALLOC ]
    Link:         .dynstr
    AddressAlign: 0x4
    Info:         0x2
    Entries:
      - VersionNdx: 2
        Names:
          - v2
      - VersionNdx: 3
        Names:
          - v3withverylongname
  - Name:    .dynsym
    Type:    SHT_DYNSYM
DynamicSymbols:
  - Name:  sym1
    Index: 1
    Binding: STB_GLOBAL
  - Name:  sym2
    Index: 1
    Binding: STB_GLOBAL

## Check we report a warning when we are unable to read a SHT_GNU_versym section entry.
## In this case, the section has a size that is not a multiple of its sh_entsize.

# RUN: yaml2obj -DVERSYMSIZE=0xff %s -o %t2-broken-versym.o
# RUN: llvm-objdump -T %t2-broken-versym.o 2>&1 | FileCheck %s --check-prefixes=VERSION-ERR1,NOVER

# VERSION-ERR1:warning: {{.*}}: unable to read an entry with index 1 from SHT_GNU_versym section
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 localversym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 globalversym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 version2sym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 version3sym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 version4sym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 .hidden version5sym