[llvm][StackProtector] Add noreturn to __stack_chk_fail call (#143976)
This is a reland for 99e53cb4139eda491f97cb33ee42ea424d352200 with the appropriate test fixes. It's possible for __stack_chk_fail to be an alias when using CrossDSOCFI since it will make a jump table entry for this function and replace it with an alias. StackProtector can crash since it always expects this to be a regular function. Instead add the noreturn attribute to the call.
This commit is contained in:
parent
3a6ef8b359
commit
94382c8e56
@ -731,8 +731,8 @@ BasicBlock *CreateFailBB(Function *F, const TargetLowering &TLI) {
|
||||
}
|
||||
|
||||
if (StackChkFail) {
|
||||
cast<Function>(StackChkFail.getCallee())->addFnAttr(Attribute::NoReturn);
|
||||
B.CreateCall(StackChkFail, Args);
|
||||
CallInst *Call = B.CreateCall(StackChkFail, Args);
|
||||
Call->addFnAttr(Attribute::NoReturn);
|
||||
}
|
||||
|
||||
B.CreateUnreachable();
|
||||
|
@ -0,0 +1,34 @@
|
||||
;; This is a minimal reproducer that caused StackProtector to crash with a bad cast when
|
||||
;; CrossDSOCFI is used. This test just needs to not crash.
|
||||
; REQUIRES: x86-registered-target
|
||||
; RUN: opt -mtriple=x86_64-pc-linux-gnu %s -passes=lowertypetests,cross-dso-cfi,stack-protector
|
||||
|
||||
define hidden void @__stack_chk_fail() !type !1{
|
||||
unreachable
|
||||
}
|
||||
|
||||
define void @store_captures() sspstrong {
|
||||
entry:
|
||||
%a = alloca i32, align 4
|
||||
%j = alloca ptr, align 8
|
||||
store ptr %a, ptr %j, align 8
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @func(ptr %0) {
|
||||
entry:
|
||||
%1 = call i1 @llvm.type.test(ptr %0, metadata !"typeid")
|
||||
br i1 %1, label %cont, label %trap
|
||||
|
||||
trap: ; preds = %entry
|
||||
call void @llvm.trap()
|
||||
unreachable
|
||||
|
||||
cont: ; preds = %entry
|
||||
call void %0()
|
||||
ret void
|
||||
}
|
||||
|
||||
!llvm.module.flags = !{!0}
|
||||
!0 = !{i32 4, !"Cross-DSO CFI", i32 1}
|
||||
!1 = !{i64 0, !"typeid"}
|
22
llvm/test/Transforms/StackProtector/stack-chk-fail-alias.ll
Normal file
22
llvm/test/Transforms/StackProtector/stack-chk-fail-alias.ll
Normal file
@ -0,0 +1,22 @@
|
||||
;; __stack_chk_fail should have the noreturn attr even if it is an alias
|
||||
; REQUIRES: x86-registered-target
|
||||
; RUN: opt -mtriple=x86_64-pc-linux-gnu %s -passes=stack-protector -S | FileCheck %s
|
||||
|
||||
define hidden void @__stack_chk_fail_impl() {
|
||||
unreachable
|
||||
}
|
||||
|
||||
@__stack_chk_fail = hidden alias void (), ptr @__stack_chk_fail_impl
|
||||
|
||||
; CHECK-LABEL: @store_captures(
|
||||
; CHECK: CallStackCheckFailBlk:
|
||||
; CHECK-NEXT: call void @__stack_chk_fail() [[ATTRS:#.*]]
|
||||
define void @store_captures() sspstrong {
|
||||
entry:
|
||||
%a = alloca i32, align 4
|
||||
%j = alloca ptr, align 8
|
||||
store ptr %a, ptr %j, align 8
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: attributes [[ATTRS]] = { noreturn }
|
Loading…
x
Reference in New Issue
Block a user