| ; RUN: opt -mtriple=x86_64-windows-msvc -passes=objc-arc -S < %s | FileCheck %s |
| |
| ; Check that funclet tokens are preserved |
| ; |
| ; CHECK-LABEL: catch: |
| ; CHECK: %1 = catchpad within %0 |
| ; CHECK: %2 = tail call ptr @llvm.objc.retain(ptr %exn) #0 [ "funclet"(token %1) ] |
| ; CHECK: call void @llvm.objc.release(ptr %exn) #0 [ "funclet"(token %1) ] |
| ; CHECK: catchret from %1 to label %eh.cont |
| |
| define void @try_catch_with_objc_intrinsic() personality ptr @__CxxFrameHandler3 { |
| entry: |
| %exn.slot = alloca ptr, align 8 |
| invoke void @may_throw(ptr null) to label %eh.cont unwind label %catch.dispatch |
| |
| catch.dispatch: ; preds = %entry |
| %0 = catchswitch within none [label %catch] unwind to caller |
| |
| eh.cont: ; preds = %catch, %entry |
| ret void |
| |
| catch: ; preds = %catch.dispatch |
| %1 = catchpad within %0 [ptr null, i32 0, ptr %exn.slot] |
| br label %if.then |
| |
| if.then: ; preds = %catch |
| %exn = load ptr, ptr null, align 8 |
| %2 = call ptr @llvm.objc.retain(ptr %exn) [ "funclet"(token %1) ] |
| call void @may_throw(ptr %exn) |
| call void @llvm.objc.release(ptr %exn) [ "funclet"(token %1) ] |
| catchret from %1 to label %eh.cont |
| } |
| |
| declare void @may_throw(ptr) |
| declare i32 @__CxxFrameHandler3(...) |
| |
| declare ptr @llvm.objc.retain(ptr) #0 |
| declare void @llvm.objc.release(ptr) #0 |
| |
| attributes #0 = { nounwind } |