diff options
author | Yuri Iozzelli <y.iozzelli@gmail.com> | 2022-02-25 16:36:35 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-25 15:36:35 +0000 |
commit | 1f59b65d8befc8512ff9045bb371ea5ec379a78c (patch) | |
tree | 349621c048c7716a746d3361c8ec6219d32f0250 /src/decompiler.cc | |
parent | 08cf71aa180674432750a02581f1e214c310042d (diff) | |
download | wabt-1f59b65d8befc8512ff9045bb371ea5ec379a78c.tar.gz wabt-1f59b65d8befc8512ff9045bb371ea5ec379a78c.tar.bz2 wabt-1f59b65d8befc8512ff9045bb371ea5ec379a78c.zip |
Add initial support for code metadata (#1840)
See https://github.com/WebAssembly/tool-conventions/blob/main/CodeMetadata.md for the specification.
In particular this pr implements the following:
- Parsing code metadata sections in BinaryReader, providing appropriate callbacks that a BinaryReaderDelegate can implement:
- BinaryReaderObjdump: show the sections in a human-readable form
- BinaryReaderIr: add code metadata in the IR as expressions
- Parsing code metadata annotations in text format, adding them in the IR like the BinaryReaderIR does
- Writing the code metadata present in the IR in the proper sections when converting IR to binary
- Support in wasm-decompiler for showing code metadata as comments in the pseudo-code
All the features have corresponding tests.
Support for code metadata is gated through the --enable-code-metadata feature. For reading/writing in the text format, --enable-annotations is also required.
Missing features:
Support for function-level code metadata (offset 0)
Extensive validation in validator.cc (like making sure that all metadata instances are at the same code offset of an instruction)
Diffstat (limited to 'src/decompiler.cc')
-rw-r--r-- | src/decompiler.cc | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/decompiler.cc b/src/decompiler.cc index 1ddaedc3..91272301 100644 --- a/src/decompiler.cc +++ b/src/decompiler.cc @@ -604,6 +604,12 @@ struct Decompiler { ts += "]("; return WrapChild(args[0], ts, ")", Precedence::Atomic); } + case ExprType::CodeMetadata: { + auto cme = cast<CodeMetadataExpr>(n.e); + std::string c = "// @metadata.code." + cme->name + " "; + c += BinaryToString(cme->data); + return Value{{std::move(c)}, Precedence::None}; + } default: { // Everything that looks like a function call. std::string name; |