llvm/llvm/test/tools/llvm-readobj/ELF/mips-plt.test

## Check that we are able to dump MIPS PLT GOT entries using -A properly.

# RUN: yaml2obj --docnum=1 %s -o %t.plt.o
# RUN: llvm-readobj -A %t.plt.o | FileCheck %s --check-prefix=LLVM
# RUN: llvm-readelf -A %t.plt.o | \
# RUN:   FileCheck %s --strict-whitespace --match-full-lines --check-prefix=GNU

# LLVM:      PLT GOT {
# LLVM-NEXT:   Reserved entries [
# LLVM-NEXT:     Entry {
# LLVM-NEXT:       Address: 0x2000
# LLVM-NEXT:       Initial: 0x0
# LLVM-NEXT:       Purpose: PLT lazy resolver
# LLVM-NEXT:     }
# LLVM-NEXT:     Entry {
# LLVM-NEXT:       Address: 0x2008
# LLVM-NEXT:       Initial: 0x0
# LLVM-NEXT:       Purpose: Module pointer
# LLVM-NEXT:     }
# LLVM-NEXT:   ]
# LLVM-NEXT:   Entries [
# LLVM-NEXT:     Entry {
# LLVM-NEXT:       Address: 0x2010
# LLVM-NEXT:       Initial: 0x0
# LLVM-NEXT:       Value: 0x0
# LLVM-NEXT:       Type: None (0x0)
# LLVM-NEXT:       Section: Undefined (0x0)
# LLVM-NEXT:       Name: foo (5)
# LLVM-NEXT:     }
# LLVM-NEXT:     Entry {
# LLVM-NEXT:       Address: 0x2018
# LLVM-NEXT:       Initial: 0x0
# LLVM-NEXT:       Value: 0x0
# LLVM-NEXT:       Type: None (0x0)
# LLVM-NEXT:       Section: Undefined (0x0)
# LLVM-NEXT:       Name: bar (1)
# LLVM-NEXT:     }
# LLVM-NEXT:   ]
# LLVM-NEXT: }

#       GNU:PLT GOT:
# GNU-EMPTY:
#  GNU-NEXT: Reserved entries:
#  GNU-NEXT:   Address  Initial Purpose
#  GNU-NEXT:  0000000000002000 0000000000000000 PLT lazy resolver
#  GNU-NEXT:  0000000000002008 0000000000000000 Module pointer
# GNU-EMPTY:
#  GNU-NEXT: Entries:
#  GNU-NEXT:   Address  Initial Sym.Val. Type    Ndx Name
#  GNU-NEXT:  0000000000002010 0000000000000000 0000000000000000 NOTYPE  UND foo
#  GNU-NEXT:  0000000000002018 0000000000000000 0000000000000000 NOTYPE  UND bar
#   GNU-NOT:{{.}}

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_REL
  Machine: EM_MIPS
Sections:
  - Name:    .rel.plt
    Type:    SHT_REL
    Flags:   [ SHF_ALLOC ]
    Address: 0x1000
    Link:    .dynsym
    Relocations:
      - Offset: 0x1
        Symbol: 1
        Type:   R_MIPS_JUMP_SLOT
      - Offset: 0x2
        Symbol: 2
        Type:   R_MIPS_JUMP_SLOT
  - Name:    .got.plt
    Type:    SHT_PROGBITS
    Flags:   [ SHF_WRITE, SHF_ALLOC ]
    Address: 0x2000
    Size:    32 ## (dynamic symbols number + 2) * 8
  - Name: .dynamic
    Type: SHT_DYNAMIC
    Entries:
      - Tag:   DT_JMPREL
        Value: 0x1000
      - Tag:   DT_MIPS_PLTGOT
        Value: 0x2000
DynamicSymbols:
  - Name:   "foo"
  - Name:   "bar"

## Check we report errors when dynamic tags, needed for dumping PLT, are missing.

# RUN: yaml2obj --docnum=2 -DTAG=DT_MIPS_PLTGOT %s -o %t.err1.o
# RUN: llvm-readobj -A %t.err1.o 2>&1 | FileCheck %s -DFILE=%t.err1.o --check-prefixes=NO-OUTPUT,ERR1

