| ; The "exception-model" module flag selects the EH model. Wasm triples default | |
| ; to no exception handling, so a module without the flag gets neither. | |
| ; RUN: split-file %s %t | |
| ; RUN: llc -wasm-use-legacy-eh=false -mattr=+exception-handling %t/wasm.ll -o - | FileCheck %s --check-prefix=WASM | |
| ; RUN: llc %t/emscripten.ll -o - | FileCheck %s --check-prefix=EM | |
| ; RUN: llc %t/noflag.ll -o - | FileCheck %s --check-prefix=NOFLAG | |
| ; WASM: .tagtype __cpp_exception i32 | |
| ; WASM: try_table (catch __cpp_exception 0) | |
| ; EM: .functype invoke_v (i32) -> () | |
| ; EM: call invoke_v | |
| ; EM: call __cxa_find_matching_catch_3 | |
| ; NOFLAG: call g | |
| ; NOFLAG-NOT: try_table | |
| ; NOFLAG-NOT: invoke_v | |
| ;--- wasm.ll | |
| target triple = "wasm32-unknown-unknown" | |
| declare void @g() | |
| declare i32 @__gxx_wasm_personality_v0(...) | |
| declare void @__cxa_end_catch() | |
| define void @f() personality ptr @__gxx_wasm_personality_v0 { | |
| entry: | |
| invoke void @g() to label %cont unwind label %catch.dispatch | |
| catch.dispatch: | |
| %cs = catchswitch within none [label %catch.start] unwind to caller | |
| catch.start: | |
| %cp = catchpad within %cs [ptr null] | |
| %e = call ptr @llvm.wasm.get.exception(token %cp) | |
| %s = call i32 @llvm.wasm.get.ehselector(token %cp) | |
| call void @__cxa_end_catch() [ "funclet"(token %cp) ] | |
| catchret from %cp to label %cont | |
| cont: | |
| ret void | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"exception-model", !"wasm"} | |
| ;--- emscripten.ll | |
| target triple = "wasm32-unknown-emscripten" | |
| @_ZTIi = external constant ptr | |
| declare void @g() | |
| declare i32 @__gxx_personality_v0(...) | |
| declare ptr @__cxa_begin_catch(ptr) | |
| declare void @__cxa_end_catch() | |
| define void @f() personality ptr @__gxx_personality_v0 { | |
| entry: | |
| invoke void @g() to label %cont unwind label %lpad | |
| lpad: | |
| %p = landingpad { ptr, i32 } catch ptr @_ZTIi | |
| %e = extractvalue { ptr, i32 } %p, 0 | |
| %q = call ptr @__cxa_begin_catch(ptr %e) | |
| call void @__cxa_end_catch() | |
| br label %cont | |
| cont: | |
| ret void | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"exception-model", !"emscripten"} | |
| ;--- noflag.ll | |
| target triple = "wasm32-unknown-unknown" | |
| declare void @g() | |
| declare i32 @__gxx_wasm_personality_v0(...) | |
| declare void @__cxa_end_catch() | |
| define void @f() personality ptr @__gxx_wasm_personality_v0 { | |
| entry: | |
| invoke void @g() to label %cont unwind label %catch.dispatch | |
| catch.dispatch: | |
| %cs = catchswitch within none [label %catch.start] unwind to caller | |
| catch.start: | |
| %cp = catchpad within %cs [ptr null] | |
| %e = call ptr @llvm.wasm.get.exception(token %cp) | |
| %s = call i32 @llvm.wasm.get.ehselector(token %cp) | |
| call void @__cxa_end_catch() [ "funclet"(token %cp) ] | |
| catchret from %cp to label %cont | |
| cont: | |
| ret void | |
| } |