; RUN: llc -mtriple arm64e-apple-darwin -o - %s \
; RUN: | FileCheck %s --check-prefixes=CHECK,DARWIN,DARWIN-SDAG
; RUN: llc -mtriple aarch64 -mattr=+pauth -o - %s \
; RUN: | FileCheck %s --check-prefixes=CHECK,ELF,ELF-SDAG
; RUN: llc -mtriple arm64e-apple-darwin -o - %s \
; RUN: -global-isel -global-isel-abort=1 -verify-machineinstrs \
; RUN: | FileCheck %s --check-prefixes=CHECK,DARWIN,DARWIN-GISEL
; RUN: llc -mtriple aarch64 -mattr=+pauth -o - %s \
; RUN: -global-isel -global-isel-abort=1 -verify-machineinstrs \
; RUN: | FileCheck %s --check-prefixes=CHECK,ELF,ELF-GISEL
; DARWIN-LABEL: _test_invoke_ia_0:
; DARWIN-NEXT: [[FNBEGIN:L.*]]:
; DARWIN-NEXT: .cfi_startproc
; DARWIN-NEXT: .cfi_personality 155, ___gxx_personality_v0
; DARWIN-NEXT: .cfi_lsda 16, [[EXCEPT:Lexception[0-9]+]]
; DARWIN-NEXT: ; %bb.0:
; DARWIN-NEXT: stp x20, x19, [sp, #-32]!
; DARWIN-NEXT: stp x29, x30, [sp, #16]
; DARWIN-NEXT: .cfi_def_cfa_offset 32
; DARWIN-NEXT: .cfi_offset w30, -8
; DARWIN-NEXT: .cfi_offset w29, -16
; DARWIN-NEXT: .cfi_offset w19, -24
; DARWIN-NEXT: .cfi_offset w20, -32
; DARWIN-NEXT: [[PRECALL:L.*]]:
; DARWIN-NEXT: blraaz x0
; DARWIN-SDAG-NEXT: [[POSTCALL:L.*]]:
; DARWIN-SDAG-NEXT: ; %bb.1:
; DARWIN-SDAG-NEXT: mov x19, x0
; DARWIN-GISEL-NEXT: mov x19, x0
; DARWIN-GISEL-NEXT: [[POSTCALL:L.*]]:
; DARWIN-NEXT: [[CALLBB:L.*]]:
; DARWIN-NEXT: bl _foo
; DARWIN-NEXT: mov x0, x19
; DARWIN-NEXT: ldp x29, x30, [sp, #16]
; DARWIN-NEXT: ldp x20, x19, [sp], #32
; DARWIN-NEXT: ret
; DARWIN-NEXT: [[LPADBB:LBB[0-9_]+]]:
; DARWIN-NEXT: [[LPAD:L.*]]:
; DARWIN-NEXT: mov w19, #-1
; DARWIN-NEXT: b [[CALLBB]]
; ELF-LABEL: test_invoke_ia_0:
; ELF-NEXT: [[FNBEGIN:.L.*]]:
; ELF-NEXT: .cfi_startproc
; ELF-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
; ELF-NEXT: .cfi_lsda 28, [[EXCEPT:.Lexception[0-9]+]]
; ELF-NEXT: // %bb.0:
; ELF-NEXT: stp x30, x19, [sp, #-16]!
; ELF-NEXT: .cfi_def_cfa_offset 16
; ELF-NEXT: .cfi_offset w19, -8
; ELF-NEXT: .cfi_offset w30, -16
; ELF-NEXT: [[PRECALL:.L.*]]:
; ELF-NEXT: blraaz x0
; ELF-SDAG-NEXT: [[POSTCALL:.L.*]]:
; ELF-SDAG-NEXT: // %bb.1:
; ELF-SDAG-NEXT: mov w19, w0
; ELF-GISEL-NEXT: mov w19, w0
; ELF-GISEL-NEXT: [[POSTCALL:.L.*]]:
; ELF-NEXT: [[CALLBB:.L.*]]:
; ELF-NEXT: bl foo
; ELF-NEXT: mov w0, w19
; ELF-NEXT: ldp x30, x19, [sp], #16
; ELF-NEXT: ret
; ELF-NEXT: [[LPADBB:.LBB[0-9_]+]]:
; ELF-NEXT: [[LPAD:.L.*]]:
; ELF-NEXT: mov w19, #-1
; ELF-NEXT: b [[CALLBB]]
; CHECK-LABEL: GCC_except_table{{.*}}:
; CHECK-NEXT: [[EXCEPT]]:
; CHECK: .uleb128 [[POSTCALL]]-[[PRECALL]] {{.*}} Call between [[PRECALL]] and [[POSTCALL]]
; CHECK-NEXT: .uleb128 [[LPAD]]-[[FNBEGIN]] {{.*}} jumps to [[LPAD]]
; CHECK-NEXT: .byte 0 {{.*}} On action: cleanup
define i32 @test_invoke_ia_0(ptr %arg0) #0 personality ptr @__gxx_personality_v0 {
%tmp0 = invoke i32 %arg0() [ "ptrauth"(i32 0, i64 0) ] to label %continuebb
unwind label %unwindbb
unwindbb:
%tmp1 = landingpad { ptr, i32 } cleanup
call void @foo()
ret i32 -1
continuebb:
call void @foo()
ret i32 %tmp0
}
@_ZTIPKc = external constant ptr
@hello_str = private unnamed_addr constant [6 x i8] c"hello\00", align 1
; DARWIN-LABEL: _test_invoke_ib_42_catch:
; DARWIN-NEXT: [[FNBEGIN:L.*]]:
; DARWIN-NEXT: .cfi_startproc
; DARWIN-NEXT: .cfi_personality 155, ___gxx_personality_v0
; DARWIN-NEXT: .cfi_lsda 16, [[EXCEPT:Lexception[0-9]+]]
; DARWIN-NEXT: ; %bb.0:
; DARWIN-NEXT: stp x20, x19, [sp, #-32]!
; DARWIN-NEXT: stp x29, x30, [sp, #16]
; DARWIN-NEXT: .cfi_def_cfa_offset 32
; DARWIN-NEXT: .cfi_offset w30, -8
; DARWIN-NEXT: .cfi_offset w29, -16
; DARWIN-NEXT: .cfi_offset w19, -24
; DARWIN-NEXT: .cfi_offset w20, -32
; DARWIN-NEXT: mov x19, x0
; DARWIN-NEXT: mov w0, #8
; DARWIN-NEXT: bl ___cxa_allocate_exception
; DARWIN-NEXT: Lloh{{.*}}:
; DARWIN-NEXT: adrp x8, l_hello_str@PAGE
; DARWIN-NEXT: Lloh{{.*}}:
; DARWIN-NEXT: add x8, x8, l_hello_str@PAGEOFF
; DARWIN-NEXT: str x8, [x0]
; DARWIN-NEXT: [[PRECALL:L.*]]:
; DARWIN-NEXT: Lloh{{.*}}:
; DARWIN-NEXT: adrp x1, __ZTIPKc@GOTPAGE
; DARWIN-NEXT: Lloh{{.*}}:
; DARWIN-NEXT: ldr x1, [x1, __ZTIPKc@GOTPAGEOFF]
; DARWIN-NEXT: mov x2, #0
; DARWIN-NEXT: mov x17, #42
; DARWIN-NEXT: blrab x19, x17
; DARWIN-NEXT: [[POSTCALL:L.*]]:
; DARWIN-NEXT: ; %bb.1:
; DARWIN-NEXT: brk #0x1
; DARWIN-NEXT: [[LPADBB:LBB[0-9_]+]]:
; DARWIN-NEXT: [[LPAD:L.*]]:
; DARWIN-NEXT: mov x19, x1
; DARWIN-NEXT: bl ___cxa_begin_catch
; DARWIN-NEXT: cmp w19, #2
; DARWIN-NEXT: b.ne [[EXITBB:LBB[0-9_]+]]
; DARWIN-NEXT: ; %bb.3:
; DARWIN-NEXT: bl _bar
; DARWIN-NEXT: [[EXITBB]]:
; DARWIN-NEXT: bl _foo
; DARWIN-NEXT: bl ___cxa_end_catch
; DARWIN-NEXT: ldp x29, x30, [sp, #16]
; DARWIN-NEXT: ldp x20, x19, [sp], #32
; DARWIN-NEXT: ret
; DARWIN-NEXT: .loh {{.*}}
; DARWIN-NEXT: .loh {{.*}}
; DARWIN-NEXT: [[FNEND:L.*]]:
; ELF-LABEL: test_invoke_ib_42_catch:
; ELF-NEXT: [[FNBEGIN:.L.*]]:
; ELF-NEXT: .cfi_startproc
; ELF-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
; ELF-NEXT: .cfi_lsda 28, [[EXCEPT:.Lexception[0-9]+]]
; ELF-NEXT: // %bb.0:
; ELF-NEXT: stp x30, x19, [sp, #-16]!
; ELF-NEXT: .cfi_def_cfa_offset 16
; ELF-NEXT: .cfi_offset w19, -8
; ELF-NEXT: .cfi_offset w30, -16
; ELF-NEXT: mov x19, x0
; ELF-NEXT: mov w0, #8
; ELF-NEXT: bl __cxa_allocate_exception
; ELF-NEXT: adrp x8, .Lhello_str
; ELF-NEXT: add x8, x8, :lo12:.Lhello_str
; ELF-NEXT: str x8, [x0]
; ELF-NEXT: [[PRECALL:.L.*]]:
; ELF-NEXT: adrp x1, :got:_ZTIPKc
; ELF-NEXT: mov x2, xzr
; ELF-NEXT: ldr x1, [x1, :got_lo12:_ZTIPKc]
; ELF-NEXT: mov x17, #42
; ELF-NEXT: blrab x19, x17
; ELF-NEXT: [[POSTCALL:.L.*]]:
; ELF-NEXT: // %bb.1:
; ELF-NEXT: [[LPADBB:.LBB[0-9_]+]]:
; ELF-NEXT: [[LPAD:.L.*]]:
; ELF-NEXT: mov x19, x1
; ELF-NEXT: bl __cxa_begin_catch
; ELF-NEXT: cmp w19, #2
; ELF-NEXT: b.ne [[EXITBB:.LBB[0-9_]+]]
; ELF-NEXT: // %bb.3:
; ELF-NEXT: bl bar
; ELF-NEXT: [[EXITBB]]:
; ELF-NEXT: bl foo
; ELF-NEXT: bl __cxa_end_catch
; ELF-NEXT: ldp x30, x19, [sp], #16
; ELF-NEXT: ret
; ELF-NEXT: [[FNEND:.L.*]]:
; CHECK-LABEL: GCC_except_table{{.*}}:
; CHECK-NEXT: [[EXCEPT]]:
; CHECK-NEXT: .byte 255 {{.*}} @LPStart Encoding = omit
; DARWIN-NEXT: .byte 155 {{.*}} @TType Encoding = indirect pcrel sdata4
; ELF-NEXT: .byte 156 {{.*}} @TType Encoding = indirect pcrel sdata8
; CHECK-NEXT: .uleb128 [[TT:.?L.*]]-[[TTREF:.?L.*]]
; CHECK-NEXT: [[TTREF]]:
; CHECK-NEXT: .byte 1 {{.*}} Call site Encoding = uleb128
; CHECK-NEXT: .uleb128 [[CSEND:.?L.*]]-[[CSBEGIN:.?L.*]]
; CHECK-NEXT: [[CSBEGIN]]:
; CHECK-NEXT: .uleb128 [[FNBEGIN]]-[[FNBEGIN]] {{.*}} >> Call Site 1 <<
; CHECK-NEXT: .uleb128 [[PRECALL]]-[[FNBEGIN]] {{.*}} Call between [[FNBEGIN]] and [[PRECALL]]
; CHECK-NEXT: .byte 0 {{.*}} has no landing pad
; CHECK-NEXT: .byte 0 {{.*}} On action: cleanup
; CHECK-NEXT: .uleb128 [[PRECALL]]-[[FNBEGIN]] {{.*}} >> Call Site 2 <<
; CHECK-NEXT: .uleb128 [[POSTCALL]]-[[PRECALL]] {{.*}} Call between [[PRECALL]] and [[POSTCALL]]
; CHECK-NEXT: .uleb128 [[LPAD]]-[[FNBEGIN]] {{.*}} jumps to [[LPAD]]
; CHECK-NEXT: .byte 3 {{.*}} On action: 2
; CHECK-NEXT: .uleb128 [[POSTCALL]]-[[FNBEGIN]] {{.*}} >> Call Site 3 <<
; CHECK-NEXT: .uleb128 [[FNEND]]-[[POSTCALL]] {{.*}} Call between [[POSTCALL]] and [[FNEND]]
; CHECK-NEXT: .byte 0 {{.*}} has no landing pad
; CHECK-NEXT: .byte 0 {{.*}} On action: cleanup
; CHECK-NEXT: [[CSEND]]:
; CHECK-NEXT: .byte 1 {{.*}} >> Action Record 1 <<
; CHECK-NEXT: {{.*}} Catch TypeInfo 1
; CHECK-NEXT: .byte 0 {{.*}} No further actions
; CHECK-NEXT: .byte 2 {{.*}} >> Action Record 2 <<
; CHECK-NEXT: {{.*}} Catch TypeInfo 2
; CHECK-NEXT: .byte 125 {{.*}} Continue to action 1
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: {{.*}} >> Catch TypeInfos <<
; DARWIN-NEXT: [[TI:L.*]]: {{.*}} TypeInfo 2
; DARWIN-NEXT: .long __ZTIPKc@GOT-[[TI]]
; DARWIN-NEXT: .long 0 {{.*}} TypeInfo 1
; ELF-NEXT: [[TI:.?L.*]]: {{.*}} TypeInfo 2
; ELF-NEXT: .xword .L_ZTIPKc.DW.stub-[[TI]]
; ELF-NEXT: .xword 0 {{.*}} TypeInfo 1
; CHECK-NEXT: [[TT]]:
define void @test_invoke_ib_42_catch(ptr %fptr) #0 personality ptr @__gxx_personality_v0 {
%tmp0 = call ptr @__cxa_allocate_exception(i64 8)
store ptr getelementptr inbounds ([6 x i8], ptr @hello_str, i64 0, i64 0), ptr %tmp0, align 8
invoke void %fptr(ptr %tmp0, ptr @_ZTIPKc, ptr null) [ "ptrauth"(i32 1, i64 42) ]
to label %continuebb unwind label %catchbb
catchbb:
%tmp2 = landingpad { ptr, i32 }
catch ptr @_ZTIPKc
catch ptr null
%tmp3 = extractvalue { ptr, i32 } %tmp2, 0
%tmp4 = extractvalue { ptr, i32 } %tmp2, 1
%tmp5 = call i32 @llvm.eh.typeid.for(ptr @_ZTIPKc)
%tmp6 = icmp eq i32 %tmp4, %tmp5
%tmp7 = call ptr @__cxa_begin_catch(ptr %tmp3)
br i1 %tmp6, label %PKc_catchbb, label %any_catchbb
PKc_catchbb:
call void @bar(ptr %tmp7)
br label %any_catchbb
any_catchbb:
call void @foo()
call void @__cxa_end_catch()
ret void
continuebb:
unreachable
}
; DARWIN-LABEL: _test_invoke_ia_0_direct:
; DARWIN-NEXT: [[FNBEGIN:L.*]]:
; DARWIN-NEXT: .cfi_startproc
; DARWIN-NEXT: .cfi_personality 155, ___gxx_personality_v0
; DARWIN-NEXT: .cfi_lsda 16, [[EXCEPT:Lexception[0-9]+]]
; DARWIN-NEXT: ; %bb.0:
; DARWIN-NEXT: stp x20, x19, [sp, #-32]!
; DARWIN-NEXT: stp x29, x30, [sp, #16]
; DARWIN-NEXT: .cfi_def_cfa_offset 32
; DARWIN-NEXT: .cfi_offset w30, -8
; DARWIN-NEXT: .cfi_offset w29, -16
; DARWIN-NEXT: .cfi_offset w19, -24
; DARWIN-NEXT: .cfi_offset w20, -32
; DARWIN-NEXT: [[PRECALL:L.*]]:
; DARWIN-NEXT: bl _baz
; DARWIN-SDAG-NEXT: [[POSTCALL:L.*]]:
; DARWIN-SDAG-NEXT: ; %bb.1:
; DARWIN-SDAG-NEXT: mov x19, x0
; DARWIN-GISEL-NEXT: mov x19, x0
; DARWIN-GISEL-NEXT: [[POSTCALL:L.*]]:
; DARWIN-NEXT: [[CALLBB:L.*]]:
; DARWIN-NEXT: bl _foo
; DARWIN-NEXT: mov x0, x19
; DARWIN-NEXT: ldp x29, x30, [sp, #16]
; DARWIN-NEXT: ldp x20, x19, [sp], #32
; DARWIN-NEXT: ret
; DARWIN-NEXT: [[LPADBB:LBB[0-9_]+]]:
; DARWIN-NEXT: [[LPAD:L.*]]:
; DARWIN-NEXT: mov w19, #-1
; DARWIN-NEXT: b [[CALLBB]]
; ELF-LABEL: test_invoke_ia_0_direct:
; ELF-NEXT: [[FNBEGIN:.L.*]]:
; ELF-NEXT: .cfi_startproc
; ELF-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
; ELF-NEXT: .cfi_lsda 28, [[EXCEPT:.Lexception[0-9]+]]
; ELF-NEXT: // %bb.0:
; ELF-NEXT: stp x30, x19, [sp, #-16]!
; ELF-NEXT: .cfi_def_cfa_offset 16
; ELF-NEXT: .cfi_offset w19, -8
; ELF-NEXT: .cfi_offset w30, -16
; ELF-NEXT: [[PRECALL:.L.*]]:
; ELF-NEXT: bl baz
; ELF-SDAG-NEXT: [[POSTCALL:.L.*]]:
; ELF-SDAG-NEXT: // %bb.1:
; ELF-SDAG-NEXT: mov w19, w0
; ELF-GISEL-NEXT: mov w19, w0
; ELF-GISEL-NEXT: [[POSTCALL:.L.*]]:
; ELF-NEXT: [[CALLBB:.L.*]]:
; ELF-NEXT: bl foo
; ELF-NEXT: mov w0, w19
; ELF-NEXT: ldp x30, x19, [sp], #16
; ELF-NEXT: ret
; ELF-NEXT: [[LPADBB:.LBB[0-9_]+]]:
; ELF-NEXT: [[LPAD:.L.*]]:
; ELF-NEXT: mov w19, #-1
; ELF-NEXT: b [[CALLBB]]
; CHECK-LABEL: GCC_except_table{{.*}}:
; CHECK-NEXT: [[EXCEPT]]:
; CHECK: .uleb128 [[POSTCALL]]-[[PRECALL]] {{.*}} Call between [[PRECALL]] and [[POSTCALL]]
; CHECK-NEXT: .uleb128 [[LPAD]]-[[FNBEGIN]] {{.*}} jumps to [[LPAD]]
; CHECK-NEXT: .byte 0 {{.*}} On action: cleanup
define i32 @test_invoke_ia_0_direct() #0 personality ptr @__gxx_personality_v0 {
%tmp0 = invoke i32 ptrauth (ptr @baz, i32 0)() [ "ptrauth"(i32 0, i64 0) ] to label %continuebb
unwind label %unwindbb
unwindbb:
%tmp1 = landingpad { ptr, i32 } cleanup
call void @foo()
ret i32 -1
continuebb:
call void @foo()
ret i32 %tmp0
}
; DARWIN-LABEL: _test_invoke_ib_2_direct_mismatch:
; DARWIN-NEXT: [[FNBEGIN:L.*]]:
; DARWIN-NEXT: .cfi_startproc
; DARWIN-NEXT: .cfi_personality 155, ___gxx_personality_v0
; DARWIN-NEXT: .cfi_lsda 16, [[EXCEPT:Lexception[0-9]+]]
; DARWIN-NEXT: ; %bb.0:
; DARWIN-NEXT: stp x20, x19, [sp, #-32]!
; DARWIN-NEXT: stp x29, x30, [sp, #16]
; DARWIN-NEXT: .cfi_def_cfa_offset 32
; DARWIN-NEXT: .cfi_offset w30, -8
; DARWIN-NEXT: .cfi_offset w29, -16
; DARWIN-NEXT: .cfi_offset w19, -24
; DARWIN-NEXT: .cfi_offset w20, -32
; DARWIN-SDAG-NEXT: [[PRECALL:L.*]]:
; DARWIN-SDAG-NEXT: adrp x16, _baz@GOTPAGE
; DARWIN-SDAG-NEXT: ldr x16, [x16, _baz@GOTPAGEOFF]
; DARWIN-SDAG-NEXT: mov x17, #1234
; DARWIN-SDAG-NEXT: pacia x16, x17
; DARWIN-SDAG-NEXT: mov x8, x16
; DARWIN-SDAG-NEXT: mov x17, #2
; DARWIN-SDAG-NEXT: blrab x8, x17
; DARWIN-SDAG-NEXT: [[POSTCALL:L.*]]:
; DARWIN-SDAG-NEXT: ; %bb.1:
; DARWIN-SDAG-NEXT: mov x19, x0
; DARWIN-GISEL-NEXT: adrp x16, _baz@GOTPAGE
; DARWIN-GISEL-NEXT: ldr x16, [x16, _baz@GOTPAGEOFF]
; DARWIN-GISEL-NEXT: mov x17, #1234
; DARWIN-GISEL-NEXT: pacia x16, x17
; DARWIN-GISEL-NEXT: mov x8, x16
; DARWIN-GISEL-NEXT: [[PRECALL:L.*]]:
; DARWIN-GISEL-NEXT: mov x17, #2
; DARWIN-GISEL-NEXT: blrab x8, x17
; DARWIN-GISEL-NEXT: mov x19, x0
; DARWIN-GISEL-NEXT: [[POSTCALL:L.*]]:
; DARWIN-NEXT: [[CALLBB:L.*]]:
; DARWIN-NEXT: bl _foo
; DARWIN-NEXT: mov x0, x19
; DARWIN-NEXT: ldp x29, x30, [sp, #16]
; DARWIN-NEXT: ldp x20, x19, [sp], #32
; DARWIN-NEXT: ret
; DARWIN-NEXT: [[LPADBB:LBB[0-9_]+]]:
; DARWIN-NEXT: [[LPAD:L.*]]:
; DARWIN-NEXT: mov w19, #-1
; DARWIN-NEXT: b [[CALLBB]]
; ELF-LABEL: test_invoke_ib_2_direct_mismatch:
; ELF-NEXT: [[FNBEGIN:.L.*]]:
; ELF-NEXT: .cfi_startproc
; ELF-NEXT: .cfi_personality 156, DW.ref.__gxx_personality_v0
; ELF-NEXT: .cfi_lsda 28, [[EXCEPT:.Lexception[0-9]+]]
; ELF-NEXT: // %bb.0:
; ELF-NEXT: stp x30, x19, [sp, #-16]!
; ELF-NEXT: .cfi_def_cfa_offset 16
; ELF-NEXT: .cfi_offset w19, -8
; ELF-NEXT: .cfi_offset w30, -16
; ELF-SDAG-NEXT: [[PRECALL:.L.*]]:
; ELF-SDAG-NEXT: adrp x16, :got:baz
; ELF-SDAG-NEXT: ldr x16, [x16, :got_lo12:baz]
; ELF-SDAG-NEXT: mov x17, #1234
; ELF-SDAG-NEXT: pacia x16, x17
; ELF-SDAG-NEXT: mov x8, x16
; ELF-SDAG-NEXT: mov x17, #2
; ELF-SDAG-NEXT: blrab x8, x17
; ELF-SDAG-NEXT: [[POSTCALL:.L.*]]:
; ELF-SDAG-NEXT: // %bb.1:
; ELF-SDAG-NEXT: mov w19, w0
; ELF-GISEL-NEXT: adrp x16, :got:baz
; ELF-GISEL-NEXT: ldr x16, [x16, :got_lo12:baz]
; ELF-GISEL-NEXT: mov x17, #1234
; ELF-GISEL-NEXT: pacia x16, x17
; ELF-GISEL-NEXT: mov x8, x16
; ELF-GISEL-NEXT: [[PRECALL:.L.*]]:
; ELF-GISEL-NEXT: mov x17, #2
; ELF-GISEL-NEXT: blrab x8, x17
; ELF-GISEL-NEXT: mov w19, w0
; ELF-GISEL-NEXT: [[POSTCALL:.L.*]]:
; ELF-NEXT: [[CALLBB:.L.*]]:
; ELF-NEXT: bl foo
; ELF-NEXT: mov w0, w19
; ELF-NEXT: ldp x30, x19, [sp], #16
; ELF-NEXT: ret
; ELF-NEXT: [[LPADBB:.LBB[0-9_]+]]:
; ELF-NEXT: [[LPAD:.L.*]]:
; ELF-NEXT: mov w19, #-1
; ELF-NEXT: b [[CALLBB]]
; CHECK-LABEL: GCC_except_table{{.*}}:
; CHECK-NEXT: [[EXCEPT]]:
; CHECK: .uleb128 [[POSTCALL]]-[[PRECALL]] {{.*}} Call between [[PRECALL]] and [[POSTCALL]]
; CHECK-NEXT: .uleb128 [[LPAD]]-[[FNBEGIN]] {{.*}} jumps to [[LPAD]]
; CHECK-NEXT: .byte 0 {{.*}} On action: cleanup
define i32 @test_invoke_ib_2_direct_mismatch() #0 personality ptr @__gxx_personality_v0 {
%tmp0 = invoke i32 ptrauth (ptr @baz, i32 0, i64 1234)() [ "ptrauth"(i32 1, i64 2) ] to label %continuebb
unwind label %unwindbb
unwindbb:
%tmp1 = landingpad { ptr, i32 } cleanup
call void @foo()
ret i32 -1
continuebb:
call void @foo()
ret i32 %tmp0
}
; ELF-LABEL: .L_ZTIPKc.DW.stub:
; ELF-NEXT: .xword _ZTIPKc
declare void @foo()
declare void @bar(ptr)
declare i32 @baz()
declare i32 @__gxx_personality_v0(...)
declare ptr @__cxa_allocate_exception(i64)
declare void @__cxa_throw(ptr, ptr, ptr)
declare i32 @llvm.eh.typeid.for(ptr)
declare ptr @__cxa_begin_catch(ptr)
declare void @__cxa_end_catch()
attributes #0 = { nounwind }