From 97ae505753c5ade30229d223733775766ae51e47 Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Mon, 16 Sep 2024 20:08:37 -0700 Subject: [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.) --- .../Disassembler/WebAssemblyDisassembler.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp') 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(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. -- cgit v1.1