Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid stdlib printing to stdout/stderr? #190

Open
surma opened this issue Aug 29, 2021 · 27 comments
Open

Avoid stdlib printing to stdout/stderr? #190

surma opened this issue Aug 29, 2021 · 27 comments

Comments

@surma
Copy link

surma commented Aug 29, 2021

A very minimal code sample like this:

#include <memory>

int main() {
  auto a = std::shared_ptr<int>(new int(3));
  return *a + 40;
}

compiled with WASI SDK like this:

clang++ --target=wasm32-wasi -O3 -flto -Wl,--lto-O3 -fno-exceptions --sysroot=/path/to/wasi-sysroot -o test.wasm ./test.cpp

results in a Wasm module that expects wasi_snapshot_preview1::{fd_close, fd_seek, fd_write} as imports, which feels unexpected to me. I am not sure why these imports are there, because I can’t find any embedded debugging strings, but I am assuming it’s because failed allocations etc will print to stderr? Is there any way to disable that and just fail with unreachable instead?

@sunfishcode
Copy link
Member

I guess this comes from libc++'s terminate handler, which does fprintf(stderr, ...). Unfortunately, I don't know of an easy way to tell libc++ not to link in this code.

@surma
Copy link
Author

surma commented Sep 1, 2021

@sbc100 Wondering if you have an idea on how to solve this? (Is Emscripten’s libc++ patched to handle this differently somehow?)

@kripken
Copy link
Member

kripken commented Sep 1, 2021

Yes, in emscripten there are some patches to remove what feels like excessive logging, e.g.

https://github.com/emscripten-core/emscripten/blob/6b80c5d6e052d3f4382ec4bde55b580377200460/system/lib/libcxxabi/src/abort_message.cpp#L36-L49

But I am not sure that's the problem here. The possible terminate in this code is due to a new failure to allocate, I think? That should happen here:

https://github.com/emscripten-core/emscripten/blob/6b80c5d6e052d3f4382ec4bde55b580377200460/system/lib/libcxx/src/new.cpp#L78-L87

In wasi-libc, unless you've added a new_handler, if you have exceptions disabled then it should just return 0 (weird, but debatable - in emscripten as you can see in the patch there, we abort instead), and if you have them enabled then it will throw bad_alloc. Is wasi-libcxx perhaps not being built with _LIBCPP_NO_EXCEPTIONS?

@TerrorJack
Copy link
Contributor

_LIBCPP_NO_EXCEPTIONS should have been enabled in wasi-sdk's libcxx according to https://github.com/WebAssembly/wasi-sdk/blob/main/Makefile#L144.

@surma
Copy link
Author

surma commented Sep 1, 2021

I just re-built wasi-sdk master branch and my repro above still emits a wasm binary that expects wasi_snapshot_preview1::{fd_close, fd_seek, fd_write} imports. Am I doing something wrong when compiling wasi-sdk or my test.cpp file, or is there something that needs to be fixed in wasi-sdk’s Makefile?

@sbc100
Copy link
Member

sbc100 commented Sep 1, 2021

Can you see where those imports are being called from if you look at the disassembly? You should able to track down the reason they are needed that way.

You can also using -Wl,--trace-symbol and the linker will tell you why each symbol is needed (you need to use the C/llvm symbol name in that case which will be something like __wasi_fd_read).

@surma
Copy link
Author

surma commented Sep 1, 2021

I am not quite sure how to get meaningful output from the symbol trace:

$  clang++ --target=wasm32-wasi -O0 -Wl,--trace-symbol=__wasi_fd_read -flto -Wl,--lto-O3 -fno-exceptions --sysroot=$WASI_SDK/share/wasi-sysroot -o test.wasm ./test.cpp

$WASI_SDK/share/wasi-sysroot/lib/wasm32-wasi/libc.a: lazy definition of __wasi_fd_read
$WASI_SDK/share/wasi-sysroot/lib/wasm32-wasi/libc.a(__wasilibc_real.o): definition of __wasi_fd_read

Looking at the .wasm, though, it seems that the WASI I/O functions are exclusively invoked via indirect calls (with a bunch of wrappers in-between. twiggy confirms:

            34 ┊     0.06% ┊ import wasi_snapshot_preview1::fd_close
               ┊           ┊   ⬑ __wasi_fd_close
               ┊           ┊       ⬑ close
               ┊           ┊           ⬑ __stdio_close
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            34 ┊     0.06% ┊ import wasi_snapshot_preview1::fd_write
               ┊           ┊   ⬑ __wasi_fd_write
               ┊           ┊       ⬑ writev
               ┊           ┊           ⬑ __stdio_write
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            33 ┊     0.06% ┊ import wasi_snapshot_preview1::fd_seek
               ┊           ┊   ⬑ __wasi_fd_seek
               ┊           ┊       ⬑ __lseek
               ┊           ┊           ⬑ __stdio_seek
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0] 

Are the indirect calls preventing DCE?

Just in case that’s helpful, here’s the whole call graph for the binary:

$ twiggy paths test.wasm
 Shallow Bytes │ Shallow % │ Retaining Paths
