164 lines · plain
1# REQUIRES: ppc2# RUN: llvm-mc -filetype=obj -triple=powerpc %s -o %t.o3# RUN: echo '.globl f, g, h; f: g: h:' | llvm-mc -filetype=obj -triple=powerpc - -o %t1.o4# RUN: ld.lld -shared %t1.o -soname t1.so -o %t1.so5# RUN: echo 'bl f+0x8000@plt' | llvm-mc -filetype=obj -triple=powerpc - -o %t2.o6 7## Check we can create PLT entries for -fPIE or -fpie executable.8# RUN: ld.lld -pie %t.o %t1.so %t2.o -o %t9# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s10# RUN: llvm-readobj -d %t | FileCheck --check-prefix=DYN %s11# RUN: llvm-readelf -S %t | FileCheck --check-prefix=SEC %s12# RUN: llvm-readelf -x .plt %t | FileCheck --check-prefix=HEX %s13# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefixes=CHECK,PIE %s14 15## Check we can create PLT entries for -fPIC or -fpic DSO.16# RUN: ld.lld -shared %t.o %t1.so %t2.o -o %t17# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s18# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefixes=CHECK,SHARED %s19 20# RELOC: .rela.dyn {21# RELOC-NEXT: R_PPC_ADDR32 f 0x022# RELOC-NEXT: R_PPC_ADDR32 g 0x023# RELOC-NEXT: R_PPC_ADDR32 h 0x024# RELOC-NEXT: }25# RELOC-NEXT: .rela.plt {26# RELOC-NEXT: R_PPC_JMP_SLOT f 0x027# RELOC-NEXT: R_PPC_JMP_SLOT g 0x028# RELOC-NEXT: R_PPC_JMP_SLOT h 0x029# RELOC-NEXT: }30 31# SEC: .got PROGBITS 0002037032# DYN: PPC_GOT 0x2037033 34## .got2+0x8000-0x10004 = 0x30000+0x8000-0x10004 = 65536*2+3276435# CHECK-LABEL: <_start>:36# PIE-NEXT: bcl 20, 31, 0x1021037# PIE-NEXT: 10210: mflr 3038# PIE-NEXT: addis 30, 30, 339# PIE-NEXT: addi 30, 30, -3240440## Two bl 00008000.got2.plt_pic32.f41# PIE-NEXT: bl 0x1024442# PIE-NEXT: bl 0x1024443## Two bl 00008000.got2.plt_pic32.g44# PIE-NEXT: bl 0x1025445# PIE-NEXT: bl 0x1025446## Two bl 00008000.got2.plt_pic32.h47# PIE-NEXT: bl 0x1026448# PIE-NEXT: bl 0x1026449# PIE-NEXT: addis 30, 30, {{.*}}50# PIE-NEXT: addi 30, 30, {{.*}}51## bl 00008000.plt_pic32.f52# PIE-NEXT: bl 0x1027453## bl 00008000.plt_pic32.f54# PIE-NEXT: bl 0x1028455# SHARED-NEXT: bcl 20, 31, 0x1023056# SHARED-NEXT: 10230: mflr 3057# SHARED-NEXT: addis 30, 30, 358# SHARED-NEXT: addi 30, 30, -3242059# SHARED-NEXT: bl 0x1026460# SHARED-NEXT: bl 0x1026461# SHARED-NEXT: bl 0x1027462# SHARED-NEXT: bl 0x1027463# SHARED-NEXT: bl 0x1028464# SHARED-NEXT: bl 0x1028465# SHARED-NEXT: addis 30, 30, {{.*}}66# SHARED-NEXT: addi 30, 30, {{.*}}67# SHARED-NEXT: bl 0x1029468# SHARED-NEXT: bl 0x102a469# CHECK-EMPTY:70 71## -fPIC call stubs of f and g.72# CHECK-NEXT: <00008000.got2.plt_pic32.f>:73# CHECK-NEXT: lwz 11, 32760(30)74# CHECK-NEXT: mtctr 1175# CHECK-NEXT: bctr76# CHECK-NEXT: nop77# CHECK-EMPTY:78# CHECK-NEXT: <00008000.got2.plt_pic32.g>:79# CHECK-NEXT: lwz 11, 32764(30)80# CHECK-NEXT: mtctr 1181# CHECK-NEXT: bctr82# CHECK-NEXT: nop83# CHECK-EMPTY:84 85## The -fPIC call stub of h needs two instructions addis+lwz to represent the offset 65536*1-32768.86# CHECK-NEXT: <00008000.got2.plt_pic32.h>:87# CHECK-NEXT: addis 11, 30, 188# CHECK-NEXT: lwz 11, -32768(11)89# CHECK-NEXT: mtctr 1190# CHECK-NEXT: bctr91# CHECK-EMPTY:92 93## -fpic call stub of f.94# CHECK-NEXT: <00000000.plt_pic32.f>:95# CHECK-NEXT: addis 11, 30, 296# CHECK-NEXT: lwz 11, 4(11)97# CHECK-NEXT: mtctr 1198# CHECK-NEXT: bctr99# CHECK-EMPTY:100 101## Another -fPIC call stub of f from another object file %t2.o102## .got2 may have different addresses in different object files,103## so the call stub cannot be shared.104# CHECK-NEXT: <00008000.got2.plt_pic32.f>:105 106## In Secure PLT ABI, .plt stores function pointers to first instructions of .glink107# HEX: 0x00040374 00010294 00010298 0001029c108 109## These instructions are referenced by .plt entries.110# CHECK: [[#%x,GLINK:]] <.glink>:111# CHECK-NEXT: b 0x[[#%x,GLINK+12]]112# CHECK-NEXT: b 0x[[#%x,GLINK+12]]113# CHECK-NEXT: b 0x[[#%x,GLINK+12]]114 115## PLTresolve116## Operand of addi: 0x102cc-.glink = 24117# CHECK-NEXT: addis 11, 11, 0118# CHECK-NEXT: mflr 0119# CHECK-NEXT: bcl 20, 31, 0x[[#%x,NEXT:]]120# CHECK-NEXT: [[#%x,NEXT]]: addi 11, 11, 24121 122# CHECK-NEXT: mflr 12123# CHECK-NEXT: mtlr 0124# CHECK-NEXT: sub 11, 11, 12125 126## Operand of lwz in -pie mode: &.got[1] - 0x102bc = 0x20380+4 - 0x102bc = 65536*1+200127# CHECK-NEXT: addis 12, 12, 1128# PIE-NEXT: lwz 0, 200(12)129# SHARED-NEXT: lwz 0, 184(12)130 131# PIE-NEXT: lwz 12, 204(12)132# SHARED-NEXT: lwz 12, 188(12)133# CHECK-NEXT: mtctr 0134# CHECK-NEXT: add 0, 11, 11135# CHECK-NEXT: add 11, 0, 11136# CHECK-NEXT: bctr137 138.section .got2,"aw"139.space 65516140.long f141.long g142.long h143 144.text145.globl _start146_start:147 bcl 20,31,.L148.L:149 mflr 30150 addis 30, 30, .got2+0x8000-.L@ha151 addi 30, 30, .got2+0x8000-.L@l152 bl f+0x8000@plt153 bl f+0x8000@plt154 bl g+0x8000@plt155 bl g+0x8000@plt156 bl h+0x8000@plt157 bl h+0x8000@plt158 159## An addend of 0 indicates r30 is stored in _GLOBAL_OFFSET_TABLE_.160## The existing thunk is incompatible, thus it cannot be reused.161 addis 30, 30, _GLOBAL_OFFSET_TABLE_-.L@ha162 addi 30, 30, _GLOBAL_OFFSET_TABLE_-.L@l163 bl f@plt164