Compiler projects using llvm
## Check that obj2yaml is able to produce YAML from
## an object containing symbols and sections with duplicate
## names and produces same-named sections and symbols
## with distinguishing suffixes.

# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readobj -s -t %t1 | FileCheck %s

# CHECK: Name: .foo (
# CHECK: Name: .foo (
# CHECK: Name: .foo (
# CHECK: Name: .bar (
# CHECK: Name: .bar (
# CHECK: Name: .bar (

# CHECK: Name: localfoo (
# CHECK: Name: localfoo (
# CHECK: Name: localfoo (
# CHECK: Name: localbar (
# CHECK: Name: localbar (
# CHECK: Name: localbar (

# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=CASE1

# CASE1:      --- !ELF
# CASE1-NEXT: FileHeader:
# CASE1-NEXT:   Class: ELFCLASS64
# CASE1-NEXT:   Data:  ELFDATA2LSB
# CASE1-NEXT:   Type:  ET_REL
# CASE1-NEXT: Sections:
# CASE1-NEXT:   - Name: .foo
# CASE1-NEXT:     Type: SHT_PROGBITS
# CASE1-NEXT:   - Name: '.foo (1)'
# CASE1-NEXT:     Type: SHT_PROGBITS
# CASE1-NEXT:   - Name: '.foo (2)'
# CASE1-NEXT:     Type: SHT_PROGBITS
# CASE1-NEXT:   - Name: .bar
# CASE1-NEXT:     Type: SHT_PROGBITS
# CASE1-NEXT:   - Name: '.bar (1)'
# CASE1-NEXT:     Type: SHT_PROGBITS
# CASE1-NEXT:   - Name: '.bar (2)'
# CASE1-NEXT:     Type: SHT_PROGBITS
# CASE1-NEXT: Symbols:
# CASE1-NEXT:   - Name: localfoo
# CASE1-NEXT:   - Name: 'localfoo (1)'
# CASE1-NEXT:   - Name: 'localfoo (2)'
# CASE1-NEXT:   - Name: localbar
# CASE1-NEXT:   - Name: 'localbar (1)'
# CASE1-NEXT:   - Name: 'localbar (2)'
# CASE1-NEXT: ...

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_REL
Sections:
  - Name: .foo
    Type: SHT_PROGBITS
  - Name: '.foo (555)'
    Type: SHT_PROGBITS
  - Name: '.foo (random_tag)'
    Type: SHT_PROGBITS
  - Name: .bar
    Type: SHT_PROGBITS
  - Name: '.bar (666)'
    Type: SHT_PROGBITS
  - Name: '.bar (random_tag)'
    Type: SHT_PROGBITS
Symbols:
  - Name: 'localfoo (111)'
  - Name: 'localfoo (222)'
  - Name: 'localfoo (random_tag)'
  - Name: 'localbar (333)'
  - Name: 'localbar (444)'
  - Name: 'localbar (random_tag)'

## Check we can refer to symbols with the same
## name from relocations.

# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=CASE2

# CASE2:      Relocations:
# CASE2-NEXT:  - Symbol: 'foo (1)'
# CASE2-NEXT:    Type:   R_X86_64_PC32
# CASE2-NEXT:  - Offset: 0x4
# CASE2-NEXT:    Symbol: foo
# CASE2-NEXT:    Type:   R_X86_64_PC32
# CASE2-NEXT: Symbols:
# CASE2-NEXT:  - Name: foo
# CASE2-NEXT:  - Name: 'foo (1)'
  
--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_REL
  Machine: EM_X86_64
Sections:
  - Name: .text
    Type: SHT_PROGBITS
    Size: 8
  - Name: .rela.text
    Type: SHT_RELA
    Info: .text
    Link: .symtab
    Relocations:
      - Type: R_X86_64_PC32
        Symbol: 'foo (1)'
      - Type: R_X86_64_PC32
        Offset: 4
        Symbol: foo
Symbols:
  - Name: foo
  - Name: 'foo (1)'

## Check obj2yaml does not add a suffix to a name if the
## symbol is in .symtab and .dynsym at the same time.

# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: obj2yaml %t3 | FileCheck %s --check-prefix=CASE3

# CASE3:      Symbols:
# CASE3-NEXT:   - Name:    foo
# CASE3-NEXT:     Binding: STB_GLOBAL
# CASE3-NEXT: DynamicSymbols:
# CASE3-NEXT:   - Name:    foo
# CASE3-NEXT:     Binding: STB_GLOBAL

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Symbols:
  - Name:    foo
    Binding: STB_GLOBAL
DynamicSymbols:
  - Name:    foo
    Binding: STB_GLOBAL