1; RUN: opt < %s -wasm-lower-em-ehsjlj -enable-emscripten-cxx-exceptions -emscripten-cxx-exceptions-allowed=do_catch -S | FileCheck %s 2 3target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 4target triple = "wasm32-unknown-unknown" 5 6define void @dont_catch() personality ptr @__gxx_personality_v0 { 7; CHECK-LABEL: @dont_catch( 8entry: 9 invoke void @foo() 10 to label %invoke.cont unwind label %lpad 11; CHECK: entry: 12; CHECK-NEXT: call void @foo() 13; CHECK-NEXT: br label %invoke.cont 14 15invoke.cont: ; preds = %entry 16 br label %try.cont 17 18lpad: ; preds = %entry 19 %0 = landingpad { ptr, i32 } 20 catch ptr null 21 %1 = extractvalue { ptr, i32 } %0, 0 22 %2 = extractvalue { ptr, i32 } %0, 1 23 br label %catch 24 25catch: ; preds = %lpad 26 %3 = call ptr @__cxa_begin_catch(ptr %1) 27 call void @__cxa_end_catch() 28 br label %try.cont 29 30try.cont: ; preds = %catch, %invoke.cont 31 ret void 32} 33 34define void @do_catch() personality ptr @__gxx_personality_v0 { 35; CHECK-LABEL: @do_catch( 36entry: 37 invoke void @foo() 38 to label %invoke.cont unwind label %lpad 39; CHECK: entry: 40; CHECK-NEXT: store i32 0, ptr 41; CHECK-NEXT: call cc{{.*}} void @__invoke_void(ptr @foo) 42 43invoke.cont: ; preds = %entry 44 br label %try.cont 45 46lpad: ; preds = %entry 47 %0 = landingpad { ptr, i32 } 48 catch ptr null 49 %1 = extractvalue { ptr, i32 } %0, 0 50 %2 = extractvalue { ptr, i32 } %0, 1 51 br label %catch 52 53catch: ; preds = %lpad 54 %3 = call ptr @__cxa_begin_catch(ptr %1) 55 call void @__cxa_end_catch() 56 br label %try.cont 57 58try.cont: ; preds = %catch, %invoke.cont 59 ret void 60} 61 62declare void @foo() 63declare i32 @__gxx_personality_v0(...) 64declare ptr @__cxa_begin_catch(ptr) 65declare void @__cxa_end_catch() 66