summaryrefslogtreecommitdiff
path: root/src/binary-reader-ir.cc
Commit message (Collapse)AuthorAgeFilesLines
* wasm2c: atomic and shared mem operations using c11Shravan Narayan2024-01-301-0/+6
|
* Update ID for tag name subsection (#2336)Michael Williamson2023-11-271-0/+1
| | | | | | | The tag name subsection currently has the speculative ID of 10. However, the extended-name-section proposal has now been updated to use an ID of 11 for the tag name section. This updates the NameSectionSubsection enum accordingly, as well as adding a field name section with the ID of 10.
* wasm2c: implement the tail-call proposal (#2272)Keith Winstein2023-10-241-0/+14
|
* Implement custom section reading/writing (#2284)Diego Frias2023-09-151-0/+16
|
* Flip order of memory indexes on memory.copy (#2294)Keith Winstein2023-09-111-3/+3
| | | | Reflects change in the multi-memory proposal: https://github.com/WebAssembly/multi-memory/pull/29
* Share reading/validation code between elem exprs & other const exprs (#2288)Keith Winstein2023-09-061-21/+10
| | | | | | This continues the work from #1783 and reduces special handling of elem exprs, by treating them the same as other const expressions (init expressions).
* wasm2c: partial support for atomic memory opsShravan Narayan2023-05-171-0/+1
|
* BinaryReaderIR: silence clang 14 warning (NFC) (#2232)Keith Winstein2023-05-091-1/+1
|
* Track use of SIMD and exceptions in IR, and CWriter includes support only if ↵Keith Winstein2023-05-081-0/+18
| | | | used (#2226)
* BinaryReader/BinaryReaderIR: check for missing end markers (#2218)Keith Winstein2023-05-031-0/+12
|
* BinaryReaderIR: Limit number of function params, results, and locals (#2182)Keith Winstein2023-04-041-0/+19
|
* BinaryReaderIR: increase kMaxNestingDepth to 16,384 (#2170)Keith Winstein2023-03-141-1/+1
| | | | | | | | | Rationale: clang (compiled to Wasm) uses a label nesting depth of >1400, which is greater than the limit of 1024 created in PR #2169. In practice, with a debug build, values up to about 40,000 appear sufficient to keep the stack within an 8 MiB limit. On release builds it's more frugal and we could probably afford an even bigger limit. But, "16384 ought to be enough nesting depth for anybody."
* BinaryReaderIR: limit nesting depth to avoid stack overflow (#2169)Keith Winstein2023-03-131-18/+19
| | | | Fixes #2151 Fixes oss-fuzz #53958
* Replace MakeUnique with c++14 std::make_unique (#2152)Keith Winstein2023-02-271-102/+120
|
* BinaryReaderIR: fix mis-binding of tags with debug name (#2040)Keith Winstein2022-11-041-1/+1
| | | Fixes #2039
* Move headers to include/wabt/ (#1998)Alex Reinking2022-09-281-5/+5
| | | This makes things easier for users and packagers of libwabt.
* BinaryReaderIR: set name of type if given in name section (#1996)Keith Winstein2022-09-181-0/+19
| | | | Fixes #1687
* Fix incorrect index usage in BinaryReaderIR::OnTableSymbol (#1976)Sam Clegg2022-08-311-1/+1
|
* Support multi-memory in all memory ops and in apply/resolve-names (#1962)Keith Winstein2022-08-151-16/+32
|
* Track locations of Vars in BinaryReaderIR and BinaryReaderInterp (#1963)Keith Winstein2022-08-151-31/+34
| | | | - Rebase test output to match new location tracking on Vars - Eliminate single-argument Var() constructor.
* Add initial support for code metadata (#1840)Yuri Iozzelli2022-02-251-0/+94
| | | | | | | | | | | | | | | | | | | | | 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)
* Use C++17 string_view (#1826)Sam Clegg2022-02-111-67/+67
| | | | | Now that we have C++17 we don't need our own string_view class anymore. Depends on #1825
* Update testsuite (#1795)Sam Clegg2022-01-101-4/+8
| | | | Remove test/binary/bad-function-missing-end.txt which is now covered upstream: https://github.com/WebAssembly/spec/pull/1405
* Clang-format codebase (#1684)Heejin Ahn2021-12-201-29/+50
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This applies clang-format to the whole codebase. I noticed we have .clang-format in wabt but the codebase is not very well formatted. This kind of mass-formatting PR has fans and skeptics because it can mess with `git blame`, but we did a similar thing in Binaryen a few years ago (WebAssembly/binaryen#2048, which was merged in WebAssembly/binaryen#2059) and it was not very confusing after all. If we are ever going to format the codebase, I think it is easier to do it in a single big PR than dozens of smaller PRs. This is using the existing .clang-format file in this repo, which follows the style of Chromium. If we think this does not suit the current formatting style, we can potentially tweak .clang-format too. For example, I noticed the current codebase puts many `case` statements within a single line when they are short, but the current .clang-format does not allow that. This does not include files in src/prebuilt, because they are generated. This also manually fixes some comment lines, because mechanically applying clang-format to long inline comments can look weird. I also added a clang-format check hook in the Github CI in #1683, which I think can be less controversial, given that it only checks the diff. --- After discussions, we ended up reverting many changes, especially one-liner functions and switch-cases, which are too many to wrap in `// clang-format off` and `// clang-format on`. I also considered fixing `.clang-format` to allow those one-liners but it caused a larger churn in other parts. So currently the codebase does not conform to `.clang-format` 100%, but we decided it's fine.
* Share validation code between constant expressions and function bodies. NFC ↵Sam Clegg2021-12-101-18/+13
| | | | | | | | | | | | (#1783) Previously we has special cases for initializer expressions (constant expressions). This change paves the way for adding support for extended constant expressions that support a wider range of instructions. This change removes twice as many lines as it adds which shows that this simplification is probably worthwhile even without the pending extensions.
* Show tag names in objdump disassembly (#1774)Sam Clegg2021-12-071-0/+20
| | | | | | | | | Tag names are not officially part of the extended-name-section proposal (because it only deals with naming things that are in the spec already). However, I think its reasonable (and useful) to include these names under a speculative subsection ID, on the basis that tags can only exist when exceptions are enabled and that engines should ignore unknown name types.
* Remove unused checks from #1770. NFC (#1772)Sam Clegg2021-12-041-13/+0
| | | | In #1770 I introduced these (duplicate) checks but it turns out neither were necessary in the final version of the patch.
* Perform init expression validation outside of the binary reader. NFC (#1770)Sam Clegg2021-12-021-73/+31
| | | | | | | | | | | | | | | | Rather than spocial casing them in the reader we now use the same instruction callbacks for instruction that appear in init expressions as instructions that appear in normal functions. The result of this change is the validation of init expressions is pushed further up the stack. For example, objdump will now quite happily dump modules that use arbitrary instructions in thier init expressions even though they are not valid. To me, this makes sense since objdump does not do instruction validation elsewhere. The change is pre-cursor to allowing a wider variety of instruction to be present in init expressions. See https://github.com/WebAssembly/extended-const
* OnRefFuncExpr takes a func index. NFC (#1768)Sam Clegg2021-12-021-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The name of this argument was recently changed from func_index to type_index, but I think that might have been incorrect. The immediate that read in the binary reader is (IIRC) a function index: ``` case Opcode::RefFunc: { Index func; CHECK_RESULT(ReadIndex(&func, "func index")); CALLBACK(OnRefFuncExpr, func); CALLBACK(OnOpcodeUint32, func); break; } ``` and not a type index. Indeed the interpreter seems to treat it as a function index too: ``` Result BinaryReaderInterp::OnRefFuncExpr(Index func_index) { CHECK_RESULT(validator_.OnRefFunc(loc, Var(func_index))); istream_.Emit(Opcode::RefFunc, func_index); return Result::Ok; } ```
* Add multi-memory feature support (#1751)Yuhan Deng2021-11-301-17/+24
|
* Support function references in parameters and results of functions and ↵Dmitry Bezhetskov2021-11-161-3/+3
| | | | blocks. (#1695)
* Remove separate OnEndFunc vs OnEndExpr. (#1756)Sam Clegg2021-11-051-24/+25
| | | | We already have EndFunctionBody, and this extra distinction doesn't seem like it is needed.
* Fix crash when function counts mismatch (#1739)Ng Zhi An2021-10-151-1/+7
| | | | | | | | This can happen if we don't stop on first error, and we get a malformed module where the func counts don't match. It's hard to write a test for this, since the kStopOnFirstError is fixed (not set by command line), but this case is quite easy for fuzzers to catch.
* Delay validation of elem init expressions until validation time (#1730)Sam Clegg2021-10-141-2/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Doing validation at parse time means we cannot run tests which included invalid instruction in the elem init expressions. For example. the updated test suite repo contains tests such as this: ``` (assert_invalid (module (table 1 funcref) (elem (i32.const 0) funcref (item (i32.add (i32.const 0) (i32.const 1)))) ) "constant expression required" ) ``` There we have an illegal instruction sequence in the init expresssion. However, in order to run this test we need to be able to process it with wast2json first which means it at least has to parse correctly. This change removes the `ElemExpr` and `ElemExprKind` types from the IR and instead just stores elem init expressions as `ExprList` like we do for global init expressions. This expression list can then be validated but crucially can also be invalid. This technique matches the existing `OnDataSegmentInitExpr_Other` and `OnGlobalInitExpr_Other` and indeed it seem that it was indented to work this way since the `OnElemSegmentElemExpr_Other` already existed (unused) in the codebase.
* [simd] Correctly shift alignment_log2 (#1699)Ng Zhi An2021-08-061-2/+2
| | | | | | | | | The alignment value in binary format is log2, so we need to shift it in binary-reader-ir before it is validated (since validation requires that it is shifted to be the number of bytes). We correctly did that for some Simd instructions (like load splat) but did not do it for load/store lane. Fixes #1674.
* Begin support for typed function references proposal: added the flag and ↵Dmitry Bezhetskov2021-07-251-0/+5
| | | | supported call_ref (#1691)
* Allow plain `try` with no `catch` or `delegate` (#1676)Asumu Takikawa2021-06-291-2/+2
| | | | | | Matches recent changes in the exception handling spec that allowed this case to reduce special cases in the syntax: https://github.com/WebAssembly/exception-handling/pull/157
* [EH] Remove `unwind` (#1682)Heejin Ahn2021-06-291-26/+2
| | | `unwind` was removed. See WebAssembly/exception-handling#156.
* [EH] Replace event with tag (#1678)Heejin Ahn2021-06-221-34/+38
| | | | | | | | | | | We recently decided to change 'event' to 'tag', and 'event section' to 'tag section', out of the rationale that the section contains a generalized tag that references a type, which may be used for something other than exceptions, and the name 'event' can be confusing in the web context. See - https://github.com/WebAssembly/exception-handling/issues/159#issuecomment-857910130 - https://github.com/WebAssembly/exception-handling/pull/161
* Add more support to extended names section. (#1659)Sam Clegg2021-04-071-27/+130
| | | I noticed we lacked support here while debugging #1651.
* [simd] Implement store lane (#1647)Ng Zhi An2021-03-221-0/+12
|
* [simd] Implement load lane (#1646)Ng Zhi An2021-03-221-0/+12
| | | | | | | | | This is a new kind of ir/ast node/instruction. It has 3 immediates: memarg align, memarg offset, and lane index. This required new visitor functions in all the places. Drive-by cleanup to share the simd lane parsing logic between shuffle, lane op and this new load lane instructions. This requires rebasing some tests because the error messages are slightly different now.
* [simd] Implement v128.load{32,64}_zero (#1644)Ng Zhi An2021-03-171-0/+10
| | | | This requires a new ir type, and the relevant implementation of virtual mthods in the various visitors.
* Update rethrow depth handling and catch_all opcode (#1608)Asumu Takikawa2021-02-181-2/+5
| | | | | | | | | | | | | Give `catch_all` its own opcode: Previously `catch_all` shared an opcode with `else`, but the spec now allocates it the 0x19 opcode. Adjust rethrow depth semantics: Previously this had interpreted the rethrow depth argument as counting only catch blocks, but the spec has clarified that it should count all blocks (in a similar fashion as `br` and related instructions).
* Update exception handling support to current proposal (#1596)Asumu Takikawa2021-02-101-19/+79
| | | | | | | | | | This PR updates the support of exception handling to the latest proposal (that is compatible with future 2-phase exception handling) described in https://github.com/WebAssembly/exception-handling/pull/137 and https://github.com/WebAssembly/exception-handling/pull/143. * Adds back tagged `catch $e`, `catch_all`, and `rethrow N` from a previous version of wabt, but with updates to match the current spec (e.g., `catch_all` shares an opcode with `else`, `rethrow`'s depth indexes only catch blocks, etc). * Adds `unwind` and `delegate` instructions. * Removes `exnref` and `br_on_exn`. * Updates relevant tests. There are some details that could still change (e.g., maybe how `delegate`'s depth is validated), but I'd be happy to submit further PRs if the spec details change.
* Select instr. with multiple results is invalid (#1582)Ben Smith2020-12-031-3/+5
| | | | | | The reference-types proposal adds a select instruction with a type vector, but any number greater than 1 is invalid. Fixes #1577.
* Add --relocatable support for tables (#1549) (#1549)Andy Wingo2020-10-011-0/+19
| | | | | | | | | | | | | We add relocations for table numbers on each place where we reify a table number (call_indirect, table.get, table.set...), but only if reference types are enabled. Also, fix symbol table generation with unnamed definitions, to allow for relocating references to anonymous functions or tables. As tests, add variants of the relocations and symbol-tables dump tests, with and without all features enabled. Enabling reference types causes relocs to be emitted. We also add --details to the relocations dump tests, so that we can see the target symbols for the relocations.
* Added initial "memory64" proposal support (#1500)Wouter van Oortmerssen2020-08-071-18/+18
|
* Fix linking section symbol name bugs (#1508)Ben Smith2020-07-311-0/+16
| | | Found by oss-fuzz.
* Remove ref.is_null type parameter (#1474)Ben Smith2020-07-151-3/+3
| | | | | | | | | See https://github.com/WebAssembly/reference-types/issues/99. This change also updates the testsuite, so the spec tests pass too. In addition, the behavior of `br_table` is no longer different from MVP, and has a text to confirm this. That is now fixed in `type-checker.cc` too.