1; RUN: opt < %s -wasm-lower-em-ehsjlj -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 i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 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 { i8*, i32 } 20 catch i8* null 21 %1 = extractvalue { i8*, i32 } %0, 0 22 %2 = extractvalue { i8*, i32 } %0, 1 23 br label %catch 24 25catch: ; preds = %lpad 26 %3 = call i8* @__cxa_begin_catch(i8* %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 i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 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, i32* 41; CHECK-NEXT: call cc{{.*}} void @__invoke_void(void ()* @foo) 42 43invoke.cont: ; preds = %entry 44 br label %try.cont 45 46lpad: ; preds = %entry 47 %0 = landingpad { i8*, i32 } 48 catch i8* null 49 %1 = extractvalue { i8*, i32 } %0, 0 50 %2 = extractvalue { i8*, i32 } %0, 1 51 br label %catch 52 53catch: ; preds = %lpad 54 %3 = call i8* @__cxa_begin_catch(i8* %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 i8* @__cxa_begin_catch(i8*) 65declare void @__cxa_end_catch() 66