Commit Graph

22 Commits

Author SHA1 Message Date
Sasha Gryaznov a4dde28607 Add new gas metering method: mutable global + local gas function (#34)
* fix misprints in doc comments

* added global gas tracker variable and local gas fn

* all exported functions of the module to accept a new param and to set the gas_left global to its value at their very start

* make module support both gas metering methods

* tests fixed for the old metering method

* better naming

* MutableGlobal metering method implemented, tests for the old method pass

* gas_metering::tests updated and pass

* all tests udpdated and pass

* emacs backup files to .gitignore

* docs updated

* clippy fix

* iff = if and only if

* more clippy

* docs misprints fixes

* refactored to have Backend trait and two implementations in separate sub-modules

* docs updated

* fixed old benches (updating them is coming next)

* added bench for an instrumented wasm-coremark

* updated benches: added them for both gas_metering instrumentations

* benches contest first ver

* added debug prints to the bench

* refactored to better fit frontend-backend pattern

* docs update

* updated benches

* design updated on feedback

* re-structured sub-modules

re-structured sub-modules & updated docs

* docs improved

* addressed latest feedback comments

* re-writed the local gas function

* coremark benches show ~20% performance improvement

* fix ci: test + clippy

* save before re-factoring prepare_in_wasm()

* bare_call_16 shows 16% worse perf

* + fibonacci recursive bench

* refactored benchmarks

* + factorial recursive bench

* benches on wasmi fixtures show no perf improvement, coremark runs ~20% faster being instrumented with mutable_global gas metering

* charge gas for local gas func isntructions execution

* replaced benchmark which requires multi_value feature

* save: optimized gas func a bit (benches work, fixture tests fail)

* 1033% overhead on many_blocks.wasm when mut_global gas_metering together with stack_height

* size overhead test for both gas metering methods + stack limiter

* added more benches

* improved print_size_overhead test

* test for comparing size overheads of two gas_metering injectors

* before optimization: benches + size overhead

* optimization try-1: inline part of gas func instructions: +benches +size overheads

* optimization try-2: inline hot path of gas fn:  +benches +size overheads

* opt try-3: count for gas fn cost on the caller side: +benches +size overhead

* revert to initial version but with static gas fn cost on the caller side: +benches +sizes

* tests fixed

* use newest wasmi 0.20: +benches +docs updated

* use if-else block instead of Return: +benches

* fix tests

* clippy fix

* addressed review comments

* Update changelog

Co-authored-by: Alexander Theißen <alex.theissen@me.com>
2022-11-20 15:00:10 +01:00
Filipe Azevedo 4a51f16874 handle debug info (#16) 2022-06-06 15:42:52 +01:00
Alexander Theißen 4548a86329 Add test to measure size overhead (#8)
* Don't use parity-wasm directly

* Add test that output size over head of metering
2022-01-31 14:50:32 +01:00
Alexander Theißen 7c843842a7 Run CI on windows, too (#7)
* Run CI on windows, too

* Build path without `concat!` macro

* Fix ci on windows
2022-01-31 11:03:18 +01:00
Alexander Theißen 374afe5700 Replace wabt with rust tools (#5) 2022-01-30 13:05:07 +01:00
Alexander Theißen 57da96fb50 Consider activation frame for stack height metering (#2)
* Charge a base cost for calling a function

* Added regression test for empty functions

* Satisfy clippy
2022-01-18 18:04:17 +01:00
Alexander Theißen e882111f92 Remove everything not needed by substrate
Also rename to wasm-instrument
2022-01-11 17:50:24 +02:00
Alexander Theißen a0b548b37d Add rustfmt.toml from substrate repo (#161)
* Add rustfmt.toml from substrate repo

* Apply rustfmt to code base

* Fix formatting

* Move rustfmt job to the top
2021-07-27 14:46:28 +02:00
Sergei Shulepov 0cead7ba6d Merge pull request #151 from paritytech/ser-bless
Add BLESS env option
2021-06-10 11:13:04 +02:00
Sergei Shulepov 9e98400de0 Update tests/diff.rs
Co-authored-by: Alexander Theißen <alex.theissen@me.com>
2021-06-10 10:49:16 +02:00
Sergey Shulepov 19760b5835 Fix counting of the local variables
The code assumed that the number of `Local` and number of locals is the
same thing. In reality though it is not. `Local` actually represents a
group of locals with the same type. The group can declare more than one
variable and the number of them is returned by `Local::count`.

In this PR we acknowledge this fact. Along the way we add a checked
arithmetic for locals_count and max_stack_height summation.
2021-06-09 19:22:40 +02:00
Sergey Shulepov 717aa8f0cb Add BLESS env option
Right now if there is a diff between the actual and expected results,
the expected file will be overwritten. This may be annoying. To make it
controlled we introduce BLESS option.

This means that the expected files won't be regenerated unless this
environment variable is set.

Therefore to regenerate the tests use:

    BLESS=1 cargo test
2021-06-09 19:17:54 +02:00
Alexander Theißen 1b0ed1b383 Transition to Rust 2018 style imports 2021-05-26 14:59:04 +02:00
Alexander Theißen 409ced002a Allow specifying the module of the imported 'gas' function (#140)
* No need for mem::replace when doing a simple assignment

* Allow specifying the module of the imported 'gas' function

This allows users to place the imported function inside a custom
module instead of the generic 'env' module.
2020-08-04 13:53:53 +03:00
Jim Posen 863744b1fc Add gas test confirming that br instructions do not end blocks. 2019-07-01 17:02:21 +02:00
NikVolf 0d40703c6e fix identation 2019-04-09 19:02:07 +03:00
Sergey Pepyakin 1b7a5d26ea A couple of small tests. 2019-04-03 14:24:01 +02:00
NikVolf 06277915da some graph structure definition 2019-01-21 17:04:31 +03:00
Sergey Pepyakin 8db40174ae Add gas tests. 2018-12-24 20:43:23 +01:00
Sergey Pepyakin 3db0d60e70 Teach stack limiter to handle start fn 2018-12-24 19:20:33 +01:00
NikVolf b0f43bb575 rename crate 2018-03-13 16:02:34 +03:00
Sergey Pepyakin 9527b969a4 Impl stack height limiter (#64)
* Initial implementation

* Add wasm-stack-height binary

* Fixes and tracing.

* Doc fixes.

* Fix type resolving for thunks.

* Fix thunk numbering.

* Don't generate thunks for fns with stack_cost = 0

* Diff tests.

* Add table tests.

* Add global test.

* Make tests deterministic.

* Refactoring.

* Clean and refactor.

* Rename Context → Stack in stach_height.

* Don't generate call wrappers if stack_cost = 0

* Errors instead of panics.

* Add with_stack_limit function.

* Fix thunk generation.

* Pass the stack height limit as separate value.

* Use .unwrap_or_default() in diff.rs.

* Remove redundant &.

* Remove simple_test.

* Remove variants of the Error.

* `resolve_func_type` returns an Error.

* Don't unwrap for .last()

* Remove stack_limit from rules::Set

* Rename max_height::compute.
2018-02-27 16:52:37 +03:00