diff options
author | Heejin Ahn <aheejin@gmail.com> | 2024-09-16 20:08:37 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-16 20:08:37 -0700 |
commit | 97ae505753c5ade30229d223733775766ae51e47 (patch) | |
tree | 807fc8cdf3cbdcfe8638e50133482a9e90b5b3cb /llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp | |
parent | 5df1b79372a89648cdb4ab798f1c74985e00ac6e (diff) | |
download | llvm-97ae505753c5ade30229d223733775766ae51e47.zip llvm-97ae505753c5ade30229d223733775766ae51e47.tar.gz llvm-97ae505753c5ade30229d223733775766ae51e47.tar.bz2 |
[WebAssembly] Support disassembler for try_table (#108800)
This adds support for disassembler for the new `try_table` instruction.
This adds tests for `throw` and `throw_ref` as well.
Currently tag expressions are not supported for `throw` or `try_table`
instruction when instructions are parsed from the disassembler. Not sure
whether there is a way to support it. (This is not a new thing for the
new EH proposal; it has not been supported for the legacy EH as well.)
Diffstat (limited to 'llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp b/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp index 3585b5f..a66ee2b 100644 --- a/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp +++ b/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp @@ -289,6 +289,24 @@ MCDisassembler::DecodeStatus WebAssemblyDisassembler::getInstruction( return MCDisassembler::Fail; break; } + case WebAssembly::OPERAND_CATCH_LIST: { + if (!parseLEBImmediate(MI, Size, Bytes, false)) + return MCDisassembler::Fail; + int64_t NumCatches = MI.getOperand(MI.getNumOperands() - 1).getImm(); + for (int64_t I = 0; I < NumCatches; I++) { + if (!parseImmediate<uint8_t>(MI, Size, Bytes)) + return MCDisassembler::Fail; + int64_t CatchOpcode = MI.getOperand(MI.getNumOperands() - 1).getImm(); + if (CatchOpcode == wasm::WASM_OPCODE_CATCH || + CatchOpcode == wasm::WASM_OPCODE_CATCH_REF) { + if (!parseLEBImmediate(MI, Size, Bytes, false)) // tag index + return MCDisassembler::Fail; + } + if (!parseLEBImmediate(MI, Size, Bytes, false)) // destination + return MCDisassembler::Fail; + } + break; + } case MCOI::OPERAND_REGISTER: // The tablegen header currently does not have any register operands since // we use only the stack (_S) instructions. |