| commit 593e17648eb217312e224daa38ea4f40ca697b0b |
| Author: Xiang1 Zhang <xiang1.zhang@intel.com> |
| Date: Wed Jan 11 16:54:07 2023 +0800 |
| |
| Add -disable-check-noreturn-call for stack protect |
| |
| Differential Revision: https://reviews.llvm.org/D141556 |
| Reviewed By: lanza |
| |
| diff --git a/llvm/lib/CodeGen/StackProtector.cpp b/llvm/lib/CodeGen/StackProtector.cpp |
| index f76877facc19..46685f7b8208 100644 |
| --- a/llvm/lib/CodeGen/StackProtector.cpp |
| +++ b/llvm/lib/CodeGen/StackProtector.cpp |
| @@ -60,6 +60,8 @@ STATISTIC(NumAddrTaken, "Number of local variables that have their address" |
| |
| 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; |
| |
| @@ -453,7 +455,7 @@ bool StackProtector::InsertStackProtectors() { |
| 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) |
| diff --git a/llvm/test/CodeGen/X86/stack-protector-no-return.ll b/llvm/test/CodeGen/X86/stack-protector-no-return.ll |
| index 5d535471057c..4f2402f4154a 100644 |
| --- 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 @@ 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 |