[AArch64][Outliner] Don't outline BTI instructions

We can't outline BTI instructions, because they need to be the very first
instruction executed after an indirect call or branch. If we outline them, then
an indirect call might go to the branch to the outlined function, which will
fault.

Differential revision: https://reviews.llvm.org/D57753

llvm-svn: 353190
This commit is contained in:
Oliver Stannard 2019-02-05 17:21:57 +00:00
parent 1f1c4b7b3e
commit a390364af8
2 changed files with 30 additions and 0 deletions

View File

@ -5330,6 +5330,14 @@ AArch64InstrInfo::getOutliningType(MachineBasicBlock::iterator &MIT,
MI.modifiesRegister(AArch64::W30, &getRegisterInfo()))
return outliner::InstrType::Illegal;
// Don't outline BTI instructions, because that will prevent the outlining
// site from being indirectly callable.
if (MI.getOpcode() == AArch64::HINT) {
int64_t Imm = MI.getOperand(0).getImm();
if (Imm == 32 || Imm == 34 || Imm == 36 || Imm == 38)
return outliner::InstrType::Illegal;
}
return outliner::InstrType::Legal;
}

View File

@ -0,0 +1,22 @@
; RUN: llc -mtriple aarch64--none-eabi < %s | FileCheck %s
; The BTI instruction cannot be outlined, because it needs to be the very first
; instruction executed after an indirect call.
@g = hidden global i32 0, align 4
define hidden void @foo() minsize "branch-target-enforcement" {
entry:
; CHECK: hint #34
; CHECK: b OUTLINED_FUNCTION_0
store volatile i32 1, i32* @g, align 4
ret void
}
define hidden void @bar() minsize "branch-target-enforcement" {
entry:
; CHECK: hint #34
; CHECK: b OUTLINED_FUNCTION_0
store volatile i32 1, i32* @g, align 4
ret void
}