; 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 }