| ; RUN: opt -p sjlj-eh-prepare %s -S -o - | FileCheck %s |
| |
| ; Check that callsites are set up correctly: |
| ; 1. Throwing call in the entry block does not set call_site |
| ; (function context hasn't been configured yet). |
| ; 2. Throwing call not in the entry block sets call_site to -1 |
| ; (reset to the initial state). |
| ; 3. Invoke instructions set call_site to the correct call site number. |
| ; 4. Resume instruction sets call_site to -1 (reset to the initial state). |
| |
| define void @test_call_sites() personality ptr @__gxx_personality_sj0 { |
| entry: |
| ; CHECK-NOT: store volatile |
| ; CHECK: call void @may_throw() |
| call void @may_throw() |
| |
| ; CHECK: store volatile i32 1 |
| ; CHECK-NEXT: call void @llvm.eh.sjlj.callsite(i32 1) |
| ; CHECK-NEXT: invoke void @may_throw() |
| invoke void @may_throw() to label %invoke.cont unwind label %lpad |
| |
| invoke.cont: |
| ; CHECK: store volatile i32 2 |
| ; CHECK-NEXT: call void @llvm.eh.sjlj.callsite(i32 2) |
| ; CHECK-NEXT: invoke void @may_throw() |
| invoke void @may_throw() to label %try.cont unwind label %lpad |
| |
| lpad: |
| ; CHECK: store volatile i32 -1 |
| ; CHECK-NEXT: resume |
| %lp = landingpad { ptr, i32 } catch ptr @type_info |
| resume { ptr, i32 } %lp |
| |
| try.cont: |
| ; CHECK: store volatile i32 -1 |
| ; CHECK-NEXT: call void @may_throw |
| call void @may_throw() |
| ret void |
| } |
| |
| @type_info = external constant ptr |
| |
| declare void @may_throw() |
| declare i32 @__gxx_personality_sj0(...) |