54 lines · plain
1; RUN: not --crash llc < %s -wasm-enable-eh -enable-emscripten-sjlj -exception-model=wasm 2>&1 | FileCheck %s2 3target triple = "wasm32-unknown-unknown"4 5%struct.__jmp_buf_tag = type { [6 x i32], i32, [32 x i32] }6 7define void @wasm_eh_emscripten_sjlj_error() personality ptr @__gxx_wasm_personality_v0 {8entry:9 %buf = alloca [1 x %struct.__jmp_buf_tag], align 1610 %call = call i32 @setjmp(ptr %buf) #011 br label %bb12 13bb:14 invoke void @foo()15 to label %try.cont unwind label %catch.dispatch16 17catch.dispatch: ; preds = %entry18 %0 = catchswitch within none [label %catch.start] unwind to caller19 20catch.start: ; preds = %catch.dispatch21 %1 = catchpad within %0 [ptr null]22 %2 = call ptr @llvm.wasm.get.exception(token %1)23 %3 = call i32 @llvm.wasm.get.ehselector(token %1)24 %4 = call ptr @__cxa_begin_catch(ptr %2) #2 [ "funclet"(token %1) ]25 call void @__cxa_end_catch() [ "funclet"(token %1) ]26 catchret from %1 to label %try.cont27 28try.cont: ; preds = %entry, %catch.start29 ret void30}31 32declare void @foo()33declare i32 @__gxx_wasm_personality_v0(...)34; Function Attrs: nounwind35declare ptr @llvm.wasm.get.exception(token) #036; Function Attrs: nounwind37declare i32 @llvm.wasm.get.ehselector(token) #038declare ptr @__cxa_begin_catch(ptr)39declare void @__cxa_end_catch()40; Function Attrs: returns_twice41declare i32 @setjmp(ptr) #042; Function Attrs: noreturn43declare void @longjmp(ptr, i32) #144declare ptr @malloc(i32)45declare void @free(ptr)46 47attributes #0 = { returns_twice }48attributes #1 = { noreturn }49attributes #2 = { nounwind }50 51; CHECK: LLVM ERROR: In function wasm_eh_emscripten_sjlj_error: When using Wasm EH with Emscripten SjLj, there is a restriction that `setjmp` function call and exception cannot be used within the same function52; CHECK-NEXT: invoke void @foo()53; CHECK-NEXT: to label %try.cont unwind label %catch.dispatch54