Nick Johnson
08e4a1a4dc
AK+Everywhere: Replace __builtin bit functions
...
In order to reduce our reliance on __builtin_{ffs, clz, ctz, popcount},
this commit removes all calls to these functions and replaces them with
the equivalent functions in AK/BuiltinWrappers.h.
2021-12-21 22:13:51 +01:00
Ali Mohammad Pur
76ed7f2b20
LibWasm: Fix silly typo in f32 reinterpret validation
2021-12-21 05:03:44 +03:30
Ali Mohammad Pur
fecbf0e03a
LibWasm: Make blocks that take arguments actually work
...
Previously we were ignoring the actual parameters and setting the arity
to an incorrect value, which could cause crashes (or unexpected traps).
2021-12-21 05:03:44 +03:30
Ali Mohammad Pur
b5ca290605
LibWasm: Implement memory.init and passive mode data
2021-12-21 05:03:44 +03:30
Andreas Kling
216e21a1fa
AK: Convert AK::Format formatting helpers to returning ErrorOr<void>
...
This isn't a complete conversion to ErrorOr<void>, but a good chunk.
The end goal here is to propagate buffer allocation failures to the
caller, and allow the use of TRY() with formatting functions.
2021-11-17 00:21:13 +01:00
Andreas Kling
03ddda7979
LibWasm: Fix broken build after merging un-rebased Validator changes
2021-11-11 09:27:00 +01:00
Ali Mohammad Pur
3680aa253d
LibWasm: Remove traps caught by validation
2021-11-11 09:20:04 +01:00
Ali Mohammad Pur
7d1142e2c8
LibWasm: Implement module validation
2021-11-11 09:20:04 +01:00
Andreas Kling
a15ed8743d
AK: Make ByteBuffer::try_* functions return ErrorOr<void>
...
Same as Vector, ByteBuffer now also signals allocation failure by
returning an ENOMEM Error instead of a bool, allowing us to use the
TRY() and MUST() patterns.
2021-11-10 21:58:58 +01:00
Andreas Kling
88b6428c25
AK: Make Vector::try_* functions return ErrorOr<void>
...
Instead of signalling allocation failure with a bool return value
(false), we now use ErrorOr<void> and return ENOMEM as appropriate.
This allows us to use TRY() and MUST() with Vector. :^)
2021-11-10 21:58:58 +01:00
Ben Wiederhake
32e98d0924
Libraries: Use AK::Variant default initialization where appropriate
2021-09-21 04:22:52 +04:30
Ben Wiederhake
6c8eea6f5e
LibWasm: Avoid making StringView of temporary ByteBuffer
2021-09-11 13:22:51 +03:00
Andreas Kling
6ad427993a
Everywhere: Behaviour => Behavior
2021-09-07 13:53:14 +02:00
Ali Mohammad Pur
3a9f00c59b
Everywhere: Use OOM-safe ByteBuffer APIs where possible
...
If we can easily communicate failure, let's avoid asserting and report
failure instead.
2021-09-06 01:53:26 +02:00
Ali Mohammad Pur
09dd397160
LibWeb+LibWasm: Implement the WebAssembly.Table object
2021-09-05 15:42:50 +04:30
Ali Mohammad Pur
f492e98f19
LibWasm: Make the Truncate operator trap on undefined results
2021-08-30 22:47:02 +02:00
Ali Mohammad Pur
2c7e2e351a
LibWasm: Implement fx.nearest using nearbyint() instead of round()
...
This instruction wants RoundingMode::ToEven, so let's use the correct
function.
2021-08-30 22:47:02 +02:00
Ali Mohammad Pur
04e3965b09
LibWasm: Use Operators::BitShiftRight for i64.shru
...
Using a left-shift operator for a right shift operation is not exactly
the most correct action :P
2021-08-26 00:51:30 +02:00
Ali Mohammad Pur
8b6397446e
LibWasm: Move some Values and Vector<Value>s instead of copying them
2021-08-12 21:03:53 +02:00
Ali Mohammad Pur
fa2ae02564
LibWasm: Avoid calculating stack bounds on each wasm call
...
We only need to know the initial bounds, which we calculate by default
when the interpreter is constructed.
This cuts down on syscalls and makes wasm calls a lot cheaper.
2021-08-12 21:03:53 +02:00
Ali Mohammad Pur
2b35e9f9be
LibWasm: Generate Value::type() on the fly instead of storing it
...
The variant member already contains enough information to give us the
type when needed, so remove the type member and synthesize it when
needed, this allows lots of optimisation opportunaties when copying and
moving Values around.
2021-08-12 21:03:53 +02:00
Ali Mohammad Pur
4060f18d7e
LibWasm: Replace memory write macros with templated functions
2021-08-12 21:03:53 +02:00
Ali Mohammad Pur
b6381f785d
LibWasm: Make memory operation address calculation match the spec
...
...or rather, match what the spec _means_ to say, not what it actually
says.
2021-08-12 21:03:53 +02:00
Ali Mohammad Pur
ad3de4648a
LibWasm: Replace memory read macros with templated functions
2021-08-12 21:03:53 +02:00
Ali Mohammad Pur
563b402f04
LibWasm: Replace the numeric operation macros with templated functions
...
This should make debugging and profiling much better, at little to no
runtime cost.
Also moves off the operator definitions to a separate header, so it
should also improve the editing experience quite a bit.
2021-08-12 21:03:53 +02:00
Ali Mohammad Pur
52a2518a69
LibWasm: Remove a useless use of ScopeGuard
...
There are no multiple exit paths in that function, so we can just put
the ending logic right at the end of the function instead.
2021-07-17 01:13:39 +04:30
Ali Mohammad Pur
65cd5526cb
LibWasm+Everywhere: Make the instruction count limit configurable
...
...and enable it for LibWeb and test-wasm.
Note that `wasm` will not be limited by this.
2021-07-17 01:13:39 +04:30
Ali Mohammad Pur
70b94f58b2
LibWasm: Inline some very hot functions
...
These are mostly pretty small functions too, and they were about ~10%
of runtime.
2021-07-17 01:13:39 +04:30
Ali Mohammad Pur
23b48f8fe1
Revert "LibWasm: Some more performance stuff ( #8812 )"
...
This reverts commit 35394dbfaa
.
I pushed the wrong button again, hopefully this will be the last of
such incidents.
2021-07-17 01:11:28 +04:30
Ali Mohammad Pur
35394dbfaa
LibWasm: Some more performance stuff ( #8812 )
...
* wasm: Don't try to print the function results if it traps
* LibWasm: Inline some very hot functions
These are mostly pretty small functions too, and they were about ~10%
of runtime.
* LibWasm+Everywhere: Make the instruction count limit configurable
...and enable it for LibWeb and test-wasm.
Note that `wasm` will not be limited by this.
* LibWasm: Remove a useless use of ScopeGuard
There are no multiple exit paths in that function, so we can just put
the ending logic right at the end of the function instead.
2021-07-17 01:04:37 +04:30
Andrew Kaster
2af591267c
LibWasm: Adjust signed integer operations to avoid UB
...
Perform signed integer shifts, addition, subtraction, and rotations
using their corresponding unsigned type. Additionally, mod the right
hand side of shifts and rotations by the bit width of the integer per
the spec. This seems strange, but the spec is clear on the desired
wrapping behavior of arithmetic operations.
2021-07-12 18:42:45 +04:30
Ali Mohammad Pur
d74eca78aa
LibWasm: Skip initializing active empty data sections
2021-07-12 18:42:45 +04:30
Ali Mohammad Pur
65355c388b
LibWasm: Use AK::StackInfo to track stack size
...
This way, we can make sure that it doesn't overflow when ASAN is
enabled.
2021-07-12 18:42:45 +04:30
Ali Mohammad Pur
06ffc0c4db
LibWasm: Don't create useless temporary strings for trap reasons
...
These strings are only used when execution traps, so there's no reason
to create actual strings until that happens; instead switch to using
StringViews.
2021-07-06 17:55:00 +04:30
Ali Mohammad Pur
5636f8143d
LibWasm: Allow overflow in normal 64-bit arithmetic instructions
2021-07-06 17:55:00 +04:30
Ali Mohammad Pur
c4d4c657d0
LibWasm: Limit module memory to 65536 pages
...
The spec mentions this, and anything past that can't be correctly
addressed by the 32-bit indices anyhow.
2021-07-06 17:55:00 +04:30
Ali Mohammad Pur
03fe50d5e7
LibWasm: Fix data section initialization bounds checking
2021-07-06 17:55:00 +04:30
Ali Mohammad Pur
d2212a1f51
LibWasm: Jump to the default label in br_table with negative values
...
Also adds a forgotten Wasm::Printer implementation for printing table
branch arguments.
2021-07-06 17:55:00 +04:30
Ali Mohammad Pur
0b08392e54
LibWasm: Use the number of bytes when comparing memory limits
...
...instead of comparing page count with byte count.
2021-07-06 17:55:00 +04:30
Ali Mohammad Pur
4bdb0ad132
LibWasm: Guard stack accesses with checks
...
If the stack is empty, let's just trap.
2021-07-06 17:55:00 +04:30
Idan Horowitz
301c1a3a58
Everywhere: Fix incorrect usages of AK::Checked
...
Specifically, explicitly specify the checked type, use the resulting
value instead of doing the same calculation twice, and break down
calculations to discrete operations to ensure no intermediary overflows
are missed.
2021-07-04 20:08:28 +01:00
Ali Mohammad Pur
b538e15548
LibWasm: Give traps a reason and display it when needed
...
This makes debugging wasm code a bit easier, as we now know what fails
instead of just "too bad, something went wrong".
2021-07-02 04:53:01 +04:30
Andreas Kling
beb43f673e
AK: Undo bogus Variant::downcast() rename
...
I accidentally renamed these to verify_cast() when doing the global
AK::downcast() rename.
2021-06-26 21:27:58 +02:00
Andreas Kling
ee3a73ddbb
AK: Rename downcast<T> => verify_cast<T>
...
This makes it much clearer what this cast actually does: it will
VERIFY that the thing we're casting is a T (using is<T>()).
2021-06-24 19:57:01 +02:00
Ali Mohammad Pur
c4b82ace74
LibWasm: Limit the call stack depth and the number of executed insts
...
These limits are described in the spec, and we're supposed to stop
execution at some point.
The limits are arbitrarily chosen.
2021-06-22 00:26:25 +04:30
Ali Mohammad Pur
9971d13844
LibWasm: Trap if a non-Value is used as a Value
...
Otherwise we'd just crash, which is not a good thing
2021-06-22 00:26:25 +04:30
Linus Groh
34b338702a
LibWasm: Remove empty AbstractMachine/Interpreter.cpp
...
This was moved to BytecodeInterpreter.cpp, so this is unused now.
2021-06-20 01:49:56 +01:00
Ali Mohammad Pur
aa2916c21b
LibWasm: ALWAYS_INLINE some very hot functions
...
These function couldn't be inlined before because the compiler would've
started flagging invalid paths in Variant as maybe-uninitialized.
2021-06-09 23:05:32 +04:30
Ali Mohammad Pur
45710d0724
LibWasm: Implement saturating float truncation instructions
...
With these, the only remaining unimplemented instructions are the
following:
- memory.init
- data.drop
- memory.copy
- memory.fill
- table.init
- elem.drop
- table.copy
- table.grow
- table.size
- table.fill
2021-06-09 23:05:32 +04:30
Ali Mohammad Pur
3a44011cd4
LibWasm: Implement sign extension instructions
2021-06-09 23:05:32 +04:30