1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
Stefan Pintilie 91403d8b4a [PowerPC] Fix for PC Relative call protocol
The situation where the caller uses a TOC and the callee does not
but is marked as clobbers the TOC (st_other=1) was not being compiled
correctly if both functions where in the same object file.

The call site where we had `callee` was missing a nop after the call.
This is because it was assumed that since the two functions where in
the same DSO they would be sharing a TOC. This is not the case if the
callee uses PC Relative because in that case it may clobber the TOC.
This patch makes sure that we add the cnop correctly so that the
linker has a place to restore the TOC.

Reviewers: sfertile, NeHuang, saghir

Differential Revision: https://reviews.llvm.org/D81126
2020-07-01 07:08:41 -05:00

43 lines
1.4 KiB
LLVM

; RUN: llc %s -o - -mtriple=powerpc | FileCheck --check-prefix=REL %s
; RUN: llc %s -o - -mtriple=powerpc -relocation-model=pic | FileCheck --check-prefix=PLTREL %s
; RUN: llc %s -o - -mtriple=powerpc64 | FileCheck --check-prefix=REL %s
; RUN: llc %s -o - -mtriple=powerpc64 -relocation-model=pic | FileCheck --check-prefix=REL %s
; RUN: llc %s -o - -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 \
; RUN: -verify-machineinstrs | FileCheck --check-prefix=LEP8 %s
; RUN: llc %s -o - -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 \
; RUN: -verify-machineinstrs | FileCheck --check-prefix=LEP10 %s
@ifunc1 = dso_local ifunc void(), i8*()* @resolver
@ifunc2 = ifunc void(), i8*()* @resolver
define i8* @resolver() { ret i8* null }
define void @foo() #0 {
; REL-LABEL: foo
; REL: bl ifunc1{{$}}
; REL: bl ifunc2{{$}}
; PLTREL-LABEL: foo
; PLTREL: bl ifunc1@PLT+32768
; PLTREL: bl ifunc2@PLT+32768
; LEP8-LABEL: foo
; LEP8: bl ifunc1
; LEP8-NEXT: nop
; LEP8-NEXT: bl ifunc2
; LEP8-NEXT: nop
; LEP8: blr
; LEP10-LABEL: foo
; LEP10: bl ifunc1@notoc
; LEP10-NEXT: bl ifunc2@notoc
; LEP10-NOT: nop
; LEP10: blr
call void @ifunc1()
call void @ifunc2()
ret void
}
;; Use Secure PLT ABI for PPC32.
attributes #0 = { "target-features"="+secure-plt" }
!llvm.module.flags = !{!0}
!0 = !{i32 1, !"PIC Level", i32 2}