Twiggy๐ŸŒฑ is a code size profiler

Overview

Twiggy ๐ŸŒฑ

A code size profiler for Wasm

Guide | Contributing | Chat

Built with ๐Ÿฆ€ ๐Ÿ•ธ by The Rust and WebAssembly Working Group

About

Twiggy is a code size profiler for Wasm. It analyzes a binary's call graph to answer questions like:

  • Why was this function included in the binary in the first place? Who calls it?

  • What is the retained size of this function? I.e. how much space would be saved if I removed it and all the functions that become dead code after its removal.

Use Twiggy to make your binaries slim!

Install Twiggy

Ensure that you have the Rust toolchain installed, then run:

cargo install twiggy

Learn More!

Read the Twiggy guide!

Comments
  • Skip unknown entries in the custom name section

    Skip unknown entries in the custom name section

    twiggy uses an ancient version of wasmparser which errors out when encountering an "unknown" entry in the custom name section. The error looks like this:

    error: WASM error: Invalid name type (at offset 276799)
      caused by: Invalid name type (at offset 276799)
    

    This PR adds code to just skip any name entry which fails to parse. This is a short term solution to resolve one specific issue which is a blocker for me. I also started to port twiggy to the newest wasmparser version in order to increase compatibility with new wasm features. This is a lot of work, though. The API changed quite a bit.

    fixes #574

    opened by athei 17
  • Demangle Function Names

    Demangle Function Names

    Fixes #174.

    This is a much larger PR than I expected it to be, and apologies on that regard. :grimacing:

    I tried a simpler fix here: https://github.com/rustwasm/twiggy/compare/master...data-pup:simple-function-name-demangle-fix

    Notably, we need to include the type of item in the output, so that we can differentiate between code and function items. Unfortunately, this meant that the user would need to specify items by their entire name and type/location when using subcommands that accept arguments.

    This change, while more involved, allows us to query for items by name, while still showing the demangled names of functions and code blocks! By moving the name of an item from the ir::Item struct into the ir::ItemKind field, we can handle these properly.

    The other notable part is that this involves storing the "annotation" (i.e. func[1]) in that struct, and adding an annotated_name method which is used when displaying items. This is required because the diff command breaks if we use the annotated name, because we can't tell that two items are related if an item moved in the index space.

    Because this is a hefty PR, I kept changes in separate commits, to help make reviewing this easier. I'll try and find some time to annotate the important parts over the weekend, or early next week :slightly_smiling_face:

    opened by data-pup 8
  • Add --all(-generics|-monos) flags to monos command

    Add --all(-generics|-monos) flags to monos command

    After #118 the second PR for #109

    This time for the monos command, and with even three new flags :D to cover the 2-dimensional output of generics and their individual monomorphizations:

    -a, --all
        --all-generics
        --all-monos
    

    Only some more tests are needed to get it out of WIP... I'll hurry up ;)

    opened by userzimmermann 8
  • Print all paths if no argument is given to `twiggy paths`

    Print all paths if no argument is given to `twiggy paths`

    This is some initial work to try and solve #57. If no argument is given, then all paths should be printed. I was thinking about this, and thought that it might be nice to have this descend the paths rather than printing a whole list of ascending call paths.

    I'm not totally sure if that is a good idea or not, and thought I would open up a PR for some thoughts. I have a little bit of refinement work to do on this, right now type[n] items are printed out, which I don't think should be included in the output if I understand this correctly.

    So, questions I have at the moment:

    • Does descending the call paths make sense if no argument is given?
    • Should type items be included in the output? If not, is there an easy way to identify these?
    • How should these be sorted? Name, depth, size? That might be worth adding a new issue for.
    • If the ascending/descending choice is exposed as an option flag, what should that be called?
    opened by data-pup 8
  • How to use Twiggy with wasm-pack?

    How to use Twiggy with wasm-pack?

    I am using wasm-pack to compile my project to a wasm file, and attempted to use Twiggy to profile the code size, following the online documentation. However, the output of Twiggy was completely useless.

    Shallow Bytes โ”‚ Shallow % โ”‚ Item
    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
            303544 โ”Š    35.90% โ”Š data[664]
             39116 โ”Š     4.63% โ”Š code[0]
             21903 โ”Š     2.59% โ”Š data[663]
             21351 โ”Š     2.53% โ”Š code[1]
             14714 โ”Š     1.74% โ”Š code[2]
              9370 โ”Š     1.11% โ”Š code[3]
              7535 โ”Š     0.89% โ”Š code[4]
              7463 โ”Š     0.88% โ”Š code[5]
              6627 โ”Š     0.78% โ”Š code[6]
              5863 โ”Š     0.69% โ”Š code[7]
              5408 โ”Š     0.64% โ”Š code[8]
              4212 โ”Š     0.50% โ”Š code[9]
              3697 โ”Š     0.44% โ”Š code[10]
    

    I'm guessing that Twiggy doesn't work on wasm files where the debug information was stripped, but I can't find any way to make wasm-pack output that information, and it seems counter productive to reducing binary size in any case. Is there any way to use Twiggy with wasm-pack? It seems like a strange oversight that the two tools recommended for working with wasm are completely incompatible.

    opened by Storyyeller 7
  • Reworked `paths` logic, added tests, and fixed a CSV bug.

    Reworked `paths` logic, added tests, and fixed a CSV bug.

    This commit does a few different things, and largely finishes up the work started in #88, and #140.

    First, analyze/analyses/paths.rs has been divided into separate files for the paths function itself, the emitting logic, and for the struct that represents an entry in the Paths struct. Further, the logic for traversing the ir::Items tree that was previously mixed into the emitting logic has been divided out into a separate function, create_entry.

    To be sure that this is all working correctly, I added some various tests as well, especially focusing on the max_paths option. The expected output files were generated using the current master branch, to be sure that everything was behaving the same way before and after this change.

    While doing this, I did notice an issue with the emit_csv function, being that the meta root is printed in the path field of a CSV record. Additionally, some items only display themselves in that field. In each of these cases, the field will instead be empty. Given that the meta root (iirc) is an internal abstraction, I think it is best left out of this command's output, especially if it is not shown in other formats.

    Currently, summaries are not shown, but the code to do so is included in comments under a 'FIXME' note. Once this lands, following up by enabling these sections and updating the test cases should be very straightforward.

    Minor sidenote: The output generated by emit_csv would probably be most helpful if we made a change so that duplicate rows are not displayed. For now, I've considered that out of scope for this PR, and can open up a separate issue for that.

    opened by data-pup 7
  • main(): Fix deprecated causes() w/iter_causes()

    main(): Fix deprecated causes() w/iter_causes()

    Fixes https://github.com/rustwasm/twiggy/issues/104

    Hi :) Since I'm completely new to Rust, it took me a while to figure this out... But that's the best way to learn! :D

    Nevertheless I'm still a bit confused ;) causes() is defined in Fail. Just like iter_causes(). The first can be directy used as method on the Error trait (even though being deprecated), the second can't... o.O Why?

    I also don't know if my solution really works, since I wasn't be able to raise a simple error somehow for testing :D How to do that?

    opened by userzimmermann 7
  • Failed to run custom build command for `twiggy-opt v0.1.0`

    Failed to run custom build command for `twiggy-opt v0.1.0`

    I'm trying to install twiggy with cargo, but on my Windows 10 I'm encountering the following build error:

    error: failed to run custom build command for `twiggy-opt v0.1.0`
    process didn't exit successfully: `C:\Users\D071863\AppData\Local\Temp\cargo-installUGK4Ht\release\build\twiggy-opt-8f09be37635e03b4\build-script-build` (exit code: 101)
    --- stdout
    cargo:rerun-if-changed=./definitions.js
    
    --- stderr
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }', libcore\result.rs:945:5
    stack backtrace:
       0: std::sys::windows::backtrace::unwind_backtrace
                 at C:\projects\rust\src\libstd\sys\windows\backtrace\mod.rs:65
       1: std::sys_common::backtrace::_print
                 at C:\projects\rust\src\libstd\sys_common\backtrace.rs:71
       2: std::sys_common::backtrace::print
                 at C:\projects\rust\src\libstd\sys_common\backtrace.rs:59
       3: std::panicking::default_hook::{{closure}}
                 at C:\projects\rust\src\libstd\panicking.rs:211
       4: std::panicking::default_hook
                 at C:\projects\rust\src\libstd\panicking.rs:227
       5: std::panicking::rust_panic_with_hook
                 at C:\projects\rust\src\libstd\panicking.rs:463
       6: std::panicking::begin_panic_fmt
                 at C:\projects\rust\src\libstd\panicking.rs:350
       7: std::panicking::rust_begin_panic
                 at C:\projects\rust\src\libstd\panicking.rs:328
       8: core::panicking::panic_fmt
                 at C:\projects\rust\src\libcore\panicking.rs:71
       9: core::result::unwrap_failed
      10: core::result::unwrap_failed
      11: core::result::unwrap_failed
      12: <alloc::raw_vec::RawVec<T, A>>::reserve
      13: std::rt::lang_start_internal::{{closure}}
                 at C:\projects\rust\src\libstd\rt.rs:59
      14: std::panicking::try::do_call<closure,i32>
                 at C:\projects\rust\src\libstd\panicking.rs:310
      15: panic_unwind::__rust_maybe_catch_panic
                 at C:\projects\rust\src\libpanic_unwind\lib.rs:105
      16: std::panicking::try
                 at C:\projects\rust\src\libstd\panicking.rs:289
      17: std::panic::catch_unwind
                 at C:\projects\rust\src\libstd\panic.rs:374
      18: std::rt::lang_start_internal
                 at C:\projects\rust\src\libstd\rt.rs:58
      19: main
      20: invoke_main
                 at f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:64
      21: __scrt_common_main_seh
                 at f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:253
      22: BaseThreadInitThunk
      23: RtlUserThreadStart
    
    warning: build failed, waiting for other jobs to finish...
    error: failed to compile `twiggy v0.1.0`, intermediate artifacts can be found at `C:\Users\D071863\AppData\Local\Temp\cargo-installUGK4Ht`
    
    Caused by:
      build failed
    

    Any ideas what's going on here?

    opened by yishn 7
  • Add license

    Add license

    Hi,

    I wanted to add twiggy to the list of linters at awesome-static-analysis, but I was unsure about the license of the code. Can we add a license to the project? ๐Ÿ˜ƒ

    opened by mre 7
  • twiggy crashes with mono binaries

    twiggy crashes with mono binaries

    Hello,

    I'm trying to use twiggy 0.2.0 with mono's wasm port and hitting this crash on OSX:

    tijuca:wasm rokumper$ RUST_BACKTRACE=1 twiggy top debug/mono.wasm
    thread 'main' panicked at 'assertion failed: index < u32::MAX as usize', /Users/kumpera/.cargo/registry/src/github.com-1ecc6299db9ec823/twiggy-ir-0.2.0/./ir.rs:414:9
    stack backtrace:
       0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
       1: std::sys_common::backtrace::print
       2: std::panicking::default_hook::{{closure}}
       3: std::panicking::default_hook
       4: std::panicking::rust_panic_with_hook
       5: std::panicking::begin_panic
       6: twiggy_ir::Id::entry
       7: twiggy_parser::wasm::<impl twiggy_parser::Parse<'a> for parity_wasm::elements::section::ElementSection>::parse_edges
       8: twiggy_parser::wasm::<impl twiggy_parser::Parse<'a> for parity_wasm::elements::module::Module>::parse_edges
       9: twiggy_parser::parse_wasm
      10: twiggy_parser::read_and_parse
      11: twiggy::main
      12: std::rt::lang_start::{{closure}}
      13: std::panicking::try::do_call
      14: __rust_maybe_catch_panic
      15: std::rt::lang_start_internal
      16: main
    

    To reproduce it. Download this file: https://jenkins.mono-project.com/job/test-mono-mainline-wasm/926/label=ubuntu-1804-amd64/Azure/processDownloadRequest/926/ubuntu-1804-amd64/sdks/wasm/mono-wasm-24c1f2a40c1.zip

    Then run twiggy: twiggy top debug/mono.wasm

    bug 
    opened by kumpera 6
  • Demangle function names

    Demangle function names

    Fixes #174. (Finally! :smile_cat:)

    In #270, we proposed merging the IR items for code/function section entries.

    I wonder if it makes sense to collapse func[123] and code[123] into the same IR item, since no body is used by more than one func and vice versa. They are essentially the same, even if they are split at the physical binary level (to allow eager type checking and validation).

    I think I agree [..] that the best way to handle this on WebAssembly is to merge the func/code nodes. When looking at the size of a function we may as well account for the bytes that the function type pointer takes up (although it's like 1-3 at most realistically). It'll definitely make reading the output a bit easier as I know in the past I've had to follow chains a few levels deep to get to the real part of a function!

    This combines the func/code nodes in the IR generated when parsing a wasm module :tada:

    To keep this somewhat more reviewable, I've divided the PR into 3 commits.

    • 9e82d6c - No changes to behavior, this simply refactors the parsing code towards a structure where merging the func/code nodes can be accomplished in as small a change as possible. This commit will still pass the original test snapshots.
    • 474b193 - This is where the actual IR node merge occurs, including changes to how we draw edges between nodes.
    • e1fcfba - This commit is purely updating the test snapshots. This should probably be reviewed first, so that we can decide whether this is an acceptable change regarding ergonomics/correctness :slightly_smiling_face:
    opened by data-pup 5
  • Bump object from 0.17.0 to 0.30.1

    Bump object from 0.17.0 to 0.30.1

    Bumps object from 0.17.0 to 0.30.1.

    Changelog

    Sourced from object's changelog.

    0.30.1

    Released 2023/01/04.

    Changed

    • Changed read::ElfSymbol::kind to handle STT_NOTYPE and STT_GNU_IFUNC. #498

    Added

    • Added read::CoffSymbol::raw_symbol. #494

    • Added ELF support for Solana Binary Format. #491

    • Added ELF support for AArch64 ILP32. #497


    0.30.0

    Released 2022/11/22.

    Breaking changes

    • The minimum supported rust version for the read feature has changed to 1.52.0. #458

    • The minimum supported rust version for the write feature has changed to 1.61.0.

    • Fixed endian handling in read::elf::SymbolTable::shndx. #458

    • Fixed endian handling in read::pe::ResourceName. #458

    • Changed definitions for LoongArch ELF header flags. #483

    Changed

    • Fixed parsing of multiple debug directory entries in read::pe::PeFile::pdb_info. #451

    • Changed the section name used when writing COFF stub symbols. #475

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump cargo_toml from 0.13.0 to 0.14.0

    Bump cargo_toml from 0.13.0 to 0.14.0

    Bumps cargo_toml from 0.13.0 to 0.14.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump thiserror from 1.0.37 to 1.0.38

    Bump thiserror from 1.0.37 to 1.0.38

    Bumps thiserror from 1.0.37 to 1.0.38.

    Release notes

    Sourced from thiserror's releases.

    1.0.38

    • Documentation improvements
    Commits
    • 74bfe75 Release 1.0.38
    • cfc7d8c Update build status badge
    • db78fa2 Update ui test suite to nightly-2022-12-15
    • c25a710 Time out workflows after 45 minutes
    • 464e2e7 Merge pull request #200 from dtolnay/displayattr
    • 4b06a3e Add test of Display impl nested inside display attribute
    • 29ee95e Ui test changes for trybuild 1.0.66
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump anyhow from 1.0.65 to 1.0.68

    Bump anyhow from 1.0.65 to 1.0.68

    Bumps anyhow from 1.0.65 to 1.0.68.

    Release notes

    Sourced from anyhow's releases.

    1.0.67

    • Improve the backtrace captured when context() is used on an Option (#280)

    1.0.66

    • Reduce unhelpful backtrace frames in backtraces captured during a context call (#279)
    Commits
    • 867763b Release 1.0.68
    • c0a87d0 Opt out -Zrustdoc-scrape-examples on docs.rs
    • 1cc707b Release 1.0.67
    • 613b261 Update build status badge
    • 0f922d7 Disable backtrace CI on Rust 1.50
    • acecd9b Update ui test suite to nightly-2022-12-15
    • 0bac51f Time out workflows after 45 minutes
    • 60e8800 Fix renamed let_underscore_drop lint
    • 8d1c734 Update ui test suite to nightly-2022-11-16
    • 451651b Update ui test suite to nightly-2022-11-11
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump gimli from 0.26.2 to 0.27.0

    Bump gimli from 0.26.2 to 0.27.0

    Bumps gimli from 0.26.2 to 0.27.0.

    Changelog

    Sourced from gimli's changelog.

    0.27.0

    Released 2022/11/23.

    Breaking changes

    • Added read::Dwarf::abbreviations_cache to cache abbreviations at offset 0. Changed read::Dwarf::abbreviations to return Result<Arc<Abbreviations>>, and changed read::Unit::abbreviations to Arc<Abbreviations>. #628

    Added

    • Added LoongArch register definitions. #624

    • Added support for tombstones in read::LocListIter and read::RngListIter. #631


    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump cpp_demangle from 0.3.5 to 0.4.0

    Bump cpp_demangle from 0.3.5 to 0.4.0

    Bumps cpp_demangle from 0.3.5 to 0.4.0.

    Changelog

    Sourced from cpp_demangle's changelog.

    0.4.0

    Released 2022/10/20

    Removed

    • The deprecated nightly and cppfilt features are gone.

    Changed

    • If no-default-features is used the alloc feature must be explicitly specified.

    0.3.6

    Released 2022/10/20

    Added

    • The non-deprecated versions of noexcept are supported. #273

    • Most of the subobject production that clang uses is supported. #273

    Changed

    • Rust 2018 is now used. #251

    • cppfilt now uses clap 4.0. #271

    Fixed

    • no_std works. #251

    • Inheriting constructors no longer produce substitutable values. #272


    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
Owner
Rust and WebAssembly
๐Ÿฆ€ + ๐Ÿ•ธ๏ธ = ๐Ÿ’–
Rust and WebAssembly
Run Java code from Rust!

Java Native Interface Bindings for Rust This library provides complete FFI bindings to the Java Native Interface, as well as a safe and intuitive wrap

Ben Anderson 66 Nov 28, 2022
An interactive scripting language where you can read and modify code comments as if they were regular strings

An interactive scripting language where you can read and modify code comments as if they were regular strings. Add and view text-based visualizations and debugging information inside your source code file.

Sumeet Agarwal 13 Apr 28, 2022
A Web-App written in Rust with Yew, using the same SyntaxHighlighter from Google Code Archive as planetb.ca

PlanetB SyntaxHighlighter About This is a small app, providing static files to have a frontend to format your code so you can paste it with styles to

Christof Weickhardt 2 Dec 14, 2022
Rust library for build scripts to compile C/C++ code into a Rust library

A library to compile C/C++/assembly into a Rust library/application.

Alex Crichton 1.3k Dec 21, 2022
This tool converts Lua code to TS automatically, including the conversion of common standards to their TS equivalents.

lua-to-ts This tool converts Lua code to TS automatically, including the conversion of common standards to their TS equivalents. Code that fails to be

Dion 11 Nov 21, 2022
A collection of unsound rust functions using entirly *safe* code

A collection of unsound rust functions using entirly *safe* code

null 2 Sep 6, 2022
A simple code for checking crate 'prost' on WebAssembly (๐Ÿฆ€ + ๐Ÿ•ธ๏ธ = ๐Ÿ’–)

rust-wasm-prost This repository is a simple code for checking crate 'prost' on WebAssembly ( ?? + ??๏ธ = ?? ). What is prost? prost is a Protocol Buffe

Chris Ohk 6 Apr 5, 2022
Turns running Rust code into a serializable data structure.

WasmBox WasmBox turns running Rust code into a serializable data structure. It does this by compiling it to WebAssembly and running it in a sandbox. T

drifting in space 12 Dec 7, 2022
Rust solutions to problems in Advent of Code '22.

Advent of Code '22 This repository contains my solutions for AoC'22 problems, written in the language that will save us from cpp. Running the code The

Eshaan Aggarwal 2 Dec 15, 2022
Zinnia is a runtime for Filecoin Station modules. It provides a sandboxed environment to execute untrusted code on consumer-grade computers.

?? Zinnia Zinnia is a runtime for Filecoin Station modules. It provides a sandboxed environment to execute untrusted code on consumer-grade computers.

Filecoin Station 5 Jan 25, 2023
zzhack-cli is a Command Tool to help you quickly generate a WASM WebApp with simple configuration and zero code

English | ไธญๆ–‡ๆ–‡ๆกฃ zzhack-cli is a Command Tool that can help you quickly generate a WASM WebApp with simple configuration and zero code. It's worth menti

null 17 Feb 9, 2023
Code for my workshop "Production-ready WebAssembly with Rust" presented at RustLab 2023 in Florence

Workshop: Production-ready WebAssembly with Rust A workshop on Rust for WebAssembly by Alberto Schiabel (@jkomyno). ?? This workshop was first present

Alberto Schiabel 14 Nov 23, 2023
memory-profiler โ€” A memory profiler for Linux

A memory profiler for Linux Features Can be used to analyze memory leaks, see where exactly the memory is being consumed, identify temporary allocatio

Koute 3.3k Jan 9, 2023
Rust derive-based argument parsing optimized for code size

Argh Argh is an opinionated Derive-based argument parser optimized for code size Derive-based argument parsing optimized for code size and conformance

Google 1.3k Dec 28, 2022
Rusty Shellcode Reflective DLL Injection (sRDI) - A small reflective loader in Rust 4KB in size for generating position-independent code (PIC) in Rust.

Shellcode Reflective DLL Injection (sRDI) Shellcode reflective DLL injection (sRDI) is a process injection technique that allows us to convert a given

null 242 Jul 5, 2023
Simple profiler scopes for wgpu using timer queries

wgpu-profiler Simple profiler scopes for wgpu using timer queries Features Easy to use profiler scopes Allows nesting! Can be disabled by runtime flag

null 41 Dec 5, 2022
Show puffin profiler flamegraph in-game using egui

Show puffin profiler flamegraph in-game using egui puffin is an instrumentation profiler where you opt-in to profile parts of your code: fn my_functio

Emil Ernerfeldt 44 Jun 3, 2022
Malloc frequency profiler

Malloc frequency profiler This malloc frequency profiler helps detect program hotspots that perform a large number of memory allocations.

Leonid Ryzhyk 7 Jan 7, 2022
A tracing profiler for the Sega MegaDrive/Genesis

md-profiler, a tracing profiler for the Sega MegaDrive/Genesis This program, meant to be used with this fork of BlastEm, helps you finding bottlenecks

null 15 Nov 3, 2022