static cl::opt<bool> EnableSelectionDAGSP("enable-selectiondag-sp",
cl::init(true), cl::Hidden);
+static cl::opt<bool> DisableCheckNoReturn("disable-check-noreturn-call",
+ cl::init(false), cl::Hidden);
char StackProtector::ID = 0;
if (&BB == FailBB)
continue;
Instruction *CheckLoc = dyn_cast<ReturnInst>(BB.getTerminator());
- if (!CheckLoc) {
+ if (!CheckLoc && !DisableCheckNoReturn) {
for (auto &Inst : BB) {
auto *CB = dyn_cast<CallBase>(&Inst);
if (!CB)
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc %s -mtriple=x86_64-unknown-linux-gnu -o - -verify-dom-info | FileCheck %s
+; RUN: llc %s -mtriple=x86_64-unknown-linux-gnu -disable-check-noreturn-call=true -o - -verify-dom-info | FileCheck --check-prefix=DISNOTET %s
; Function Attrs: sspreq
define void @_Z7catchesv() #0 personality i8* null {
; CHECK-NEXT: .LBB0_6: # %CallStackCheckFailBlk
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: callq __stack_chk_fail@PLT
+;
+; DISNOTET-LABEL: _Z7catchesv:
+; DISNOTET: # %bb.0: # %entry
+; DISNOTET-NEXT: pushq %rax
+; DISNOTET-NEXT: .cfi_def_cfa_offset 16
+; DISNOTET-NEXT: movq %fs:40, %rax
+; DISNOTET-NEXT: movq %rax, (%rsp)
+; DISNOTET-NEXT: .Ltmp0:
+; DISNOTET-NEXT: xorl %eax, %eax
+; DISNOTET-NEXT: xorl %edi, %edi
+; DISNOTET-NEXT: xorl %esi, %esi
+; DISNOTET-NEXT: xorl %edx, %edx
+; DISNOTET-NEXT: callq *%rax
+; DISNOTET-NEXT: .Ltmp1:
+; DISNOTET-NEXT: # %bb.1: # %invoke.cont
+; DISNOTET-NEXT: .Ltmp2:
+; DISNOTET-NEXT: xorl %eax, %eax
+; DISNOTET-NEXT: xorl %edi, %edi
+; DISNOTET-NEXT: callq *%rax
+; DISNOTET-NEXT: .Ltmp3:
+; DISNOTET-NEXT: # %bb.2: # %invoke.cont2
+; DISNOTET-NEXT: .LBB0_3: # %lpad1
+; DISNOTET-NEXT: .Ltmp4:
+; DISNOTET-NEXT: movq %fs:40, %rax
+; DISNOTET-NEXT: cmpq (%rsp), %rax
+; DISNOTET-NEXT: jne .LBB0_5
+; DISNOTET-NEXT: # %bb.4: # %SP_return
+; DISNOTET-NEXT: popq %rax
+; DISNOTET-NEXT: .cfi_def_cfa_offset 8
+; DISNOTET-NEXT: retq
+; DISNOTET-NEXT: .LBB0_5: # %CallStackCheckFailBlk
+; DISNOTET-NEXT: .cfi_def_cfa_offset 16
+; DISNOTET-NEXT: callq __stack_chk_fail@PLT
entry:
%call = invoke i64 null(i32 0, i8* null, i64 0)
to label %invoke.cont unwind label %lpad1