1 ; RUN: llc -verify-machineinstrs -mtriple=i686-pc-windows-msvc < %s \ 2 ; RUN: | FileCheck --check-prefix=CHECK --check-prefix=X86 %s 3 ; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-windows-msvc < %s \ 4 ; RUN: | FileCheck --check-prefix=CHECK --check-prefix=X64 %s 5 6 ; Loosely based on IR for this C++ source code: 7 ; void f(int p); 8 ; void try_in_catch() { 9 ; try { 10 ; f(1); 11 ; } catch (...) { 12 ; try { 13 ; f(2); 14 ; } catch (...) { 15 ; f(3); 16 ; } 17 ; } 18 ; } 19 20 declare void @f(i32 %p) 21 declare i32 @__CxxFrameHandler3(...) 22 23 define i32 @try_in_catch() personality i32 (...)* @__CxxFrameHandler3 { 24 entry: 25 invoke void @f(i32 1) 26 to label %try.cont unwind label %catch.dispatch.1 27 try.cont: 28 ret i32 0 29 30 catch.dispatch.1: 31 %cs1 = catchswitch within none [label %handler1] unwind to caller 32 handler1: 33 %h1 = catchpad within %cs1 [i8* null, i32 64, i8* null] 34 invoke void @f(i32 2) [ "funclet"(token %h1) ] 35 to label %catchret1 unwind label %catch.dispatch.2 36 catchret1: 37 catchret from %h1 to label %try.cont 38 39 catch.dispatch.2: 40 %cs2 = catchswitch within %h1 [label %handler2] unwind to caller 41 handler2: 42 %h2 = catchpad within %cs2 [i8* null, i32 64, i8* null] 43 call void @f(i32 3) 44 catchret from %h2 to label %catchret1 45 } 46 47 ; X86-LABEL: L__ehtable$try_in_catch: 48 ; X64-LABEL: $cppxdata$try_in_catch: 49 ; CHECK-NEXT: .long 429065506 50 ; CHECK-NEXT: .long 4 51 ; CHECK-NEXT: .long ($stateUnwindMap$try_in_catch) 52 ; CHECK-NEXT: .long 2 53 ; CHECK-NEXT: .long ($tryMap$try_in_catch) 54 ; ip2state num + ptr 55 ; X86-NEXT: .long 0 56 ; X86-NEXT: .long 0 57 ; X64-NEXT: .long 7 58 ; X64-NEXT: .long ($ip2state$try_in_catch) 59 ; unwindhelp offset 60 ; X64-NEXT: .long 40 61 ; CHECK-NEXT: .long 0 62 ; EHFlags 63 ; CHECK-NEXT: .long 1 64 65 ; CHECK: $tryMap$try_in_catch: 66 ; CHECK-NEXT: .long 2 67 ; CHECK-NEXT: .long 2 68 ; CHECK-NEXT: .long 3 69 ; CHECK-NEXT: .long 1 70 ; CHECK-NEXT: .long ($handlerMap$0$try_in_catch) 71 ; CHECK-NEXT: .long 0 72 ; CHECK-NEXT: .long 0 73 ; CHECK-NEXT: .long 3 74 ; CHECK-NEXT: .long 1 75 ; CHECK-NEXT: .long ($handlerMap$1$try_in_catch) 76 77 ; CHECK: $handlerMap$0$try_in_catch: 78 ; CHECK-NEXT: .long 64 79 ; CHECK-NEXT: .long 0 80 ; CHECK-NEXT: .long 0 81 ; CHECK-NEXT: .long "?catch${{[0-9]+}}@?0?try_in_catch@4HA" 82 ; X64-NEXT: .long 56 83 84 ; CHECK: $handlerMap$1$try_in_catch: 85 ; CHECK-NEXT: .long 64 86 ; CHECK-NEXT: .long 0 87 ; CHECK-NEXT: .long 0 88 ; CHECK-NEXT: .long "?catch${{[0-9]+}}@?0?try_in_catch@4HA" 89 ; X64-NEXT: .long 56 90 91 ; X64: $ip2state$try_in_catch: 92 ; X64-NEXT: .long .Lfunc_begin0@IMGREL 93 ; X64-NEXT: .long -1 94 ; X64-NEXT: .long .Ltmp0@IMGREL+1 95 ; X64-NEXT: .long 0 96 ; X64-NEXT: .long .Ltmp1@IMGREL+1 97 ; X64-NEXT: .long -1 98 ; X64-NEXT: .long "?catch$2@?0?try_in_catch@4HA"@IMGREL 99 ; X64-NEXT: .long 1 100 ; X64-NEXT: .long .Ltmp2@IMGREL+1 101 ; X64-NEXT: .long 2 102 ; X64-NEXT: .long .Ltmp3@IMGREL+1 103 ; X64-NEXT: .long 1 104 ; X64-NEXT: .long "?catch$4@?0?try_in_catch@4HA"@IMGREL 105 ; X64-NEXT: .long 3 106