───────────────┼───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
         12668 ┊    22.10% ┊ "function names" subsection
          9033 ┊    15.76% ┊ printf_core
               ┊           ┊   ⬑ vfprintf
               ┊           ┊       ⬑ abort_message
               ┊           ┊           ⬑ __cxa_pure_virtual
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ fprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
          6960 ┊    12.14% ┊ dlmalloc
               ┊           ┊   ⬑ malloc
               ┊           ┊       ⬑ operator new(unsigned long)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
          3195 ┊     5.57% ┊ data[0]
          2558 ┊     4.46% ┊ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
          1863 ┊     3.25% ┊ dlfree
               ┊           ┊   ⬑ free
               ┊           ┊       ⬑ operator delete(void*)
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ std::__2::default_delete<int>::operator()(int*) const
               ┊           ┊               ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊                   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊                       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                           ⬑ __main_void
               ┊           ┊                               ⬑ __original_main
               ┊           ┊                                   ⬑ _start
               ┊           ┊                                       ⬑ export "_start"
               ┊           ┊               ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ void std::__2::__libcpp_operator_delete<void*>(void*)
               ┊           ┊               ⬑ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊                   ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊                       ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊                           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
          1412 ┊     2.46% ┊ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
          1122 ┊     1.96% ┊ memcpy
               ┊           ┊   ⬑ __fwritex
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊   ⬑ fwrite
               ┊           ┊       ⬑ fputs
               ┊           ┊           ⬑ long_double_not_supported
               ┊           ┊               ⬑ pop_arg
               ┊           ┊                   ⬑ printf_core
               ┊           ┊                       ⬑ vfprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
               ┊           ┊                           ⬑ fprintf
               ┊           ┊                               ⬑ abort_message
               ┊           ┊                                   ⬑ __cxa_pure_virtual
               ┊           ┊                                       ⬑ elem[0]
          1114 ┊     1.94% ┊ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
          1006 ┊     1.76% ┊ __dynamic_cast
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           705 ┊     1.23% ┊ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           691 ┊     1.21% ┊ __cxxabiv1::__class_type_info::process_static_type_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int) const
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           658 ┊     1.15% ┊ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           566 ┊     0.99% ┊ pop_arg
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
           505 ┊     0.88% ┊ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           406 ┊     0.71% ┊ vfprintf
               ┊           ┊   ⬑ abort_message
               ┊           ┊       ⬑ __cxa_pure_virtual
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ fprintf
               ┊           ┊       ⬑ abort_message
               ┊           ┊           ⬑ __cxa_pure_virtual
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
           390 ┊     0.68% ┊ __stdio_exit
               ┊           ┊   ⬑ __wasm_call_dtors
               ┊           ┊       ⬑ _start
               ┊           ┊           ⬑ export "_start"
           383 ┊     0.67% ┊ memset
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
           373 ┊     0.65% ┊ __cxxabiv1::__class_type_info::process_found_base_class(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           370 ┊     0.65% ┊ __cxxabiv1::__base_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           361 ┊     0.63% ┊ __cxxabiv1::__base_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           345 ┊     0.60% ┊ __cxxabiv1::__base_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           324 ┊     0.57% ┊ __stdio_write
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           319 ┊     0.56% ┊ is_equal(std::type_info const*, std::type_info const*, bool)
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __dynamic_cast
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           313 ┊     0.55% ┊ wcrtomb
               ┊           ┊   ⬑ wctomb
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
           309 ┊     0.54% ┊ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           292 ┊     0.51% ┊ fwrite
               ┊           ┊   ⬑ fputs
               ┊           ┊       ⬑ long_double_not_supported
               ┊           ┊           ⬑ pop_arg
               ┊           ┊               ⬑ printf_core
               ┊           ┊                   ⬑ vfprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
               ┊           ┊                       ⬑ fprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
           285 ┊     0.50% ┊ memchr
               ┊           ┊   ⬑ strnlen
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
           265 ┊     0.46% ┊ __fwritex
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
           250 ┊     0.44% ┊ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           245 ┊     0.43% ┊ operator new(unsigned long)
               ┊           ┊   ⬑ __main_void
               ┊           ┊       ⬑ __original_main
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
           216 ┊     0.38% ┊ std::__2::__shared_weak_count::__release_weak()
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
           216 ┊     0.38% ┊ __cxxabiv1::__class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           206 ┊     0.36% ┊ abort_message
               ┊           ┊   ⬑ __cxa_pure_virtual
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           186 ┊     0.32% ┊ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           183 ┊     0.32% ┊ __cxxabiv1::__class_type_info::process_static_type_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int) const
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           162 ┊     0.28% ┊ strlen
               ┊           ┊   ⬑ fputs
               ┊           ┊       ⬑ long_double_not_supported
               ┊           ┊           ⬑ pop_arg
               ┊           ┊               ⬑ printf_core
               ┊           ┊                   ⬑ vfprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
               ┊           ┊                       ⬑ fprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
           160 ┊     0.28% ┊ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊   ⬑ __main_void
               ┊           ┊       ⬑ __original_main
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
           146 ┊     0.25% ┊ frexp
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊   ⬑ frexp
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
           125 ┊     0.22% ┊ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
           125 ┊     0.22% ┊ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
           123 ┊     0.21% ┊ std::__2::__shared_count::__release_shared()
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
           122 ┊     0.21% ┊ data[1]
           121 ┊     0.21% ┊ __main_void
               ┊           ┊   ⬑ __original_main
               ┊           ┊       ⬑ _start
               ┊           ┊           ⬑ export "_start"
           117 ┊     0.20% ┊ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__get_deleter(std::type_info const&) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           115 ┊     0.20% ┊ writev
               ┊           ┊   ⬑ __stdio_write
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           108 ┊     0.19% ┊ custom section 'producers'
           107 ┊     0.19% ┊ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
           105 ┊     0.18% ┊ strcmp
               ┊           ┊   ⬑ is_equal(std::type_info const*, std::type_info const*, bool)
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __dynamic_cast
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
           102 ┊     0.18% ┊ __lseek
               ┊           ┊   ⬑ __stdio_seek
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
           102 ┊     0.18% ┊ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::__compressed_pair<int*&, std::__2::__default_init_tag>(int*&, std::__2::__default_init_tag&&)
               ┊           ┊   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::unique_ptr<true, void>(int*)
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
           102 ┊     0.18% ┊ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::__compressed_pair<int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
           102 ┊     0.18% ┊ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&, std::__2::allocator<int>&&)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
            98 ┊     0.17% ┊ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            95 ┊     0.17% ┊ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            95 ┊     0.17% ┊ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            95 ┊     0.17% ┊ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            94 ┊     0.16% ┊ __towrite
               ┊           ┊   ⬑ __fwritex
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊   ⬑ fwrite
               ┊           ┊       ⬑ fputs
               ┊           ┊           ⬑ long_double_not_supported
               ┊           ┊               ⬑ pop_arg
               ┊           ┊                   ⬑ printf_core
               ┊           ┊                       ⬑ vfprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
               ┊           ┊                           ⬑ fprintf
               ┊           ┊                               ⬑ abort_message
               ┊           ┊                                   ⬑ __cxa_pure_virtual
               ┊           ┊                                       ⬑ elem[0]
               ┊           ┊   ⬑ vfprintf
               ┊           ┊       ⬑ abort_message
               ┊           ┊           ⬑ __cxa_pure_virtual
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ fprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
            93 ┊     0.16% ┊ std::__2::__shared_weak_count::__shared_weak_count(long)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
            90 ┊     0.16% ┊ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊   ⬑ __main_void
               ┊           ┊       ⬑ __original_main
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
            87 ┊     0.15% ┊ strerror
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
            80 ┊     0.14% ┊ sbrk
               ┊           ┊   ⬑ dlmalloc
               ┊           ┊       ⬑ malloc
               ┊           ┊           ⬑ operator new(unsigned long)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
            78 ┊     0.14% ┊ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            78 ┊     0.14% ┊ __cxxabiv1::__shim_type_info::~__shim_type_info()
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            78 ┊     0.14% ┊ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            78 ┊     0.14% ┊ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            78 ┊     0.14% ┊ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            75 ┊     0.13% ┊ operator delete(void*)
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ std::__2::default_delete<int>::operator()(int*) const
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊           ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ void std::__2::__libcpp_operator_delete<void*>(void*)
               ┊           ┊       ⬑ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊           ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊               ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊                   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
            75 ┊     0.13% ┊ std::__2::unique_ptr<int, std::__2::default_delete<int> >::release()
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
            74 ┊     0.13% ┊ std::__2::default_delete<int>::operator()(int*) const
               ┊           ┊   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            74 ┊     0.13% ┊ std::__2::__compressed_pair_elem<int*, 0, false>::__compressed_pair_elem<int*&, void>(int*&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::__compressed_pair<int*&, std::__2::__default_init_tag>(int*&, std::__2::__default_init_tag&&)
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::unique_ptr<true, void>(int*)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::__compressed_pair<int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            74 ┊     0.13% ┊ std::__2::__compressed_pair_elem<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, 0, false>::__compressed_pair_elem<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, void>(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&, std::__2::allocator<int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            74 ┊     0.13% ┊ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            73 ┊     0.13% ┊ std::type_info::operator==(std::type_info const&) const
               ┊           ┊   ⬑ is_equal(std::type_info const*, std::type_info const*, bool)
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __dynamic_cast
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__get_deleter(std::type_info const&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            71 ┊     0.12% ┊ std::__2::unique_ptr<int, std::__2::default_delete<int> >::unique_ptr<true, void>(int*)
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
            71 ┊     0.12% ┊ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
            71 ┊     0.12% ┊ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊   ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            70 ┊     0.12% ┊ update_offset_to_base(char const*, long)
               ┊           ┊   ⬑ __cxxabiv1::__base_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__base_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__base_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            69 ┊     0.12% ┊ std::__2::__compressed_pair_elem<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, 1, true>::__compressed_pair_elem<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, void>(std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::__compressed_pair<int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            69 ┊     0.12% ┊ std::__2::__compressed_pair_elem<std::__2::allocator<int>, 1, true>::__compressed_pair_elem<std::__2::allocator<int>, void>(std::__2::allocator<int>&&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&, std::__2::allocator<int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            63 ┊     0.11% ┊ std::type_info::name() const
               ┊           ┊   ⬑ is_equal(std::type_info const*, std::type_info const*, bool)
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __dynamic_cast
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            60 ┊     0.10% ┊ std::__2::__shared_count::__shared_count(long)
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__shared_weak_count(long)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            59 ┊     0.10% ┊ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊   ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊       ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            58 ┊     0.10% ┊ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            57 ┊     0.10% ┊ fprintf
               ┊           ┊   ⬑ abort_message
               ┊           ┊       ⬑ __cxa_pure_virtual
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            57 ┊     0.10% ┊ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            56 ┊     0.10% ┊ long std::__2::(anonymous namespace)::__libcpp_atomic_load<long>(long const*, int)
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__release_weak()
               ┊           ┊       ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            56 ┊     0.10% ┊ void (*std::__2::(anonymous namespace)::__libcpp_atomic_load<void (*)()>(void (* const*)(), int))()
               ┊           ┊   ⬑ std::get_new_handler()
               ┊           ┊       ⬑ operator new(unsigned long)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            56 ┊     0.10% ┊ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
            56 ┊     0.10% ┊ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::first()
               ┊           ┊   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::release()
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            56 ┊     0.10% ┊ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::second()
               ┊           ┊   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            56 ┊     0.10% ┊ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::first()
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            56 ┊     0.10% ┊ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::second()
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            56 ┊     0.10% ┊ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::first()
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            56 ┊     0.10% ┊ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::first() const
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__get_deleter(std::type_info const&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            56 ┊     0.10% ┊ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::second() const
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__get_deleter(std::type_info const&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            56 ┊     0.10% ┊ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::second()
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            56 ┊     0.10% ┊ std::__2::pointer_traits<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*>::pointer_to(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >&)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            52 ┊     0.09% ┊ void std::__2::__libcpp_operator_delete<void*>(void*)
               ┊           ┊   ⬑ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊       ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊           ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊               ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
            46 ┊     0.08% ┊ std::__2::__shared_weak_count::__get_deleter(std::type_info const&) const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            44 ┊     0.08% ┊ long std::__2::__libcpp_atomic_refcount_decrement<long>(long&)
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__release_weak()
               ┊           ┊       ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__shared_count::__release_shared()
               ┊           ┊       ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            43 ┊     0.08% ┊ _start
               ┊           ┊   ⬑ export "_start"
            42 ┊     0.07% ┊ std::__2::__shared_count::~__shared_count()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            42 ┊     0.07% ┊ std::type_info::~type_info()
               ┊           ┊   ⬑ __cxxabiv1::__shim_type_info::~__shim_type_info()
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            39 ┊     0.07% ┊ elem[0]
               ┊           ┊   ⬑ table[0]
            38 ┊     0.07% ┊ fputs
               ┊           ┊   ⬑ long_double_not_supported
               ┊           ┊       ⬑ pop_arg
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
            36 ┊     0.06% ┊ custom section 'name' headers
            35 ┊     0.06% ┊ import wasi_snapshot_preview1::proc_exit
               ┊           ┊   ⬑ __wasi_proc_exit
               ┊           ┊       ⬑ _start
               ┊           ┊           ⬑ export "_start"
            35 ┊     0.06% ┊ close
               ┊           ┊   ⬑ __stdio_close
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            34 ┊     0.06% ┊ import wasi_snapshot_preview1::fd_close
               ┊           ┊   ⬑ __wasi_fd_close
               ┊           ┊       ⬑ close
               ┊           ┊           ⬑ __stdio_close
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            34 ┊     0.06% ┊ import wasi_snapshot_preview1::fd_write
               ┊           ┊   ⬑ __wasi_fd_write
               ┊           ┊       ⬑ writev
               ┊           ┊           ⬑ __stdio_write
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            34 ┊     0.06% ┊ std::__2::__shared_count::~__shared_count()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            34 ┊     0.06% ┊ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            34 ┊     0.06% ┊ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::allocator<int>(std::__2::allocator<int> const&)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            33 ┊     0.06% ┊ import wasi_snapshot_preview1::fd_seek
               ┊           ┊   ⬑ __wasi_fd_seek
               ┊           ┊       ⬑ __lseek
               ┊           ┊           ⬑ __stdio_seek
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
            33 ┊     0.06% ┊ __cxxabiv1::__shim_type_info::noop1() const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            33 ┊     0.06% ┊ __cxxabiv1::__shim_type_info::noop2() const
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            33 ┊     0.06% ┊ std::get_new_handler()
               ┊           ┊   ⬑ operator new(unsigned long)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
            30 ┊     0.05% ┊ long_double_not_supported
               ┊           ┊   ⬑ pop_arg
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
            30 ┊     0.05% ┊ std::__2::shared_ptr<int>::operator*() const
               ┊           ┊   ⬑ __main_void
               ┊           ┊       ⬑ __original_main
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
            29 ┊     0.05% ┊ __cxa_pure_virtual
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            28 ┊     0.05% ┊ strnlen
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::allocator<int>::allocator()
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
            27 ┊     0.05% ┊ std::__2::remove_reference<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&>::type&& std::__2::move<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&>(std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
            27 ┊     0.05% ┊ std::__2::remove_reference<std::__2::allocator<int>&>::type&& std::__2::move<std::__2::allocator<int>&>(std::__2::allocator<int>&)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<int*, 0, false>::__get()
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::first()
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::release()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊           ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::first()
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<std::__2::default_delete<int>, 1, true>::__get()
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::second()
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊           ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
            27 ┊     0.05% ┊ int*& std::__2::forward<int*&>(std::__2::remove_reference<int*&>::type&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::__compressed_pair<int*&, std::__2::__default_init_tag>(int*&, std::__2::__default_init_tag&&)
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::unique_ptr<true, void>(int*)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::__compressed_pair<int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__compressed_pair_elem<int*, 0, false>::__compressed_pair_elem<int*&, void>(int*&)
               ┊           ┊       ⬑ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::__compressed_pair<int*&, std::__2::__default_init_tag>(int*&, std::__2::__default_init_tag&&)
               ┊           ┊           ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::unique_ptr<true, void>(int*)
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊       ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::__compressed_pair<int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
            27 ┊     0.05% ┊ std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&& std::__2::forward<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(std::__2::remove_reference<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::type&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::__compressed_pair<int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__compressed_pair_elem<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, 1, true>::__compressed_pair_elem<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, void>(std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊       ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::__compressed_pair<int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >(int*&, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>&&)
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
            27 ┊     0.05% ┊ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&& std::__2::forward<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> > >(std::__2::remove_reference<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> > >::type&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&, std::__2::allocator<int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__compressed_pair_elem<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, 0, false>::__compressed_pair_elem<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, void>(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&)
               ┊           ┊       ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&, std::__2::allocator<int>&&)
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
            27 ┊     0.05% ┊ std::__2::allocator<int>&& std::__2::forward<std::__2::allocator<int> >(std::__2::remove_reference<std::__2::allocator<int> >::type&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&, std::__2::allocator<int>&&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__compressed_pair_elem<std::__2::allocator<int>, 1, true>::__compressed_pair_elem<std::__2::allocator<int>, void>(std::__2::allocator<int>&&)
               ┊           ┊       ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >(std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >&&, std::__2::allocator<int>&&)
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__shared_ptr_pointer(int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int>)
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
            27 ┊     0.05% ┊ std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> const* std::__2::addressof<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> const>(std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> const&)
               ┊           ┊   ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__get_deleter(std::type_info const&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<std::__2::allocator<int>, 1, true>::__get()
               ┊           ┊   ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::second()
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >* std::__2::addressof<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >&)
               ┊           ┊   ⬑ std::__2::pointer_traits<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*>::pointer_to(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >&)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, 0, false>::__get() const
               ┊           ┊   ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::first() const
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__get_deleter(std::type_info const&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, 1, true>::__get() const
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::second() const
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__get_deleter(std::type_info const&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, 0, false>::__get()
               ┊           ┊   ⬑ std::__2::__compressed_pair<std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >, std::__2::allocator<int> >::first()
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, 1, true>::__get()
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int> >::second()
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            27 ┊     0.05% ┊ std::__2::__compressed_pair_elem<std::__2::default_delete<int>, 1, true>::__compressed_pair_elem(std::__2::__default_init_tag)
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::__compressed_pair<int*&, std::__2::__default_init_tag>(int*&, std::__2::__default_init_tag&&)
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::unique_ptr<true, void>(int*)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            26 ┊     0.05% ┊ wctomb
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
            23 ┊     0.04% ┊ __wasi_fd_seek
               ┊           ┊   ⬑ __lseek
               ┊           ┊       ⬑ __stdio_seek
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            23 ┊     0.04% ┊ __wasi_fd_write
               ┊           ┊   ⬑ writev
               ┊           ┊       ⬑ __stdio_write
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            19 ┊     0.03% ┊ __stdio_seek
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            18 ┊     0.03% ┊ std::__2::shared_ptr<int>::__enable_weak_this(...)
               ┊           ┊   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
            18 ┊     0.03% ┊ std::__2::__default_init_tag&& std::__2::forward<std::__2::__default_init_tag>(std::__2::remove_reference<std::__2::__default_init_tag>::type&)
               ┊           ┊   ⬑ std::__2::__compressed_pair<int*, std::__2::default_delete<int> >::__compressed_pair<int*&, std::__2::__default_init_tag>(int*&, std::__2::__default_init_tag&&)
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::unique_ptr<true, void>(int*)
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
            17 ┊     0.03% ┊ __wasi_fd_close
               ┊           ┊   ⬑ close
               ┊           ┊       ⬑ __stdio_close
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
            16 ┊     0.03% ┊ __wasm_call_dtors
               ┊           ┊   ⬑ _start
               ┊           ┊       ⬑ export "_start"
            15 ┊     0.03% ┊ __stdio_close
               ┊           ┊   ⬑ elem[0]
               ┊           ┊       ⬑ table[0]
            14 ┊     0.02% ┊ __lctrans
               ┊           ┊   ⬑ strerror
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
            13 ┊     0.02% ┊ __wasi_proc_exit
               ┊           ┊   ⬑ _start
               ┊           ┊       ⬑ export "_start"
            12 ┊     0.02% ┊ malloc
               ┊           ┊   ⬑ operator new(unsigned long)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
            12 ┊     0.02% ┊ free
               ┊           ┊   ⬑ operator delete(void*)
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ std::__2::default_delete<int>::operator()(int*) const
               ┊           ┊           ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊               ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊                   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                       ⬑ __main_void
               ┊           ┊                           ⬑ __original_main
               ┊           ┊                               ⬑ _start
               ┊           ┊                                   ⬑ export "_start"
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ void std::__2::__libcpp_operator_delete<void*>(void*)
               ┊           ┊           ⬑ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊               ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊                   ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊                       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
            12 ┊     0.02% ┊ custom section 'producers' headers
            11 ┊     0.02% ┊ code section headers
            10 ┊     0.02% ┊ __original_main
               ┊           ┊   ⬑ _start
               ┊           ┊       ⬑ export "_start"
            10 ┊     0.02% ┊ __ofl_lock
               ┊           ┊   ⬑ __stdio_exit
               ┊           ┊       ⬑ __wasm_call_dtors
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
             9 ┊     0.02% ┊ type[3]: (i32, i32, i32, i32, i32, i32) -> nil
               ┊           ┊   ⬑ __cxxabiv1::__base_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
             9 ┊     0.02% ┊ type[13]: (i32, i32, i32, i32, i32) -> i32
               ┊           ┊   ⬑ printf_core
               ┊           ┊       ⬑ vfprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ fprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
             9 ┊     0.02% ┊ export "memory"
             9 ┊     0.02% ┊ export "_start"
             8 ┊     0.01% ┊ type[4]: (i32, i32, i32, i32, i32) -> nil
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::process_static_type_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__base_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
             8 ┊     0.01% ┊ type[8]: (i32, i64, i32, i32) -> i32
               ┊           ┊   ⬑ __wasi_fd_seek
               ┊           ┊       ⬑ __lseek
               ┊           ┊           ⬑ __stdio_seek
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
             8 ┊     0.01% ┊ type[9]: (i32, i32, i32, i32) -> i32
               ┊           ┊   ⬑ __dynamic_cast
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __wasi_fd_write
               ┊           ┊       ⬑ writev
               ┊           ┊           ⬑ __stdio_write
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ fwrite
               ┊           ┊       ⬑ fputs
               ┊           ┊           ⬑ long_double_not_supported
               ┊           ┊               ⬑ pop_arg
               ┊           ┊                   ⬑ printf_core
               ┊           ┊                       ⬑ vfprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
               ┊           ┊                           ⬑ fprintf
               ┊           ┊                               ⬑ abort_message
               ┊           ┊                                   ⬑ __cxa_pure_virtual
               ┊           ┊                                       ⬑ elem[0]
             8 ┊     0.01% ┊ wasm magic bytes
             7 ┊     0.01% ┊ type[2]: (i32, i32, i32, i32) -> nil
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::process_found_base_class(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__base_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::process_static_type_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int) const
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
             7 ┊     0.01% ┊ type[6]: (i32, i32, i32) -> i32
               ┊           ┊   ⬑ is_equal(std::type_info const*, std::type_info const*, bool)
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __dynamic_cast
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ fprintf
               ┊           ┊       ⬑ abort_message
               ┊           ┊           ⬑ __cxa_pure_virtual
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ writev
               ┊           ┊       ⬑ __stdio_write
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __stdio_write
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __fwritex
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊   ⬑ vfprintf
               ┊           ┊       ⬑ abort_message
               ┊           ┊           ⬑ __cxa_pure_virtual
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ fprintf
               ┊           ┊           ⬑ abort_message
               ┊           ┊               ⬑ __cxa_pure_virtual
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊   ⬑ memcpy
               ┊           ┊       ⬑ __fwritex
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
               ┊           ┊       ⬑ fwrite
               ┊           ┊           ⬑ fputs
               ┊           ┊               ⬑ long_double_not_supported
               ┊           ┊                   ⬑ pop_arg
               ┊           ┊                       ⬑ printf_core
               ┊           ┊                           ⬑ vfprintf
               ┊           ┊                               ⬑ abort_message
               ┊           ┊                                   ⬑ __cxa_pure_virtual
               ┊           ┊                                       ⬑ elem[0]
               ┊           ┊                               ⬑ fprintf
               ┊           ┊                                   ⬑ abort_message
               ┊           ┊                                       ⬑ __cxa_pure_virtual
               ┊           ┊   ⬑ memset
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊   ⬑ memchr
               ┊           ┊       ⬑ strnlen
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
             7 ┊     0.01% ┊ type[7]: (i32, i64, i32) -> i64
               ┊           ┊   ⬑ __lseek
               ┊           ┊       ⬑ __stdio_seek
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __stdio_seek
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
             7 ┊     0.01% ┊ global[0]
               ┊           ┊   ⬑ std::__2::__shared_count::~__shared_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊               ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_count::~__shared_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__release_weak()
               ┊           ┊       ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ long std::__2::(anonymous namespace)::__libcpp_atomic_load<long>(long const*, int)
               ┊           ┊       ⬑ std::__2::__shared_weak_count::__release_weak()
               ┊           ┊           ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__get_deleter(std::type_info const&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ abort_message
               ┊           ┊       ⬑ __cxa_pure_virtual
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ std::type_info::~type_info()
               ┊           ┊       ⬑ __cxxabiv1::__shim_type_info::~__shim_type_info()
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊               ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊               ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__shim_type_info::~__shim_type_info()
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
             7 ┊     0.01% ┊ "function names" subsection
             6 ┊     0.01% ┊ type[10]: (i32, i32) -> i32
               ┊           ┊   ⬑ long std::__2::(anonymous namespace)::__libcpp_atomic_load<long>(long const*, int)
               ┊           ┊       ⬑ std::__2::__shared_weak_count::__release_weak()
               ┊           ┊           ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__get_deleter(std::type_info const&) const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ update_offset_to_base(char const*, long)
               ┊           ┊       ⬑ __cxxabiv1::__base_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__base_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__base_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ void (*std::__2::(anonymous namespace)::__libcpp_atomic_load<void (*)()>(void (* const*)(), int))()
               ┊           ┊       ⬑ std::get_new_handler()
               ┊           ┊           ⬑ operator new(unsigned long)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊   ⬑ fputs
               ┊           ┊       ⬑ long_double_not_supported
               ┊           ┊           ⬑ pop_arg
               ┊           ┊               ⬑ printf_core
               ┊           ┊                   ⬑ vfprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
               ┊           ┊                       ⬑ fprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
               ┊           ┊   ⬑ strcmp
               ┊           ┊       ⬑ is_equal(std::type_info const*, std::type_info const*, bool)
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __dynamic_cast
               ┊           ┊               ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ strnlen
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊   ⬑ dummy
               ┊           ┊       ⬑ __lctrans
               ┊           ┊           ⬑ strerror
               ┊           ┊               ⬑ printf_core
               ┊           ┊                   ⬑ vfprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
               ┊           ┊                       ⬑ fprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
               ┊           ┊   ⬑ __lctrans
               ┊           ┊       ⬑ strerror
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
               ┊           ┊   ⬑ wctomb
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
             6 ┊     0.01% ┊ type[14]: (i32, i32, i32) -> nil
               ┊           ┊   ⬑ pop_arg
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
             6 ┊     0.01% ┊ type[15]: (f64, i32) -> f64
               ┊           ┊   ⬑ frexp
               ┊           ┊       ⬑ printf_core
               ┊           ┊           ⬑ vfprintf
               ┊           ┊               ⬑ abort_message
               ┊           ┊                   ⬑ __cxa_pure_virtual
               ┊           ┊                       ⬑ elem[0]
               ┊           ┊                           ⬑ table[0]
               ┊           ┊               ⬑ fprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊       ⬑ frexp
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
             6 ┊     0.01% ┊ abort
               ┊           ┊   ⬑ abort_message
               ┊           ┊       ⬑ __cxa_pure_virtual
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ sbrk
               ┊           ┊       ⬑ dlmalloc
               ┊           ┊           ⬑ malloc
               ┊           ┊               ⬑ operator new(unsigned long)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊                   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                       ⬑ __main_void
               ┊           ┊                           ⬑ __original_main
               ┊           ┊                               ⬑ _start
               ┊           ┊                                   ⬑ export "_start"
               ┊           ┊   ⬑ long_double_not_supported
               ┊           ┊       ⬑ pop_arg
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
             6 ┊     0.01% ┊ dummy
               ┊           ┊   ⬑ __lctrans
               ┊           ┊       ⬑ strerror
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
             5 ┊     0.01% ┊ type[1]: (i32) -> i32
               ┊           ┊   ⬑ std::__2::__shared_count::~__shared_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊               ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ std::type_info::~type_info()
               ┊           ┊       ⬑ __cxxabiv1::__shim_type_info::~__shim_type_info()
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊               ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊               ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__shim_type_info::~__shim_type_info()
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ std::type_info::name() const
               ┊           ┊       ⬑ is_equal(std::type_info const*, std::type_info const*, bool)
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __dynamic_cast
               ┊           ┊               ⬑ __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ operator new(unsigned long)
               ┊           ┊       ⬑ __main_void
               ┊           ┊           ⬑ __original_main
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
               ┊           ┊       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
               ┊           ┊   ⬑ malloc
               ┊           ┊       ⬑ operator new(unsigned long)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
             5 ┊     0.01% ┊ type[11]: (i32, i32) -> nil
               ┊           ┊   ⬑ abort_message
               ┊           ┊       ⬑ __cxa_pure_virtual
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ std::__2::default_delete<int>::operator()(int*) const
               ┊           ┊       ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊           ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊               ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                   ⬑ __main_void
               ┊           ┊                       ⬑ __original_main
               ┊           ┊                           ⬑ _start
               ┊           ┊                               ⬑ export "_start"
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊       ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊   ⬑ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊       ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊           ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊               ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
             4 ┊     0.01% ┊ type[0]: (i32) -> nil
               ┊           ┊   ⬑ std::__2::__shared_count::~__shared_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_weak_count::~__shared_weak_count()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ std::__2::__shared_weak_count::__release_weak()
               ┊           ┊       ⬑ std::__2::__shared_weak_count::__release_shared()
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::~shared_ptr()
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ __cxxabiv1::__shim_type_info::noop1() const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__shim_type_info::noop2() const
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ operator delete(void*)
               ┊           ┊       ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ std::__2::default_delete<int>::operator()(int*) const
               ┊           ┊           ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊               ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊                   ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                       ⬑ __main_void
               ┊           ┊                           ⬑ __original_main
               ┊           ┊                               ⬑ _start
               ┊           ┊                                   ⬑ export "_start"
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊           ⬑ elem[0]
               ┊           ┊               ⬑ table[0]
               ┊           ┊       ⬑ void std::__2::__libcpp_operator_delete<void*>(void*)
               ┊           ┊           ⬑ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊               ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊                   ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊                       ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊   ⬑ free
               ┊           ┊       ⬑ operator delete(void*)
               ┊           ┊           ⬑ __cxxabiv1::__class_type_info::~__class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__si_class_type_info::~__si_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ std::__2::default_delete<int>::operator()(int*) const
               ┊           ┊               ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::reset(int*)
               ┊           ┊                   ⬑ std::__2::unique_ptr<int, std::__2::default_delete<int> >::~unique_ptr()
               ┊           ┊                       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                           ⬑ __main_void
               ┊           ┊                               ⬑ __original_main
               ┊           ┊                                   ⬑ _start
               ┊           ┊                                       ⬑ export "_start"
               ┊           ┊               ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared()
               ┊           ┊                   ⬑ elem[0]
               ┊           ┊                       ⬑ table[0]
               ┊           ┊           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::~__shared_ptr_pointer()
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊           ⬑ void std::__2::__libcpp_operator_delete<void*>(void*)
               ┊           ┊               ⬑ void std::__2::__do_deallocate_handle_size<>(void*, unsigned long)
               ┊           ┊                   ⬑ std::__2::__libcpp_deallocate(void*, unsigned long, unsigned long)
               ┊           ┊                       ⬑ std::__2::allocator<std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> > >::deallocate(std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >*, unsigned long)
               ┊           ┊                           ⬑ std::__2::__shared_ptr_pointer<int*, std::__2::shared_ptr<int>::__shared_ptr_default_delete<int, int>, std::__2::allocator<int> >::__on_zero_shared_weak()
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
             4 ┊     0.01% ┊ type[12]: () -> i32
               ┊           ┊   ⬑ std::get_new_handler()
               ┊           ┊       ⬑ operator new(unsigned long)
               ┊           ┊           ⬑ __main_void
               ┊           ┊               ⬑ __original_main
               ┊           ┊                   ⬑ _start
               ┊           ┊                       ⬑ export "_start"
               ┊           ┊           ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊               ⬑ __main_void
               ┊           ┊                   ⬑ __original_main
               ┊           ┊                       ⬑ _start
               ┊           ┊                           ⬑ export "_start"
               ┊           ┊   ⬑ __original_main
               ┊           ┊       ⬑ _start
               ┊           ┊           ⬑ export "_start"
               ┊           ┊   ⬑ __ofl_lock
               ┊           ┊       ⬑ __stdio_exit
               ┊           ┊           ⬑ __wasm_call_dtors
               ┊           ┊               ⬑ _start
               ┊           ┊                   ⬑ export "_start"
               ┊           ┊   ⬑ __main_void
               ┊           ┊       ⬑ __original_main
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
             4 ┊     0.01% ┊ import section headers
             4 ┊     0.01% ┊ table[0]
             4 ┊     0.01% ┊ __wasm_call_ctors
               ┊           ┊   ⬑ _start
               ┊           ┊       ⬑ export "_start"
             4 ┊     0.01% ┊ dummy
               ┊           ┊   ⬑ __wasm_call_dtors
               ┊           ┊       ⬑ _start
               ┊           ┊           ⬑ export "_start"
             4 ┊     0.01% ┊ data section headers
             3 ┊     0.01% ┊ type[5]: () -> nil
               ┊           ┊   ⬑ __wasm_call_ctors
               ┊           ┊       ⬑ _start
               ┊           ┊           ⬑ export "_start"
               ┊           ┊   ⬑ _start
               ┊           ┊       ⬑ export "_start"
               ┊           ┊   ⬑ __cxa_pure_virtual
               ┊           ┊       ⬑ elem[0]
               ┊           ┊           ⬑ table[0]
               ┊           ┊   ⬑ abort
               ┊           ┊       ⬑ abort_message
               ┊           ┊           ⬑ __cxa_pure_virtual
               ┊           ┊               ⬑ elem[0]
               ┊           ┊                   ⬑ table[0]
               ┊           ┊       ⬑ sbrk
               ┊           ┊           ⬑ dlmalloc
               ┊           ┊               ⬑ malloc
               ┊           ┊                   ⬑ operator new(unsigned long)
               ┊           ┊                       ⬑ __main_void
               ┊           ┊                           ⬑ __original_main
               ┊           ┊                               ⬑ _start
               ┊           ┊                                   ⬑ export "_start"
               ┊           ┊                       ⬑ std::__2::shared_ptr<int>::shared_ptr<int>(int*, std::__2::enable_if<__compatible_with<int, int>::value, std::__2::shared_ptr<int>::__nat>::type)
               ┊           ┊                           ⬑ __main_void
               ┊           ┊                               ⬑ __original_main
               ┊           ┊                                   ⬑ _start
               ┊           ┊                                       ⬑ export "_start"
               ┊           ┊       ⬑ long_double_not_supported
               ┊           ┊           ⬑ pop_arg
               ┊           ┊               ⬑ printf_core
               ┊           ┊                   ⬑ vfprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
               ┊           ┊                       ⬑ fprintf
               ┊           ┊                           ⬑ abort_message
               ┊           ┊                               ⬑ __cxa_pure_virtual
               ┊           ┊                                   ⬑ elem[0]
               ┊           ┊                                       ⬑ table[0]
               ┊           ┊   ⬑ dummy
               ┊           ┊       ⬑ __wasm_call_dtors
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
               ┊           ┊   ⬑ __wasm_call_dtors
               ┊           ┊       ⬑ _start
               ┊           ┊           ⬑ export "_start"
               ┊           ┊   ⬑ __stdio_exit
               ┊           ┊       ⬑ __wasm_call_dtors
               ┊           ┊           ⬑ _start
               ┊           ┊               ⬑ export "_start"
               ┊           ┊   ⬑ long_double_not_supported
               ┊           ┊       ⬑ pop_arg
               ┊           ┊           ⬑ printf_core
               ┊           ┊               ⬑ vfprintf
               ┊           ┊                   ⬑ abort_message
               ┊           ┊                       ⬑ __cxa_pure_virtual
               ┊           ┊                           ⬑ elem[0]
               ┊           ┊                               ⬑ table[0]
               ┊           ┊                   ⬑ fprintf
               ┊           ┊                       ⬑ abort_message
               ┊           ┊                           ⬑ __cxa_pure_virtual
               ┊           ┊                               ⬑ elem[0]
               ┊           ┊                                   ⬑ table[0]
             3 ┊     0.01% ┊ type section headers
             3 ┊     0.01% ┊ table section headers
             3 ┊     0.01% ┊ memory section headers
             3 ┊     0.01% ┊ global section headers
             3 ┊     0.01% ┊ export section headers
             3 ┊     0.01% ┊ element section headers
             2 ┊     0.00% ┊ memory[0]
               ┊           ┊   ⬑ export "memory"
             2 ┊     0.00% ┊ "function names" subsection
             2 ┊     0.00% ┊ "local names" subsection

@surma
Copy link
Author

surma commented Sep 7, 2021

I don’t mean to nag, but I do want to find a solution to this :D Is there anything else I can provide to isolate what the cause is? Is it the indirect calls?

@sbc100
Copy link
Member

sbc100 commented Sep 7, 2021

Yes it looks like the indirect calls. This are pulled in by usage of stdin/stdout/stderr.

See: https://github.com/WebAssembly/wasi-libc/blob/a78cd329aec717f149934d7362f57050c9401f60/libc-top-half/musl/src/stdio/stdout.c#L5-L18

And also fdopen (although I suspect is a stdout/stderr reference in this case):
https://github.com/WebAssembly/wasi-libc/blob/a78cd329aec717f149934d7362f57050c9401f60/libc-top-half/musl/src/stdio/__fdopen.c#L72-L75

You could try linking with -Wl,--trace-symbol=stderr (or stdout) to find out where the references are coming from. It seem very likely that @kripken is correct that the references is coming from abort_message (https://github.com/llvm/llvm-project/blob/c9e9635ffef781c32a839a77d122d7930edfc9b2/libcxxabi/src/abort_message.cpp#L39).

@surma
Copy link
Author

surma commented Sep 7, 2021

Yeah, abort_message seems to be the reason that this gets compiled, which I think twiggy also kinda confirmed.

I was more looking for insight what to do about it. Looking at the source you linked (super helpful!) I could compile WASI SDK with NDEBUG=1 or LIBCXXABI_BAREMETAL=1. Apparently NDEBUG should be set for release builds, so I’m not sure why it’s actually including this code.

@sbc100
Copy link
Member

sbc100 commented Sep 7, 2021

You could try changing the libcxxabi code to:

#if !defined(NDEBUG) || (!defined(LIBCXXABI_BAREMETAL) && !defined(__wasi__))

Or maybe even __wasm__ on the grounds that we care a lot about codesize on wasm targets.

@sunfishcode
Copy link
Member

Looks like LIBCXXABI_BAREMETAL may be pretty close to what we want already; would it make sense to enable that in wasi-sdk builds?

@surma
Copy link
Author

surma commented Sep 7, 2021

After looking into it a bit more, it seems that LIBCXX_ENABLE_ASSERTIONS is enabled by default which in turn forces NDEBUG to be unset, which means the #ifdef is always true anyway.

So you can either follow @sbc100’s suggestion and monkey-patch abort_message.cpp

- #if !defined(NDEBUG) || !defined(LIBCXXABI_BAREMETAL)
+ #if (!defined(NDEBUG) || !defined(LIBCXXABI_BAREMETAL)) && !defined(__wasm__)

or you edit WASI SDK’s Makefile and disable assertions while opting into baremetal mode:

LIBCXXABI_CMAKE_FLAGS = \
    # ... snip ...
    -DUNIX:BOOL=ON \
+   -DLIBCXXABI_BAREMETAL=ON \
+   -DLIBCXXABI_ENABLE_ASSERTIONS=OFF \
    --debug-trycompile

AFACIT, LIBCXXABI_ENABLE_ASSERTIONS is only used in CMakeLists.txt to unset NDEBUG for Release builds, meaning that WASI SDK’s libcxxabi is currently built by default without NDEBUG set. I wonder if LIBCXXABI_ENABLE_ASSERTIONS should be unset by default in WASI SDK...

@sbc100
Copy link
Member

sbc100 commented Sep 8, 2021

It seems building without LIBCXXABI_ENABLE_ASSERTIONS would be the way to go to avoid including this code.

@sbc100
Copy link
Member

sbc100 commented Sep 8, 2021

Actually wouldn't you need both LIBCXXABI_ENABLE_ASSERTIONS and LIBCXXABI_BAREMETAL?

Its not clear to me exactly what LIBCXXABI_BAREMETAL is supposed to signify.. it seems like it could be related specifically to ARM (in which case maybe we wouldn't want to use it)?

@surma
Copy link
Author

surma commented Sep 8, 2021

Yeah, for this specific issue, you need to both disable assertions and enable baremetal. I also don’t quite understand what baremetal entails exactly, but I feel like disabling assertions in general would be a good default to set in WASI SDK.

Do you think it’s worth/possible to add new flag to libcxxabi upstream to disable any from of stdout/stderr usage?

@sbc100
Copy link
Member

sbc100 commented Sep 8, 2021

These message and assertions can be very useful to developers, so removing them by default sounds wrong. It sounds like we might need two different build configuration since I imagine most folks would be sad not have these messages present (at least in their debug builds).

@surma
Copy link
Author

surma commented Sep 8, 2021

To be clear: Disabling assertions by default wouldn’t remove these error message. For that, developers would also have to opt in to baremetal.

I agree that we shouldn’t disable these messages by default, but I am suggesting adding a specific new flag to opt out of logging that isn’t LIBCXXABI_BAREMETAL, as the implications of baremetal are pretty unclear (to me)

@sbc100
Copy link
Member

sbc100 commented Sep 8, 2021

I think its reasonable to be able to opt out of abort_message() printing and formatting explicitly.

What is more we might want to make abort_message into a macro in the this case so that the string constants themselves are also removed from the build.

There are already exists LIBCXXABI_SILENT_TERMINATE. I wonder if we could re-use that or create a new LIBCXXABI_NO_ABORT_MESSAGE ?

Then we could do modify abort_message.h be:

#ifdef LIBCXXABI_NO_ABORT_MESSAGE
#define abort_message(...) abort()
#else
extern "C" _LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN void                            
abort_message(const char *format, ...) __attribute__((format(printf, 1, 2)));  
#endif

@surma
Copy link
Author

surma commented Sep 8, 2021

LIBCXXABI_SILENT_TERMINATE seems like a perfect fit to me (an outsider). Gonna leave that up to y’all with more knowledge about libcxxabi :D Thanks for all the help tracking this down and looking into this!

@sbc100
Copy link
Member

sbc100 commented Sep 8, 2021

If that is acceptable upstream that is great. However it could be that folks want to silence just std::terminate without also silencing the other usages of abort_message.

@sbc100
Copy link
Member

sbc100 commented Sep 10, 2021

I went down the rabbit hole a little bit because I was confused as to why these table slots were being included at all given that abort_message is not present in the final binaryen.

To help debug I built with -O3 -g but without using any kind of LTO or wasm-opt pass that might do further DCE. Even in this configuration abort_message is not present in the output, even though it is the reason for pulling in __stdio_write (which it turn brings in __wasi_fd_write).

I turns out that abort_message and abort_message.o are included in the link but are then removed by the --gc-sections phase. However by the time --gc-sections runs it is too late to undo the inclusion __stderr_FILE and therefore references to addresses of __stdio_write, __stdio_seek, __stdio_close. This is due to the way musl decides if stdout is used in your program or not:

See https://github.com/WebAssembly/wasi-libc/blob/a78cd329aec717f149934d7362f57050c9401f60/libc-top-half/musl/src/stdio/stderr.c#L6-L20

FILE *volatile __stderr_used = &__stderr_FILE;

Files that reference __stderr_used always define a weak version that can be used in it place in the case that stderr.o is not linked in: https://github.com/WebAssembly/wasi-libc/blob/a78cd329aec717f149934d7362f57050c9401f60/libc-top-half/musl/src/stdio/fflush.c#L4-L6

static FILE *volatile dummy = 0;
weak_alias(dummy, __stdout_used);
weak_alias(dummy, __stderr_used);

The issue is a limitation of the powers of --gc-sections. By the time the sections are GC'd the linker has already decided that the strong version of __stderr_used from stderr.o is included in the link. @sunfishcode implemented some logic to make --gc-sections more powerful and undo to liveness of a given object file, but its not powerful enough to under to decision of include __stderr_used from stderr.o I believe. In order to do that the linker would have to go back and decide to choose the local/weak version after it had already selected the strong version.

I can think of a few ways to make this better:

Solution 1

Modify abort_message to not depend on stdio (this is what as been discussed thus far)

Solution 2

Split cxa_handlers.cpp into separate file. The whole reason abort_message was pulled in at all is because a function that uses it __terminate happens to be co-located in the same file as get_new_handler:
https://github.com/llvm/llvm-project/blob/70558d39f01beb87ab561bfaefeecb4d9534beed/libcxxabi/src/cxa_handlers.cpp#L106

This causes abort_message to be pulled in by the normal linking rules and then removed by --gc-sections.

Solution 3

Try to make --gc-sections even more smart so it can undo the inclusion of strong symbols and fall back to weak ones. This is is much harder than (1) or (2) (at least more work for me :)

I suggest we push for both (1) and (2) for now and consider (3) for future work.

@sbc100
Copy link
Member

sbc100 commented Sep 10, 2021

Actually solution (2) doesn't fix he issue on it own since there is another reference to abort_message in cxa_virtual.cpp(__cxa_pure_virtual)

@abrown
Copy link
Collaborator

abrown commented Aug 22, 2023

@sbc100, do you think this is still an issue?

@sbc100
Copy link
Member

sbc100 commented Aug 22, 2023

I guess it depends how much we really case about module size in these types of cases. IIUC such modules don't contains any calls to these functions, they just occupy table slots.

Perhaps we can close as won't fix for now and re-open if there is appetite to fix it? (is there any harm is just leaving it open as a feature request?)

@abrown
Copy link
Collaborator

abrown commented Aug 22, 2023

Yeah, I think leaving it open as a feature request is fine.

@EnricoSteez
Copy link

EnricoSteez commented Jan 4, 2024

@surma are you embedding the wasm code in javascript?
If so, I found a straightforward solution to this:

const imports = {
    wasi_snapshot_preview1: {
        proc_exit: function(rval) {
            return 0;
        },
        fd_close: function(rval) {
            return 0;
        },
        fd_seek: function(rval) {
            return 0;
        },
        fd_write: function(rval) {
            return 0;
        }
    }
}

And then:

let instance = new WebAssembly.Instance(wasmModule, imports);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants