80 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64-windows -mattr=+bti -o - %s | FileCheck %s3 4declare i32 @__CxxFrameHandler3(...)5declare void @may_throw()6 7; Purpose: For WinEH funclets, entry is call-like: accept `bti c` / `hint #34` or a PAC prologue.8 9define dso_local void @wineh_funclet() #0 personality ptr @__CxxFrameHandler3 {10; CHECK-LABEL: wineh_funclet:11; CHECK: .Lfunc_begin0:12; CHECK-NEXT: .seh_proc wineh_funclet13; CHECK-NEXT: .seh_handler __CxxFrameHandler3, @unwind, @except14; CHECK-NEXT: // %bb.0: // %entry15; CHECK-NEXT: bti c16; CHECK-NEXT: .seh_nop17; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill18; CHECK-NEXT: .seh_save_fplr_x 3219; CHECK-NEXT: mov x29, sp20; CHECK-NEXT: .seh_set_fp21; CHECK-NEXT: .seh_endprologue22; CHECK-NEXT: mov x0, #-2 // =0xfffffffffffffffe23; CHECK-NEXT: stur x0, [x29, #16]24; CHECK-NEXT: .Ltmp0: // EH_LABEL25; CHECK-NEXT: bl may_throw26; CHECK-NEXT: .Ltmp1: // EH_LABEL27; CHECK-NEXT: .LBB0_1: // Block address taken28; CHECK-NEXT: // %try.cont29; CHECK-NEXT: $ehgcr_0_1:30; CHECK-NEXT: bti j31; CHECK-NEXT: .seh_startepilogue32; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload33; CHECK-NEXT: .seh_save_fplr_x 3234; CHECK-NEXT: .seh_endepilogue35; CHECK-NEXT: ret36; CHECK-NEXT: .seh_endfunclet37; CHECK-NEXT: .seh_handlerdata38; CHECK-NEXT: .word $cppxdata$wineh_funclet@IMGREL39; CHECK-NEXT: .text40; CHECK-NEXT: .seh_endproc41; CHECK-NEXT: .def "?catch$2@?0?wineh_funclet@4HA";42; CHECK-NEXT: .scl 3;43; CHECK-NEXT: .type 32;44; CHECK-NEXT: .endef45; CHECK-NEXT: .p2align 246; CHECK-NEXT: "?catch$2@?0?wineh_funclet@4HA":47; CHECK-NEXT: .seh_proc "?catch$2@?0?wineh_funclet@4HA"48; CHECK-NEXT: .seh_handler __CxxFrameHandler3, @unwind, @except49; CHECK-NEXT: .LBB0_2: // %catch50; CHECK-NEXT: bti c51; CHECK-NEXT: .seh_nop52; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill53; CHECK-NEXT: .seh_save_fplr_x 1654; CHECK-NEXT: .seh_endprologue55; CHECK-NEXT: bl may_throw56; CHECK-NEXT: adrp x0, .LBB0_157; CHECK-NEXT: add x0, x0, .LBB0_158; CHECK-NEXT: .seh_startepilogue59; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload60; CHECK-NEXT: .seh_save_fplr_x 1661; CHECK-NEXT: .seh_endepilogue62; CHECK-NEXT: ret63entry:64 invoke void @may_throw()65 to label %try.cont unwind label %catch.dispatch66 67catch.dispatch:68 %cs = catchswitch within none [label %catch] unwind to caller69 70catch:71 %cp = catchpad within %cs [ptr null, i32 0, ptr null]72 call void @may_throw() ["funclet"(token %cp)]73 catchret from %cp to label %try.cont74 75try.cont:76 ret void77}78 79attributes #0 = { noinline "branch-target-enforcement"="true" }80