# RUN: yaml2obj --docnum=2 -DTAG=DT_JMPREL %s -o %t.err2.o
# RUN: llvm-readobj -A %t.err2.o 2>&1 | FileCheck %s -DFILE=%t.err2.o --check-prefixes=NO-OUTPUT,ERR2

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_EXEC
  Machine: EM_MIPS
Sections:
  - Name: .dynamic
    Type: SHT_DYNAMIC
    Entries:
      - Tag:   [[TAG]]
        Value: 0
      - Tag:   DT_NULL
        Value: 0

## Check we report errors when we are unable to find PLTGOT/JMPREL sections.
# RUN: yaml2obj --docnum=3 %s -DVAL1=0xffff -o %t.err3.o
# RUN: llvm-readobj -A %t.err3.o 2>&1 | FileCheck %s -DFILE=%t.err3.o -check-prefixes=NO-OUTPUT,ERR3

# RUN: yaml2obj --docnum=3 %s -DVAL2=0xffff -o %t.err4.o
# RUN: llvm-readobj -A %t.err4.o 2>&1 | FileCheck %s -DFILE=%t.err4.o -check-prefixes=NO-OUTPUT,ERR4

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_EXEC
  Machine: EM_MIPS
Sections:
  - Name: .dynamic
    Type: SHT_DYNAMIC
    Entries:
      - Tag:   DT_MIPS_PLTGOT
        Value: [[VAL1=0]]
      - Tag:   DT_JMPREL
        Value: [[VAL2=0]]
      - Tag:   DT_NULL
        Value: 0
  - Name:    .foo
    Type:    SHT_PROGBITS
    Address: 0x100
    ShSize:  0xffffffff
    Link:    [[LINK=0x1]]
DynamicSymbols: []

## Check we report errors when we are unable to dump PLTGOT properly.

# RUN: yaml2obj --docnum=3 -DVAL1=0x100 %s -o %t.err5.o
# RUN: llvm-readobj -A %t.err5.o 2>&1 | FileCheck %s -DFILE=%t.err5.o -check-prefixes=NO-OUTPUT,ERR5

# RUN: yaml2obj --docnum=3 -DVAL2=0x100 -DLINK=0xaaaaaaaa %s -o %t.err6.o
# RUN: llvm-readobj -A %t.err6.o 2>&1 | FileCheck %s -DFILE=%t.err6.o -check-prefixes=NO-OUTPUT,ERR6

# RUN: yaml2obj --docnum=3 -DVAL2=0x100 %s -o %t.err7.o
# RUN: llvm-readobj -A %t.err7.o 2>&1 | FileCheck %s -DFILE=%t.err7.o -check-prefixes=NO-OUTPUT,ERR7

# NO-OUTPUT:      LoadName: <Not found>
# NO-OUTPUT-NEXT: There is no .MIPS.abiflags section in the file.
# NO-OUTPUT-NEXT: There is no .MIPS.options section in the file.
# NO-OUTPUT-NEXT: There is no .reginfo section in the file.

# ERR1-NEXT: warning: '[[FILE]]': cannot find JMPREL dynamic tag
# ERR2-NEXT: warning: '[[FILE]]': cannot find MIPS_PLTGOT dynamic tag
# ERR3-NEXT: warning: '[[FILE]]': there is no non-empty PLTGOT section at 0xffff
# ERR4-NEXT: warning: '[[FILE]]': there is no non-empty RELPLT section at 0xffff
# ERR5-NEXT: warning: '[[FILE]]': unable to read PLTGOT section content: section [index 2] has a sh_offset (0x70) + sh_size (0xffffffff) that is greater than the file size (0x280)
# ERR6-NEXT: warning: '[[FILE]]': unable to get a symbol table linked to the SHT_PROGBITS section with index 2: invalid section index: 2863311530
# ERR7-NEXT: warning: '[[FILE]]': unable to get a string table for the SHT_DYNAMIC section with index 1: invalid sh_type for symbol table, expected SHT_SYMTAB or SHT_DYNSYM

# NO-OUTPUT-EMPTY:
# NO-OUTPUT-NOT: {{.}}

