llvm/llvm/test/MC/WebAssembly/eh-assembly-legacy.s

# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+exception-handling < %s | FileCheck %s
# Check that it converts to .o without errors, but don't check any output:
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -mattr=+exception-handling -o %t.o < %s

  .tagtype  __cpp_exception i32
  .tagtype  __c_longjmp i32
  .functype  foo () -> ()

eh_legacy_test:
  .functype  eh_legacy_test () -> ()

  # try-catch with catch, catch_all, throw, and rethrow
  try
    i32.const 3
    throw     __cpp_exception
  catch       __cpp_exception
    drop
    rethrow 0
  catch       __c_longjmp
    drop
  catch_all
    rethrow 0
  end_try

  # Nested try-catch with a rethrow
  try
    call  foo
  catch_all
    try
    catch_all
      rethrow 1
    end_try
  end_try

  # try-catch with a single return value
  try i32
    i32.const 0
  catch       __cpp_exception
  end_try
  drop

  # try-catch with a mulvivalue return
  try () -> (i32, f32)
    i32.const 0
    f32.const 0.0
  catch       __cpp_exception
    f32.const 1.0
  end_try
  drop
  drop

  # Catch-less try
  try
    call  foo
  end_try
  end_function

# CHECK-LABEL: eh_legacy_test:
# CHECK:         try
# CHECK-NEXT:    i32.const       3
# CHECK-NEXT:    throw           __cpp_exception
# CHECK-NEXT:    catch           __cpp_exception
# CHECK-NEXT:    drop
# CHECK-NEXT:    rethrow         0
# CHECK-NEXT:    catch           __c_longjmp
# CHECK-NEXT:    drop
# CHECK-NEXT:    catch_all
# CHECK-NEXT:    rethrow         0
# CHECK-NEXT:    end_try

# CHECK:         try
# CHECK-NEXT:    call    foo
# CHECK-NEXT:    catch_all
# CHECK-NEXT:    try
# CHECK-NEXT:    catch_all
# CHECK-NEXT:    rethrow         1
# CHECK-NEXT:    end_try
# CHECK-NEXT:    end_try

# CHECK:         try             i32
# CHECK-NEXT:    i32.const       0
# CHECK-NEXT:    catch           __cpp_exception
# CHECK-NEXT:    end_try
# CHECK-NEXT:    drop

# CHECK:         try             () -> (i32, f32)
# CHECK-NEXT:    i32.const       0
# CHECK-NEXT:    f32.const       0x0p0
# CHECK-NEXT:    catch           __cpp_exception
# CHECK-NEXT:    f32.const       0x1p0
# CHECK-NEXT:    end_try
# CHECK-NEXT:    drop
# CHECK-NEXT:    drop

# CHECK:         try
# CHECK-NEXT:    call    foo
# CHECK-NEXT:    end_try
# CHECK-NEXT:    end_function