As per section 4.2.2 of the PowerPC ELFv2 ABI, this value tells the dynamic linker which optimizations it is allowed to do. Specifically, the higher order bit of the two tells the dynamic linker that there may be multiple TOC pointers in the binary. When we resolve any NOTOC relocations during linking, we need to set this value because we may be calling TOC functions from NOTOC functions when the NOTOC function already clobbered the TOC pointer. In practice, this ensures that the PLT resolver always resolves the call to the GEP (global entry point) of the TOC function (which will set up the TOC for the TOC function). Original patch by nemanjai Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D150631
45 lines
1.4 KiB
ArmAsm
45 lines
1.4 KiB
ArmAsm
# REQUIRES: ppc
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s -o %t.o
|
|
# RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=INPUT-REL %s
|
|
# RUN: llvm-objdump -d --no-show-raw-insn %t.o | FileCheck --check-prefix=INPUT-ASM %s
|
|
|
|
# RUN: ld.lld --shared %t.o --soname=t.so -o %t.so
|
|
# RUN: llvm-readelf -r %t.so | FileCheck --check-prefix=SO-REL %s
|
|
# RUN: llvm-readelf -x .got %t.so | FileCheck --check-prefix=SO-GOT %s
|
|
# RUN: llvm-readelf -s %t.so | FileCheck --check-prefix=SO-SYM %s
|
|
|
|
## Test to make sure that the first element of a GOT section is the tocbase .TOC.
|
|
|
|
# INPUT-REL: Section (3) .rela.text {
|
|
# INPUT-REL-NEXT: 0x0 R_PPC64_GOT_PCREL34 glob_int 0x0
|
|
# INPUT-REL-NEXT: 0x0 R_PPC64_PCREL_OPT - 0x8
|
|
# INPUT-REL-NEXT: }
|
|
|
|
# INPUT-ASM-LABEL: <test>:
|
|
# INPUT-ASM: pld 3, 0(0), 1
|
|
# INPUT-ASM-NEXT: lwa 3, 0(3)
|
|
# INPUT-ASM-NEXT: blr
|
|
|
|
# SO-REL: Relocation section '.rela.dyn'
|
|
# SO-REL: 00000000000203a0 0000000100000014 R_PPC64_GLOB_DAT 00000000000102d0 glob_int + 0
|
|
|
|
# SO-GOT: Hex dump of section '.got':
|
|
# SO-GOT: 0x00020398 98830200 00000000 00000000 00000000
|
|
|
|
# SO-SYM: Symbol table '.symtab' contains 4 entries:
|
|
# SO-SYM: 3: 00000000000102d0 4 NOTYPE GLOBAL DEFAULT 6 glob_int
|
|
|
|
test:
|
|
pld 3, glob_int@got@pcrel(0), 1
|
|
.Lpcrel0:
|
|
.reloc .Lpcrel0-8,R_PPC64_PCREL_OPT,.-(.Lpcrel0-8)
|
|
lwa 3, 0(3)
|
|
blr
|
|
|
|
.globl glob_int
|
|
.p2align 2
|
|
glob_int:
|
|
.long 0
|
|
.size glob_int, 4
|