diff --git a/llvm/lib/CodeGen/StackProtector.cpp b/llvm/lib/CodeGen/StackProtector.cpp index dda392d38b27a..5f866eea7d4e7 100644 --- a/llvm/lib/CodeGen/StackProtector.cpp +++ b/llvm/lib/CodeGen/StackProtector.cpp @@ -725,8 +725,8 @@ BasicBlock *CreateFailBB(Function *F, const Triple &Trip) { StackChkFail = M->getOrInsertFunction("__stack_chk_fail", Type::getVoidTy(Context)); } - CallInst *Call = B.CreateCall(StackChkFail, Args); - Call->addFnAttr(Attribute::NoReturn); + cast(StackChkFail.getCallee())->addFnAttr(Attribute::NoReturn); + B.CreateCall(StackChkFail, Args); B.CreateUnreachable(); return FailBB; } diff --git a/llvm/test/Transforms/StackProtector/cross-dso-cfi-stack-chk-fail.ll b/llvm/test/Transforms/StackProtector/cross-dso-cfi-stack-chk-fail.ll deleted file mode 100644 index af03039813a2e..0000000000000 --- a/llvm/test/Transforms/StackProtector/cross-dso-cfi-stack-chk-fail.ll +++ /dev/null @@ -1,33 +0,0 @@ -;; 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. -; 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"} diff --git a/llvm/test/Transforms/StackProtector/stack-chk-fail-alias.ll b/llvm/test/Transforms/StackProtector/stack-chk-fail-alias.ll deleted file mode 100644 index ab0a6e3f455e7..0000000000000 --- a/llvm/test/Transforms/StackProtector/stack-chk-fail-alias.ll +++ /dev/null @@ -1,21 +0,0 @@ -;; __stack_chk_fail should have the noreturn attr even if it is an alias -; 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 }