# REQUIRES: ppc # RUN: llvm-mc -filetype=obj -triple=powerpc64le %s -o %t.o # RUN: echo '.globl ifunc; .type ifunc, %gnu_indirect_function; ifunc:' | \ # RUN: llvm-mc -filetype=obj -triple=powerpc64le - -o %t1.o # RUN: ld.lld %t.o %t1.o -o %t # RUN: llvm-readelf -Ssr %t | FileCheck --check-prefix=SEC %s # RUN: llvm-readelf -x .toc %t | FileCheck --check-prefix=HEX %s # RUN: llvm-objdump -d %t | FileCheck --check-prefix=DIS %s ## ifunc is a non-preemptable STT_GNU_IFUNC. The R_PPC64_ADDR64 in .toc ## creates a canonical PLT for it and changes its type to STT_FUNC. We can thus ## still perform toc-indirect to toc-relative relaxation because the distance ## to the address of the canonical PLT is fixed. # SEC: .text PROGBITS [[#%x,TEXT:]] # SEC: .plt NOBITS [[#%x,PLT:]] # SEC: {{0*}}[[#PLT]] {{.+}} R_PPC64_IRELATIVE [[#TEXT+8]] # SEC: {{0*}}[[#TEXT+8]] 0 FUNC GLOBAL DEFAULT 3 ifunc ## .toc[0] stores the address of the canonical PLT. # HEX: section '.toc': # HEX-NEXT: 0x100201f8 e8010110 00000000 # DIS: addi 3, 3, addis 3, 2, .toc@toc@ha ld 3, .toc@toc@l(3) .section .toc,"aw",@progbits .quad ifunc