wasi-sdk
wasi-sdk copied to clipboard
Avoid stdlib printing to stdout/stderr?
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?
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.
@sbc100 Wondering if you have an idea on how to solve this? (Is Emscripten’s libc++ patched to handle this differently somehow?)
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?
_LIBCPP_NO_EXCEPTIONS should have been enabled in wasi-sdk's libcxx according to https://github.com/WebAssembly/wasi-sdk/blob/main/Makefile#L144.
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?
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).
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
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?
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).
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.
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.
Looks like LIBCXXABI_BAREMETAL may be pretty close to what we want already; would it make sense to enable that in wasi-sdk builds?
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...
It seems building without LIBCXXABI_ENABLE_ASSERTIONS would be the way to go to avoid including this code.
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)?
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?
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).
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)
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
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!
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.
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.
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)
@sbc100, do you think this is still an issue?
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?)
Yeah, I think leaving it open as a feature request is fine.
@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);