227 lines · plain
1; RUN: llc -mtriple=i686-pc-windows-msvc < %s | FileCheck %s2; RUN: llc -mtriple=i686-pc-windows-msvc -filetype=obj < %s -o %t3 4declare void @may_throw_or_crash()5declare i32 @_except_handler3(...)6declare i32 @_except_handler4(...)7declare i32 @__CxxFrameHandler3(...)8declare i32 @llvm.eh.typeid.for(ptr)9 10define internal i32 @catchall_filt() {11 ret i32 112}13 14define void @use_except_handler3() personality ptr @_except_handler3 {15entry:16 invoke void @may_throw_or_crash()17 to label %cont unwind label %lpad18cont:19 ret void20lpad:21 %cs = catchswitch within none [label %catch] unwind to caller22catch:23 %p = catchpad within %cs [ptr @catchall_filt]24 catchret from %p to label %cont25}26 27; CHECK-LABEL: _use_except_handler3:28; CHECK: pushl %ebp29; CHECK-NEXT: movl %esp, %ebp30; CHECK-NEXT: pushl %ebx31; CHECK-NEXT: pushl %edi32; CHECK-NEXT: pushl %esi33; CHECK-NEXT: subl ${{[0-9]+}}, %esp34; CHECK-NEXT: movl %esp, -36(%ebp)35; CHECK-NEXT: movl $-1, -16(%ebp)36; CHECK-NEXT: movl $L__ehtable$use_except_handler3, -20(%ebp)37; CHECK-NEXT: leal -28(%ebp), %[[node:[^ ,]*]]38; CHECK-NEXT: movl $__except_handler3, -24(%ebp)39; CHECK-NEXT: movl %fs:0, %[[next:[^ ,]*]]40; CHECK-NEXT: movl %[[next]], -28(%ebp)41; CHECK-NEXT: movl %[[node]], %fs:042; CHECK-NEXT: movl $0, -16(%ebp)43; CHECK-NEXT: calll _may_throw_or_crash44 45; CHECK: movl -28(%ebp), %[[next:[^ ,]*]]46; CHECK-NEXT: movl %[[next]], %fs:047; CHECK: retl48; CHECK-NEXT: LBB1_2: # %catch{{$}}49 50; CHECK: .section .xdata,"dr"51; CHECK-LABEL: L__ehtable$use_except_handler3:52; CHECK-NEXT: .long -153; CHECK-NEXT: .long _catchall_filt54; CHECK-NEXT: .long LBB1_255 56define void @use_except_handler4() personality ptr @_except_handler4 {57entry:58 invoke void @may_throw_or_crash()59 to label %cont unwind label %lpad60cont:61 ret void62lpad:63 %cs = catchswitch within none [label %catch] unwind to caller64catch:65 %p = catchpad within %cs [ptr @catchall_filt]66 catchret from %p to label %cont67}68 69; CHECK-LABEL: _use_except_handler4:70; CHECK: pushl %ebp71; CHECK-NEXT: movl %esp, %ebp72; CHECK-NEXT: pushl %ebx73; CHECK-NEXT: pushl %edi74; CHECK-NEXT: pushl %esi75; CHECK-NEXT: subl ${{[0-9]+}}, %esp76; CHECK-NEXT: movl %ebp, %eax77; CHECK-NEXT: movl %esp, -36(%ebp)78; CHECK-NEXT: movl $-2, -16(%ebp)79; CHECK-NEXT: movl $L__ehtable$use_except_handler4, %[[lsda:[^ ,]*]]80; CHECK-NEXT: movl ___security_cookie, %[[seccookie:[^ ,]*]]81; CHECK-NEXT: xorl %[[seccookie]], %[[lsda]]82; CHECK-NEXT: movl %[[lsda]], -20(%ebp)83; CHECK-NEXT: xorl %[[seccookie]], %[[tmp1:[^ ,]*]]84; CHECK-NEXT: movl %[[tmp1]], -40(%ebp)85; CHECK-NEXT: leal -28(%ebp), %[[node:[^ ,]*]]86; CHECK-NEXT: movl $__except_handler4, -24(%ebp)87; CHECK-NEXT: movl %fs:0, %[[next:[^ ,]*]]88; CHECK-NEXT: movl %[[next]], -28(%ebp)89; CHECK-NEXT: movl %[[node]], %fs:090; CHECK-NEXT: movl $0, -16(%ebp)91; CHECK-NEXT: calll _may_throw_or_crash92 93; CHECK: movl -28(%ebp), %[[next:[^ ,]*]]94; CHECK-NEXT: movl %[[next]], %fs:095; CHECK-NEXT: addl $28, %esp96; CHECK-NEXT: popl %esi97; CHECK-NEXT: popl %edi98; CHECK-NEXT: popl %ebx99; CHECK-NEXT: popl %ebp100; CHECK-NEXT: retl101; CHECK-NEXT: LBB2_2: # %catch{{$}}102 103; CHECK: .section .xdata,"dr"104; CHECK-LABEL: L__ehtable$use_except_handler4:105; CHECK-NEXT: .long -2106; CHECK-NEXT: .long 0107; CHECK-NEXT: .long -40108; CHECK-NEXT: .long 0109; CHECK-NEXT: .long -2110; CHECK-NEXT: .long _catchall_filt111; CHECK-NEXT: .long LBB2_2112 113define void @use_except_handler4_ssp() sspstrong personality ptr @_except_handler4 {114entry:115 invoke void @may_throw_or_crash()116 to label %cont unwind label %lpad117cont:118 ret void119lpad:120 %cs = catchswitch within none [label %catch] unwind to caller121catch:122 %p = catchpad within %cs [ptr @catchall_filt]123 catchret from %p to label %cont124}125 126; CHECK-LABEL: _use_except_handler4_ssp:127; CHECK: pushl %ebp128; CHECK-NEXT: movl %esp, %ebp129; CHECK-NEXT: pushl %ebx130; CHECK-NEXT: pushl %edi131; CHECK-NEXT: pushl %esi132; CHECK-NEXT: subl ${{[0-9]+}}, %esp133; CHECK-NEXT: movl %ebp, %[[ehguard:[^ ,]*]]134; CHECK-NEXT: movl %esp, -36(%ebp)135; CHECK-NEXT: movl $-2, -16(%ebp)136; CHECK-NEXT: movl $L__ehtable$use_except_handler4_ssp, %[[lsda:[^ ,]*]]137; CHECK-NEXT: movl ___security_cookie, %[[seccookie:[^ ,]*]]138; CHECK-NEXT: xorl %[[seccookie]], %[[lsda]]139; CHECK-NEXT: movl %[[lsda]], -20(%ebp)140; CHECK-NEXT: xorl %[[seccookie]], %[[ehguard]]141; CHECK-NEXT: movl %[[ehguard]], -40(%ebp)142; CHECK-NEXT: leal -28(%ebp), %[[node:[^ ,]*]]143; CHECK-NEXT: movl $__except_handler4, -24(%ebp)144; CHECK-NEXT: movl %fs:0, %[[next:[^ ,]*]]145; CHECK-NEXT: movl %[[next]], -28(%ebp)146; CHECK-NEXT: movl %[[node]], %fs:0147; CHECK-NEXT: movl $0, -16(%ebp)148; CHECK-NEXT: calll _may_throw_or_crash149; CHECK: movl -28(%ebp), %[[next:[^ ,]*]]150; CHECK-NEXT: movl %[[next]], %fs:0 151; CHECK: retl152; CHECK-NEXT: [[catch:[^ ,]*]]: # %catch{{$}}153 154 155 156; CHECK: .section .xdata,"dr"157; CHECK-LABEL: L__ehtable$use_except_handler4_ssp:158; CHECK-NEXT: .long -2159; CHECK-NEXT: .long 0160; CHECK-NEXT: .long -40 161; CHECK-NEXT: .long 0162; CHECK-NEXT: .long -2163; CHECK-NEXT: .long _catchall_filt164; CHECK-NEXT: .long [[catch]]165 166define void @use_CxxFrameHandler3() personality ptr @__CxxFrameHandler3 {167 invoke void @may_throw_or_crash()168 to label %cont unwind label %catchall169cont:170 ret void171 172catchall:173 %cs = catchswitch within none [label %catch] unwind to caller174catch:175 %p = catchpad within %cs [ptr null, i32 64, ptr null]176 catchret from %p to label %cont177}178 179; CHECK-LABEL: _use_CxxFrameHandler3:180; CHECK: pushl %ebp181; CHECK-NEXT: movl %esp, %ebp182; CHECK-NEXT: pushl %ebx183; CHECK-NEXT: pushl %edi184; CHECK-NEXT: pushl %esi185; CHECK-NEXT: subl ${{[0-9]+}}, %esp186; CHECK-NEXT: movl %esp, -28(%ebp)187; CHECK-NEXT: movl $-1, -16(%ebp)188; CHECK-NEXT: leal -24(%ebp), %[[node:[^ ,]*]]189; CHECK-NEXT: movl $___ehhandler$use_CxxFrameHandler3, -20(%ebp)190; CHECK-NEXT: movl %fs:0, %[[next:[^ ,]*]]191; CHECK-NEXT: movl %[[next]], -24(%ebp)192; CHECK-NEXT: movl %[[node]], %fs:0193; CHECK-NEXT: movl $0, -16(%ebp)194; CHECK-NEXT: calll _may_throw_or_crash195; CHECK: movl -24(%ebp), %[[next:[^ ,]*]]196; CHECK-NEXT: movl %[[next]], %fs:0197; CHECK: retl198 199; CHECK: .section .xdata,"dr"200; CHECK-NEXT: .p2align 2201; CHECK-LABEL: L__ehtable$use_CxxFrameHandler3:202; CHECK-NEXT: .long 429065506203; CHECK-NEXT: .long 2204; CHECK-NEXT: .long $stateUnwindMap$use_CxxFrameHandler3205; CHECK-NEXT: .long 1206; CHECK-NEXT: .long $tryMap$use_CxxFrameHandler3207; CHECK-NEXT: .long 0208; CHECK-NEXT: .long 0209; CHECK-NEXT: .long 0210; CHECK-NEXT: .long 1211 212; CHECK-LABEL: inlineasm:213; CHECK: .safeseh my_handler214define i32 @inlineasm() {215entry:216 call void asm sideeffect ".safeseh my_handler", "~{dirflag},~{fpsr},~{flags}"()217 ret i32 0218}219 220; CHECK-LABEL: ___ehhandler$use_CxxFrameHandler3:221; CHECK: movl $L__ehtable$use_CxxFrameHandler3, %eax222; CHECK-NEXT: jmp ___CxxFrameHandler3 # TAILCALL223 224; CHECK: .safeseh __except_handler3225; CHECK-NEXT: .safeseh __except_handler4226; CHECK-NEXT: .safeseh ___ehhandler$use_CxxFrameHandler3227