aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2024-09-16 20:08:37 -0700
committerGitHub <noreply@github.com>2024-09-16 20:08:37 -0700
commit97ae505753c5ade30229d223733775766ae51e47 (patch)
tree807fc8cdf3cbdcfe8638e50133482a9e90b5b3cb /llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp
parent5df1b79372a89648cdb4ab798f1c74985e00ac6e (diff)
downloadllvm-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.cpp18
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.