summaryrefslogtreecommitdiff
path: root/src/binary-reader-logging.h
Commit message (Collapse)AuthorAgeFilesLines
* Add initial support for code metadata (#1840)Yuri Iozzelli2022-02-251-0/+7
| | | | | | | | | | | | | | | | | | | | | 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-30/+32
| | | | | 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-0/+2
| | | | Remove test/binary/bad-function-missing-end.txt which is now covered upstream: https://github.com/WebAssembly/spec/pull/1405
* Perform init expression validation outside of the binary reader. NFC (#1770)Sam Clegg2021-12-021-9/+0
| | | | | | | | | | | | | | | | 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
* Add multi-memory feature support (#1751)Yuhan Deng2021-11-301-5/+7
|
* Remove separate OnEndFunc vs OnEndExpr. (#1756)Sam Clegg2021-11-051-1/+0
| | | | We already have EndFunctionBody, and this extra distinction doesn't seem like it is needed.
* Add support for target_features section (#1744)Sam Clegg2021-10-191-0/+5
|
* Support for import/export info in dylink section (#1741)Sam Clegg2021-10-191-0/+6
|
* Remove ununsed onSymbol callback. NFC (#1708)Sam Clegg2021-09-101-1/+0
| | | | We have the more specific OnFunctionSymbol, OnGlobalSymbol family of callbacks that is used by objdump.
* Begin support for typed function references proposal: added the flag and ↵Dmitry Bezhetskov2021-07-251-0/+1
| | | | supported call_ref (#1691)
* [EH] Remove `unwind` (#1682)Heejin Ahn2021-06-291-1/+0
| | | `unwind` was removed. See WebAssembly/exception-handling#156.
* [EH] Replace event with tag (#1678)Heejin Ahn2021-06-221-16/+16
| | | | | | | | | | | 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
* [simd] Implement store lane (#1647)Ng Zhi An2021-03-221-0/+4
|
* [simd] Implement load lane (#1646)Ng Zhi An2021-03-221-0/+7
| | | | | | | | | 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/+3
| | | | 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-0/+1
| | | | | | | | | | | | | 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-3/+4
| | | | | | | | | | 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-1/+1
| | | | | | The reference-types proposal adds a select instruction with a type vector, but any number greater than 1 is invalid. Fixes #1577.
* Add initial support for extended names sections (#1554)Sam Clegg2020-10-021-0/+7
| | | | | | | | See: https://github.com/WebAssembly/extended-name-section Although this is only a phase 1 proposal its seems pretty straight forward, and is already being implemented in binaryen.
* Add --relocatable support for tables (#1549) (#1549)Andy Wingo2020-10-011-0/+4
| | | | | | | | | | | | | 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.
* Fix integer overflow in objdump name tracking (#1524)Sam Clegg2020-08-191-1/+3
| | | | Fixes: #1520
* Added initial "memory64" proposal support (#1500)Wouter van Oortmerssen2020-08-071-10/+10
|
* Remove ref.is_null type parameter (#1474)Ben Smith2020-07-151-1/+1
| | | | | | | | | 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.
* Reference types changes to remove subtyping (#1407)Ben Smith2020-05-281-4/+5
| | | | | | | | Main changes: * Rename `anyref` -> `externref` * Remove `nullref` * Rename `hostref` -> `externref` * `ref.null` and `ref.is_null` now have "ref kind" parameter * Add ref kind keywords: `func`, `extern`, `exn`
* Add support for atomic.fence from the threads proposal (#1231)Andy Wingo2020-04-201-0/+1
| | | | | See https://github.com/WebAssembly/threads/pull/141 for the binary encoding. This patch does add a field to AtomicFenceExpr for the consistency model, though without a type for the time being.
* Parse ArrayTypes (#1364)Ben Smith2020-03-231-0/+2
| | | | | | | | | | The following formats are supported: * (type (array i32)) * (type (array (field i32))) * (type (array (field (mut i32)))) This PR adds support for reading/writing binary and text, but no interpreter support yet.
* Parse struct fields (#1355)Ben Smith2020-03-161-1/+1
| | | | | | | | | | | This allows the following field formats: * `(struct (field $name i32))` * `(struct (field $name (mut i32)))` * `(struct (field i32))` * `(struct (field (mut i32)))` * `(struct (mut i32))` * `(struct i32)`
* Initial pass parsing/reading struct (#1352)Ben Smith2020-03-091-5/+6
| | | | | | | | | | | | | | | | | | This parses just the format `(struct)` as a new type. I added a test for this using `wat2wasm`, but that requires a rudimentary binary format. The test runner automatically attempts to rountrip all wat2wasm tests, so this required implementing the wat writing and binary reading too. Here's a summary of the changes: * binary-reader:h: Rename `BinaryReader::OnType` callbacks to `OnFuncType` * binary-reader.h: Add `BinaryReader::OnStructType` * binary-reader.cc: Use a switch after reading the type form to determine whether we're reading a function or struct. * tokens.def: Add new `TokenType::Struct` * lexer-keywords.txt: Add new `struct` keyword * type.h: Add `Type::Struct` type form * wast-parser.cc: Parse `(struct)` in text format * wat-writer.cc: Write Func or Struct type forms
* Update testsuite (w/ reference-types changes) (#1351)Ben Smith2020-02-281-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The new table-sub test, checks whether the subtyping is handled properly w/ table.init and table.copy instructions. The BeginElemSegment callback can't pass the element type anymore, since it's not known yet. The callback also can't be deferred, since the BeginElemSegmentInitExpr callback has to happen after the BeginElemSegment callback, but the reference type is not always known until after the initializer expression is read. To work around this, I added a new OnElemSegmentElemType callback. Other element segment changes: * The element type must be tracked in the SharedValidator * A subtle fix: when writing out the segment flags, we need to take into account whether the element type of the segment is not funcref, even if there are no element expressions. In that case, we have to use flag bit 0x4 (SegUseElemExprs). In addition, the TableCopy and TableInit instructions weren't handling table indexes fully. * TableCopy variables are read in the parser (both optional) * TableCopy names are now resolved + applied * TableCopy indexes are now validated * TableInit table variables are read in the parser; this is subtle, since the text format has order $table $segment, but the $table is optional.
* reference-types: add support for typed select (#1253)Sam Clegg2019-11-261-1/+1
|
* reference-types: add table.fill instruction (#1252)Sam Clegg2019-11-251-0/+1
|
* reference-types: Add reference-types spec tests (#1225)Sam Clegg2019-11-251-0/+1
| | | | | | | This change adds most of the tests from the reference-types proposal. There are two tests that require new instructions (`table.fill` and `select_t`) which will be followup changes. See: #1223
* Switch to treating segment flags as a bitfield. NFC (#1232)Sam Clegg2019-11-181-2/+4
| | | | | | | | | | | This is in preparation for updating to latest version reference-types proposal where there is an additional flag and they can be combined. See: https://github.com/WebAssembly/bulk-memory-operations/issues/98 Also, add ERROR_IF to binary-reader.cc as logical corollary to the existing ERROR_UNLESS.
* reference-types: Add multi-table support to the interpreter (#1218)Sam Clegg2019-11-141-2/+2
| | | | | | | | | | This involved plumbing the table argument for `table.init` and `table.copy` all the way through rather than assuming they were always zero. Update the rather complex logic for assigning names to elem segments to handle active elem segments which both name themselves and the table they apply too.
* Initial implementation of reftype proposal in the interpreter. (#1206)Sam Clegg2019-11-071-0/+1
| | | | - Implement ref.func everywhere. - Implement table.get and table.set in the interpreter.
* Add ExternalKind to OnImport callback (#1182)Sam Clegg2019-10-101-0/+1
|
* Add support for ref.null in global initializers (#1131)Andy Wingo2019-07-251-0/+1
| | | | | | | | | As per the reference-types spec, ref.null is a constant expression. I did try to add support for ref.func at the same time, but I didn't really understand the strategy of wabt and reference types; there seems to be strong intertwingliness between func.ref and the element section, whereas it does seem possible for a func.ref to be global. Oh well, I didn't need it :)
* Add support for v8x16.swizzle and the load_splats. (#1116)nlewycky2019-07-191-0/+3
| | | | | | | | | | | | | | | | | | | * Add support for v8x16.shuffle1 and v8x16.shuffle2_imm. v8x16.shuffle2_imm is a rename of the previous v8x16.shuffle, but I add a copy of the code as if it were a new instruction in case the spec proposal makes further changes. The tests for old v8x16.shuffle remain in place and while there are new tests for the new v8x16.shuffle1, there are not for v8x16.shuffle2_imm. The behaviour and implementation are the same as for v8x16.shuffle, so we should simply search and replace the existing tests at some point, leaving one of them untested, probably the deprecated v8x16.shuffle. I did test v8x16.shuffle1 against the SIMD spec test from WAVM and it passes. The WAVM spec tests for v8x16.shuffle2_imm parse but it has no invocations of the instruction. * Rename v8x16.shuffle1 and x8v16.shuffle2_imm to v8x16.swizzle and v8x16.shuffle_imm. * Update SIMD operands. * Swizzle is just a binary operator. * Shuffle is named "v8x16.shuffle". * Add 4 new opcodes for load_splat. * Remove legacy 0xfd 0x03 opcode for shuffle. * Test all four load splats.
* Match custom section names in wasm-objdump (#1097)Ben Smith2019-06-271-1/+3
| | | | | | | | | This way you can see the contents of just one custom section by using: ``` wasm-objdump -j section_name -x ``` Where `section_name` is the name of the custom section.
* Add support for comdat groups in the linking section (#1087)Sam Clegg2019-06-041-0/+3
|
* Implement bulk memory in the interpreter (#1074)Ben Smith2019-05-071-1/+4
| | | | | | | | | * Implement bulk memory in interpreter * Read/Write elem_type in element segments * Binary format * Text format (`(elem passive funcref...)`) * Add DataSegment runtime objects * Only initialize active data segments when instantiating
* Proper encoding of passive element segments (#1066)Ben Smith2019-04-181-2/+4
| | | | | * Store element segments as a vector of `ElemExpr`, instead of func index * Read/write binary format for each element expression * Read/write text format for each element expression
* Improve support for event symbols and except_ref types (#1025)Wouter van Oortmerssen2019-02-241-0/+4
| | | | | | * Added except_ref to be legal in a block type signature * Added more support for event symbols.
* Add support for the reference types proposal (#938)Alex Crichton2019-02-141-2/+8
| | | | | | | | | | | | | | | | | | | | * Add support for the reference types proposal This commit adds support for the reference types proposal to wabt. Namely it adds new opcodes like `table.{get,set,grow}` as well as adds a new `anyref` type. These are plumbed throughout for various operations in relatively simple fashions, no support was added for a subtyping relationship between `anyref` and `anyfunc` just yet. This also raises the restriction that multiple tables are disallowed, allowing multiple tables to exist when `--enable-reference-types` is passed. * Allow nonzero table indices in `call_indirect` Plumb support throughout for the `call_indirect` instruction (and `return_call_indirect`) to work with multi-table modules according to the reference types proposal.
* Add br_on_exn instruction (#1016)Ben Smith2019-02-131-0/+2
| | | | | | It takes two u32 immediates: the branch depth and an exception index. The stack signature is `[expect_ref] -> [except_ref]`, so the `except_ref` can be tested easily against multiple exception types.
* Parse updated event text and binary format (#1014)Ben Smith2019-02-121-2/+2
| | | | | | | | | | | | An event has a type-section index, like a function definition. The current proposal doesn't specify the text format, so I assumed that it would match the format of the other sections that reference function types. This means that the following declaration styles are allowed: ``` (type $t (func (param i32))) (event $e1 (type $t)) (event $e2 (param f32)) ```
* Rename exception -> event (#1013)Ben Smith2019-02-111-10/+10
|
* Remove the `if_except` instruction (#1009)Ben Smith2019-02-101-1/+0
| | | | It is no longer part of the exception proposal.
* Rename {memory,table}.drop to {data,elem}.drop (#1000)Alex Crichton2019-01-301-2/+2
| | | Carrying over renames from WebAssembly/bulk-memory-operations#46
* Implement parsing and writing of DataCount section (#998)Ben Smith2019-01-231-0/+4
|