| ; RUN: llc -mtriple thumbv7-windows-msvc -o - %s | |
| ; XFAIL: * | |
| ; FIXME: C++ EH is not supported on thumbv7-windows-msvc yet. | |
| ; FIXME: Windows SEH for armv7 does not preserve the frame register R11 in | |
| ; handlers. This may affect C++ EH when accessing arguments on the stack in | |
| ; functions with stack realignment. | |
| ; C++ source: | |
| ; struct X { int x[100]; }; | |
| ; void f(X x, void (*a)(), void (*g)(int*)) { | |
| ; alignas(64) int aligned; | |
| ; try { | |
| ; a(); | |
| ; } catch (...) { | |
| ; g(&x.x[11]); | |
| ; } | |
| ; } | |
| %struct.X = type { [100 x i32] } | |
| define void @"?f@@YAXUX@@P6AXXZP6AXPAH@Z@Z"(ptr byval(%struct.X) align 4 %x, ptr %a, ptr %g) personality ptr @__CxxFrameHandler3 { | |
| entry: | |
| %g.addr = alloca ptr, align 4 | |
| %a.addr = alloca ptr, align 4 | |
| %aligned = alloca i32, align 64 | |
| store ptr %g, ptr %g.addr, align 4 | |
| store ptr %a, ptr %a.addr, align 4 | |
| %0 = load ptr, ptr %a.addr, align 4 | |
| invoke void %0() | |
| to label %invoke.cont unwind label %catch.dispatch | |
| catch.dispatch: ; preds = %entry | |
| %1 = catchswitch within none [label %catch] unwind to caller | |
| catch: ; preds = %catch.dispatch | |
| %2 = catchpad within %1 [ptr null, i32 64, ptr null] | |
| %3 = load ptr, ptr %g.addr, align 4 | |
| %x1 = getelementptr inbounds nuw %struct.X, ptr %x, i32 0, i32 0 | |
| %arrayidx = getelementptr inbounds [100 x i32], ptr %x1, i32 0, i32 11 | |
| call void %3(ptr %arrayidx) [ "funclet"(token %2) ] | |
| catchret from %2 to label %catchret.dest | |
| catchret.dest: ; preds = %catch | |
| br label %try.cont | |
| try.cont: ; preds = %catchret.dest, %invoke.cont | |
| ret void | |
| invoke.cont: ; preds = %entry | |
| br label %try.cont | |
| } | |
| declare dso_local arm_aapcs_vfpcc i32 @__CxxFrameHandler3(...) | |
| attributes #0 = { uwtable } |