diff --git a/llvm/lib/Target/AArch64/AArch64FastISel.cpp b/llvm/lib/Target/AArch64/AArch64FastISel.cpp --- a/llvm/lib/Target/AArch64/AArch64FastISel.cpp +++ b/llvm/lib/Target/AArch64/AArch64FastISel.cpp @@ -3154,7 +3154,7 @@ // Allow SelectionDAG isel to handle calls to functions like setjmp that need // a bti instruction following the call. if (CLI.CB && CLI.CB->hasFnAttr(Attribute::ReturnsTwice) && - !Subtarget->noBTIAtReturnTwice() && + !Subtarget->noBTIAtReturnTwice() && !Subtarget->hardenSlsBlr() && MF->getInfo()->branchTargetEnforcement()) return false; diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -7675,7 +7675,7 @@ Function *ARCFn = *objcarc::getAttachedARCFunction(CLI.CB); auto GA = DAG.getTargetGlobalAddress(ARCFn, DL, PtrVT); Ops.insert(Ops.begin() + 1, GA); - } else if (GuardWithBTI) + } else if (GuardWithBTI && !Subtarget->hardenSlsBlr()) CallOpc = AArch64ISD::CALL_BTI; // Returns a chain and a flag for retval copy to use. diff --git a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp --- a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp @@ -1178,7 +1178,7 @@ // instruction. else if (Info.CB && Info.CB->getAttributes().hasFnAttr(Attribute::ReturnsTwice) && - !Subtarget.noBTIAtReturnTwice() && + !Subtarget.noBTIAtReturnTwice() && !Subtarget.hardenSlsBlr() && MF.getInfo()->branchTargetEnforcement()) Opc = AArch64::BLR_BTI; else diff --git a/llvm/test/CodeGen/AArch64/setjmp-bti.ll b/llvm/test/CodeGen/AArch64/setjmp-bti.ll --- a/llvm/test/CodeGen/AArch64/setjmp-bti.ll +++ b/llvm/test/CodeGen/AArch64/setjmp-bti.ll @@ -7,6 +7,12 @@ ; RUN: FileCheck %s --check-prefix=NOBTI ; RUN: llc -mtriple=aarch64-none-linux-gnu -fast-isel -mattr=+no-bti-at-return-twice < %s | \ ; RUN: FileCheck %s --check-prefix=NOBTI +; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+harden-sls-blr < %s | \ +; RUN: FileCheck %s --check-prefix=SLS +; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -mattr=+harden-sls-blr < %s | \ +; RUN: FileCheck %s --check-prefix=SLS +; RUN: llc -mtriple=aarch64-none-linux-gnu -fast-isel -mattr=+harden-sls-blr < %s | \ +; RUN: FileCheck %s --check-prefix=SLS ; C source ; -------- @@ -36,6 +42,14 @@ ; NOBTI-NOT: hint #36 ; NOBTI: bl notsetjmp ; NOBTI-NOT: hint #36 + +; SLS-LABEL: bbb: +; SLS: bl setjmp +; SLS-NOT: hint #36 +; SLS: bl __llvm_slsblr_thunk_x{{[0-9]+}} +; SLS-NOT: hint #36 +; SLS: bl notsetjmp +; SLS-NOT: hint #36 entry: %fnptr = alloca ptr, align 8 %call = call i32 @setjmp(ptr noundef null) #0