mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
91403d8b4a
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
47 lines
1.4 KiB
LLVM
47 lines
1.4 KiB
LLVM
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P9
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
|
|
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefix=P10
|
|
|
|
@newname = dso_local alias i32 (...), bitcast (i32 ()* @oldname to i32 (...)*)
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define dso_local signext i32 @oldname() #0 {
|
|
entry:
|
|
ret i32 55
|
|
}
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define dso_local signext i32 @caller() #0 {
|
|
; #P9-LABEL: caller
|
|
; #P9: bl newname
|
|
; #P9-NOT: nop
|
|
; #P9: blr
|
|
; #P10-LABEL: caller
|
|
; #P10: bl newname@notoc
|
|
; #P10-NOT: nop
|
|
; #P10: blr
|
|
entry:
|
|
%call = call signext i32 bitcast (i32 (...)* @newname to i32 ()*)()
|
|
ret i32 %call
|
|
}
|
|
|
|
; Function Attrs: noinline nounwind optnone -pcrelative-memops
|
|
; This caller does not use PC Relative memops
|
|
define dso_local signext i32 @caller_nopcrel() #1 {
|
|
; #P9-LABEL: caller_nopcrel
|
|
; #P9: bl newname
|
|
; #P9-NOT: nop
|
|
; #P9: blr
|
|
; #P10-LABEL: caller_nopcrel
|
|
; #P10: bl newname
|
|
; #P10-NEXT: nop
|
|
; #P10: blr
|
|
entry:
|
|
%call = call signext i32 bitcast (i32 (...)* @newname to i32 ()*)()
|
|
ret i32 %call
|
|
}
|
|
|
|
attributes #0 = { noinline nounwind optnone }
|
|
attributes #1 = { noinline nounwind optnone "target-features"="-pcrelative-memops" }
|