# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-symbolizer --obj=%t1 0 1 2 | FileCheck %s

## The local symbol has no preceding STT_FILE. Its filename is unavailable.
# CHECK:       local
# CHECK-NEXT:  ??:0:0
# CHECK-EMPTY:

## All local symbols precede all non-local symbols. When there are multiple
## STT_FILE symbols, we cannot tell which file defines the non-local symbol in
## question. We could tell if there is only one STT_FILE but in reality there
## are always more than one file, so implementing the special case is not useful.
# CHECK-NEXT:  global
# CHECK-NEXT:  ??:0:0
# CHECK-EMPTY:
# CHECK-NEXT:  weak
# CHECK-NEXT:  ??:0:0
# CHECK-EMPTY:

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_DYN
  Machine: EM_X86_64
Sections:
  - Name:  .text
    Type:  SHT_PROGBITS
    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
    Size:  3
Symbols:
  - Name:    local
    Section: .text
    Value:   0
  - Name:    1.c
    Type:    STT_FILE
    Index:   SHN_ABS
  - Name:    global
    Binding: STB_GLOBAL
    Section: .text
    Value:   1
  - Name:    weak
    Binding: STB_WEAK
    Section: .text
    Value:   2

## If st_name of the STT_FILE symbols is invalid, the symbol name is lost as well.
## TODO Keep the symbol name.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: not llvm-symbolizer --obj=%t2 0 0 2>&1 | FileCheck %s --check-prefix=CHECK2

# CHECK2:      llvm-symbolizer{{.*}}: error: '{{.*}}symtab-file2.yaml.tmp2': st_name (0xffff) is past the end of the string table of size

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_DYN
  Machine: EM_X86_64
Sections:
  - Name:  .text
    Type:  SHT_PROGBITS
    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
    Size:  1
Symbols:
  - StName:  0xffff
    Type:    STT_FILE
    Index:   SHN_ABS
  - Name:    local
    Section: .text

# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: llvm-symbolizer --obj=%t3 'DATA 0x1001' 2>&1 | FileCheck %s --check-prefix=CHECK3

# CHECK3:      code
# CHECK3-NEXT: 4096 2
# CHECK3-NEXT: ??:?
# CHECK3-EMPTY:

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_DYN
  Machine: EM_X86_64
Sections:
  - Name:    .text
    Type:    SHT_PROGBITS
    Flags:   [ SHF_ALLOC, SHF_EXECINSTR ]
    Address: 0x1000
    Size:    1
  - Name:    .debug
    Type:    SHT_PROGBITS
    Address: 0x0000
    Size:    0xFFFF
Symbols:
  - Name:    debug
    Section: .debug
    Binding: STB_WEAK
    Value:   0x1001
    Size:    0
  - Name:    code
    Section: .text
    Binding: STB_WEAK
    Value:   0x1000
    Size:    2
