mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
7306e1ecd0
Recommit basic sibling call lowering (https://reviews.llvm.org/D67189) The issue was that if you have a return type other than void, call lowering will emit COPYs to get the return value after the call. Disallow sibling calls other than ones that return void for now. Also proactively disable swifterror tail calls for now, since there's a similar issue with COPYs there. Update call-translator-tail-call.ll to include test cases for each of these things. llvm-svn: 371114
29 lines
1.1 KiB
LLVM
29 lines
1.1 KiB
LLVM
; RUN: llc -mtriple aarch64--none-eabi -mattr=+bti < %s | FileCheck %s
|
|
; RUN: llc -mtriple aarch64--none-eabi -global-isel -global-isel-abort=2 -pass-remarks-missed=gisel* -mattr=+bti %s -verify-machineinstrs -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,FALLBACK
|
|
|
|
; FALLBACK: remark: <unknown>:0:0: unable to translate instruction: call: ' tail call void %p()' (in function: bti_enabled)
|
|
|
|
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
|
target triple = "aarch64-arm-none-eabi"
|
|
|
|
; When BTI is enabled, all indirect tail-calls must use x16 or x17 (the intra
|
|
; procedure call scratch registers) to hold the address, as these instructions
|
|
; are allowed to target the "BTI c" instruction at the start of the target
|
|
; function. The alternative to this would be to start functions with "BTI jc",
|
|
; which increases the number of potential ways they could be called, and
|
|
; weakens the security protections.
|
|
|
|
define void @bti_disabled(void ()* %p) {
|
|
entry:
|
|
tail call void %p()
|
|
; CHECK: br x0
|
|
ret void
|
|
}
|
|
|
|
define void @bti_enabled(void ()* %p) "branch-target-enforcement" {
|
|
entry:
|
|
tail call void %p()
|
|
; CHECK: br {{x16|x17}}
|
|
ret void
|
|
}
|