brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.1 KiB · e645199 Raw
206 lines · plain
1; RUN: llc -mtriple=i686-pc-windows-msvc   < %s | FileCheck %s --check-prefix=X862; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s --check-prefix=X643 4; Based on this source:5; extern "C" void may_throw(int);6; void f() {7;   try {8;     may_throw(1);9;     try {10;       may_throw(2);11;     } catch (int) {12;       may_throw(3);13;     }14;   } catch (int) {15;     may_throw(4);16;   }17; }18 19%rtti.TypeDescriptor2 = type { ptr, ptr, [3 x i8] }20%eh.CatchHandlerType = type { i32, ptr }21 22declare void @may_throw(i32)23declare i32 @__CxxFrameHandler3(...)24declare i32 @llvm.eh.typeid.for(ptr)25 26$"\01??_R0H@8" = comdat any27 28@"\01??_7type_info@@6B@" = external constant ptr29@"\01??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { ptr @"\01??_7type_info@@6B@", ptr null, [3 x i8] c".H\00" }, comdat30@llvm.eh.handlertype.H.0 = private unnamed_addr constant %eh.CatchHandlerType { i32 0, ptr @"\01??_R0H@8" }, section "llvm.metadata"31 32define void @f() #0 personality ptr @__CxxFrameHandler3 {33entry:34  invoke void @may_throw(i32 1)35          to label %invoke.cont unwind label %lpad.136 37invoke.cont:                                      ; preds = %entry38  invoke void @may_throw(i32 2)39          to label %try.cont.9 unwind label %lpad40 41try.cont.9:                                       ; preds = %invoke.cont.3, %invoke.cont, %catch.742  ret void43 44lpad:                                             ; preds = %catch, %entry45  %cs1 = catchswitch within none [label %catch] unwind label %lpad.146 47catch:                                            ; preds = %lpad.148  %p1 = catchpad within %cs1 [ptr @"\01??_R0H@8", i32 0, ptr null]49  invoke void @may_throw(i32 3) [ "funclet"(token %p1) ]50          to label %invoke.cont.3 unwind label %lpad.151 52invoke.cont.3:                                    ; preds = %catch53  catchret from %p1 to label %try.cont.954 55lpad.1:                                           ; preds = %invoke.cont56  %cs2 = catchswitch within none [label %catch.7] unwind to caller57 58catch.7:59  %p2 = catchpad within %cs2 [ptr @"\01??_R0H@8", i32 0, ptr null]60  call void @may_throw(i32 4) [ "funclet"(token %p2) ]61  catchret from %p2 to label %try.cont.962}63 64; X86-LABEL: _f:65; X86: movl $-1, [[state:[-0-9]+]](%ebp)66; X86: movl $___ehhandler$f, {{.*}}67;68; X86: movl $0, [[state]](%ebp)69; X86: pushl $170; X86: calll _may_throw71;72; X86: movl $1, [[state]](%ebp)73; X86: pushl $274; X86: calll _may_throw75;76; X86: movl $2, [[state]](%ebp)77; X86: pushl $378; X86: calll _may_throw79;80; X86: movl $3, [[state]](%ebp)81; X86: pushl $482; X86: calll _may_throw83 84 85; X64-LABEL: f:86; X64-LABEL: $ip2state$f:87; X64-NEXT:   .long .Lfunc_begin0@IMGREL88; X64-NEXT:   .long -189; X64-NEXT:   .long .Ltmp{{.*}}@IMGREL90; X64-NEXT:   .long 091; X64-NEXT:   .long .Ltmp{{.*}}@IMGREL92; X64-NEXT:   .long 193; X64-NEXT:   .long .Ltmp{{.*}}@IMGREL94; X64-NEXT:   .long -195; X64-NEXT:   .long "?catch${{.*}}@?0?f@4HA"@IMGREL96; X64-NEXT:   .long 297; X64-NEXT:   .long "?catch${{.*}}@?0?f@4HA"@IMGREL98; X64-NEXT:   .long 399 100; Based on this source:101; extern "C" void may_throw(int);102; struct S { ~S(); };103; void g() {104;   S x;105;   try {106;     may_throw(-1);107;   } catch (...) {108;     may_throw(0);109;     {110;       S y;111;       may_throw(1);112;     }113;     may_throw(2);114;   }115; }116 117%struct.S = type { i8 }118declare void @"\01??1S@@QEAA@XZ"(ptr)119 120define void @g() personality ptr @__CxxFrameHandler3 {121entry:122  %x = alloca %struct.S, align 1123  %y = alloca %struct.S, align 1124  invoke void @may_throw(i32 -1)125          to label %unreachable unwind label %catch.dispatch126 127catch.dispatch:                                   ; preds = %entry128  %0 = catchswitch within none [label %catch] unwind label %ehcleanup5129 130catch:                                            ; preds = %catch.dispatch131  %1 = catchpad within %0 [ptr null, i32 64, ptr null]132  invoke void @may_throw(i32 0) [ "funclet"(token %1) ]133          to label %invoke.cont unwind label %ehcleanup5134 135invoke.cont:                                      ; preds = %catch136  invoke void @may_throw(i32 1) [ "funclet"(token %1) ]137          to label %invoke.cont2 unwind label %ehcleanup138 139invoke.cont2:                                     ; preds = %invoke.cont140  invoke void @"\01??1S@@QEAA@XZ"(ptr nonnull %y) [ "funclet"(token %1) ]141          to label %invoke.cont3 unwind label %ehcleanup5142 143invoke.cont3:                                     ; preds = %invoke.cont2144  invoke void @may_throw(i32 2) [ "funclet"(token %1) ]145          to label %invoke.cont4 unwind label %ehcleanup5146 147invoke.cont4:                                     ; preds = %invoke.cont3148  catchret from %1 to label %try.cont149 150try.cont:                                         ; preds = %invoke.cont4151  call void @"\01??1S@@QEAA@XZ"(ptr nonnull %x)152  ret void153 154ehcleanup:                                        ; preds = %invoke.cont155  %2 = cleanuppad within %1 []156  call void @"\01??1S@@QEAA@XZ"(ptr nonnull %y) [ "funclet"(token %2) ]157  cleanupret from %2 unwind label %ehcleanup5158 159ehcleanup5:                                       ; preds = %invoke.cont2, %invoke.cont3, %ehcleanup, %catch, %catch.dispatch160  %3 = cleanuppad within none []161  call void @"\01??1S@@QEAA@XZ"(ptr nonnull %x) [ "funclet"(token %3) ]162  cleanupret from %3 unwind to caller163 164unreachable:                                      ; preds = %entry165  unreachable166}167 168; X86-LABEL: _g:169; X86: movl $-1, [[state:[-0-9]+]](%ebp)170; X86: movl $___ehhandler$g, {{.*}}171;172; X86: movl $1, [[state]](%ebp)173; X86: pushl $-1174; X86: calll _may_throw175;176; X86: movl $2, [[state]](%ebp)177; X86: pushl $0178; X86: calll _may_throw179;180; X86: movl $3, [[state]](%ebp)181; X86: pushl $1182; X86: calll _may_throw183;184; X86: movl $2, [[state]](%ebp)185; X86: pushl $2186; X86: calll _may_throw187 188; X64-LABEL: g:189; X64-LABEL: $ip2state$g:190; X64-NEXT:   .long .Lfunc_begin1@IMGREL191; X64-NEXT:   .long -1192; X64-NEXT:   .long .Ltmp{{.*}}@IMGREL193; X64-NEXT:   .long 1194; X64-NEXT:   .long .Ltmp{{.*}}@IMGREL195; X64-NEXT:   .long -1196; X64-NEXT:   .long "?catch${{.*}}@?0?g@4HA"@IMGREL197; X64-NEXT:   .long 2198; X64-NEXT:   .long .Ltmp{{.*}}@IMGREL199; X64-NEXT:   .long 3200; X64-NEXT:   .long .Ltmp{{.*}}@IMGREL201; X64-NEXT:   .long 2202 203 204; X86: .safeseh ___ehhandler$f205; X86: .safeseh ___ehhandler$g206