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.
35 lines
922 B
LLVM
35 lines
922 B
LLVM
;; 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"}
|