llvm-project/llvm/test/MC/WebAssembly/basic-assembly-errors.s
Heejin Ahn defb8fb2c6
[WebAssembly] Support assembly parsing for new EH (#108668)
This adds assembly parsing support for the new EH (exnref) proposal.

`try_table` parsing is a little tricky because catch clause lists use
`()` and the multivalue block return types also use `()`. This handles
all combinations below:
- No return type (void) + no catch list
- No return type (void) + catch list
- Single return type + no catch list
- Single return type + catch list
- Multivalue return type + no catch list
- Multivalue return type + catch list

This does not include AsmTypeCheck support yet. That's the reason why
this adds a new test file and use `--no-type-check` in the command line.
After the type checker is added as a follow-up, I plan to merge
https://github.com/llvm/llvm-project/blob/main/llvm/test/MC/WebAssembly/eh-assembly-legacy.s
with this file. (Turning on `-mattr=+exception-handling` adds support
for all legacy and new EH instructions in the assembly.
`-wasm-enable-exnref` in `llc` only controls which instructions to
generate and it doesn't affect `llvm-mc` and assembly parsing.)
2024-09-17 11:35:32 -07:00

63 lines
1.9 KiB
ArmAsm

# RUN: not llvm-mc -triple=wasm32-unknown-unknown -mattr=+simd128,+nontrapping-fptoint,+exception-handling %s 2>&1 | FileCheck %s
# CHECK: invalid operand for instruction
# (must be 0.0 or similar)
f32.const 0
# CHECK: basic-assembly-errors.s:9:1: error: Wasm doesn't support data symbols in text sections
.type objerr,@object
objerr:
# CHECK: End of block construct with no start: end_try
end_try
test0:
.functype test0 () -> ()
# CHECK: Block construct type mismatch, expected: end_function, instead got: end_loop
end_loop
block
# CHECK: Block construct type mismatch, expected: end_block, instead got: end_if
end_if
try
# CHECK: Block construct type mismatch, expected: end_try/delegate, instead got: end_block
end_block
loop
try
catch_all
catch_all
# CHECK: error: Block construct type mismatch, expected: end_try, instead got: catch_all
end
# CHECK: error: Expected integer constant, instead got: )
try_table (catch __cpp_exception)
end_try_table
block
# CHECK: error: invalid operand for instruction
try_table (catch_all 0) i32
i32.const 0
end_try_table
drop
end_block
block
# CHECK: error: Expected identifier, got: )
try_table (catch_all 0) () -> (i32, i32)
i32.const 0
i32.const 0
end_try_table
drop
drop
end_block
# CHECK: error: unknown type: not_catch
try_table (not_catch 0)
# CHECK: Block construct type mismatch, expected: end_try_table, instead got: end_function
end_function
# CHECK: error: Unmatched block construct(s) at function end: try_table
# CHECK: error: Unmatched block construct(s) at function end: catch_all
# CHECK: error: Unmatched block construct(s) at function end: loop
# CHECK: error: Unmatched block construct(s) at function end: try
# CHECK: error: Unmatched block construct(s) at function end: block
# CHECK: error: Unmatched block construct(s) at function end: function