diff --git a/llvm/lib/CodeGen/StackProtector.cpp b/llvm/lib/CodeGen/StackProtector.cpp --- a/llvm/lib/CodeGen/StackProtector.cpp +++ b/llvm/lib/CodeGen/StackProtector.cpp @@ -60,6 +60,8 @@ static cl::opt EnableSelectionDAGSP("enable-selectiondag-sp", cl::init(true), cl::Hidden); +static cl::opt DisableCheckNoReturn("disable-check-noreturn-call", + cl::init(false), cl::Hidden); char StackProtector::ID = 0; @@ -453,7 +455,7 @@ if (&BB == FailBB) continue; Instruction *CheckLoc = dyn_cast(BB.getTerminator()); - if (!CheckLoc) { + if (!CheckLoc && !DisableCheckNoReturn) { for (auto &Inst : BB) { auto *CB = dyn_cast(&Inst); if (!CB) diff --git a/llvm/test/CodeGen/X86/stack-protector-no-return.ll b/llvm/test/CodeGen/X86/stack-protector-no-return.ll --- a/llvm/test/CodeGen/X86/stack-protector-no-return.ll +++ b/llvm/test/CodeGen/X86/stack-protector-no-return.ll @@ -1,5 +1,6 @@ ; 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 { @@ -39,6 +40,39 @@ ; 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