## Check how we print PLT entries when they are unnamed section symbols.
# RUN: yaml2obj --docnum=4 %s -o %t3
# RUN: llvm-readobj -A %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=SEC-SYMS-LLVM
# RUN: llvm-readelf -A %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=SEC-SYMS-GNU

# SEC-SYMS-LLVM:      PLT GOT {
# SEC-SYMS-LLVM:        Entries [
# SEC-SYMS-LLVM:          Entry {
# SEC-SYMS-LLVM:            Section: Absolute (0xFFF1)
# SEC-SYMS-LLVM-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff1 (SHN_ABS)
# SEC-SYMS-LLVM-NEXT:       Name: <?> (0)
# SEC-SYMS-LLVM-NEXT:     }
# SEC-SYMS-LLVM-NEXT:     Entry {
# SEC-SYMS-LLVM:            Section: .got.plt (0x2)
# SEC-SYMS-LLVM-NEXT:       Name: .got.plt (0)
# SEC-SYMS-LLVM-NEXT:     }
# SEC-SYMS-LLVM-NEXT:     Entry {
# SEC-SYMS-LLVM:            Section: Common (0xFFF2)
# SEC-SYMS-LLVM-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff2 (SHN_COMMON)
# SEC-SYMS-LLVM-NEXT:       Name: <?> (0)
# SEC-SYMS-LLVM-NEXT:     }
# SEC-SYMS-LLVM-NEXT:     Entry {
# SEC-SYMS-LLVM:            Type: Section (0x3)
# SEC-SYMS-LLVM-NEXT: warning: '[[FILE]]': found an extended symbol index (4), but unable to locate the extended symbol index table
# SEC-SYMS-LLVM-NEXT:       Section: Reserved (0xFFFF)
# SEC-SYMS-LLVM-NEXT:       Name: <?> (0)
# SEC-SYMS-LLVM-NEXT:     }
# SEC-SYMS-LLVM-NEXT:   ]
# SEC-SYMS-LLVM-NEXT: }

# SEC-SYMS-GNU:      PLT GOT:
# SEC-SYMS-GNU:       Entries:
# SEC-SYMS-GNU-NEXT:   Address          {{.*}} Ndx Name
# SEC-SYMS-GNU-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff1 (SHN_ABS)
# SEC-SYMS-GNU-NEXT:   0000000000002010 {{.*}} ABS <?>
# SEC-SYMS-GNU-NEXT:   0000000000002018 {{.*}}   2 .got.plt
# SEC-SYMS-GNU-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff2 (SHN_COMMON)
# SEC-SYMS-GNU-NEXT:   0000000000002020 {{.*}} COM <?>
# SEC-SYMS-GNU-NEXT: warning: '[[FILE]]': found an extended symbol index (4), but unable to locate the extended symbol index table
# SEC-SYMS-GNU-NEXT:   0000000000002028 {{.*}} RSV[0xffff] <?>

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_REL
  Machine: EM_MIPS
Sections:
  - Name:    .rel.plt
    Type:    SHT_REL
    Flags:   [ SHF_ALLOC ]
    Address: 0x1000
    Link:    .dynsym
    Relocations:
      - Offset: 0x1
        Symbol: 1
        Type:   R_MIPS_JUMP_SLOT
      - Offset: 0x2
        Symbol: 2
        Type:   R_MIPS_JUMP_SLOT
      - Offset: 0x2
        Symbol: 3
        Type:   R_MIPS_JUMP_SLOT
      - Offset: 0x3
        Symbol: 4
        Type:   R_MIPS_JUMP_SLOT
  - Name:    .got.plt
    Type:    SHT_PROGBITS
    Flags:   [ SHF_WRITE, SHF_ALLOC ]
    Address: 0x2000
    Size:    48 ## (dynamic symbols number + 2) * 8
  - Name: .dynamic
    Type: SHT_DYNAMIC
    Entries:
      - Tag:   DT_JMPREL
        Value: 0x1000
      - Tag:   DT_MIPS_PLTGOT
        Value: 0x2000
DynamicSymbols:
  - Type:    STT_SECTION
    Index:   SHN_ABS
  - Type:    STT_SECTION
    Section: .got.plt
  - Type:    STT_SECTION
    Index:   SHN_COMMON
  - Type:    STT_SECTION
    Index:   SHN_XINDEX