Skip to content

Rust functions exported to C are dead code eliminated by emscripten despite being exported #66026

Closed
@lopopolo

Description

@lopopolo
$ rustc --version --verbose
rustc 1.40.0-nightly (c23a7aa77 2019-10-19)
binary: rustc
commit-hash: c23a7aa778b0dfeffbf83b099bdf971242c1e1ac
commit-date: 2019-10-19
host: x86_64-apple-darwin
release: 1.40.0-nightly
LLVM version: 9.0
$ emcc --version
emcc (Emscripten gcc/clang-like replacement) 1.39.1 (commit 1b1f08f356d3f10d91e50c09dda6d44372ca908c)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

I am attempting to upgrade the toolchain of a Rust and C project to Rust nightly's support for the LLVM emscripten backend #63649.

The project has a crate that compiles a C static library. The C library depends on symbols that are exported from Rust code in the crate as no_mangle and pub unsafe extern "C".

The build preamble sets RUSTFLAGS to enable building Wasm with emcc and marks all of the Rust symbols as exported.

$ echo $RUSTFLAGS
-C link-arg=-s -C link-arg=WASM=1 -C link-arg=-s -C link-arg=ASSERTIONS=1 -C link-arg=-s -C link-arg=NO_EXIT_RUNTIME=1 -C link-arg=-s -C link-arg=ALLOW_MEMORY_GROWTH=1 -C link-arg=-s -C link-arg=TOTAL_MEMORY=67108864 -C link-arg=-s -C link-arg=TOTAL_STACK=33554432 -C link-arg=-s -C link-arg=ENVIRONMENT=web -C link-arg=-s -C link-arg=EXPORTED_FUNCTIONS=["_artichoke_value_to_ary","_artichoke_ary_new","_artichoke_ary_new_capa","_artichoke_ary_new_from_values","_artichoke_ary_splat","_artichoke_ary_clone","_artichoke_ary_ref","_artichoke_ary_pop","_artichoke_ary_shift","_artichoke_ary_unshift","_artichoke_ary_len","_artichoke_ary_concat","_artichoke_ary_push","_artichoke_ary_set","_artichoke_ary_check","_artichoke_gc_mark_ary","_artichoke_gc_mark_ary_size","_mrb_sys_value_is_nil","_mrb_sys_value_is_false","_mrb_sys_value_is_true","_mrb_sys_range_excl","_mrb_sys_obj_frozen","_mrb_sys_fixnum_to_cint","_mrb_sys_float_to_cdouble","_mrb_sys_cptr_ptr","_mrb_sys_basic_ptr","_mrb_sys_obj_ptr","_mrb_sys_proc_ptr","_mrb_sys_class_ptr","_mrb_sys_class_to_rclass","_mrb_sys_class_of_value","_mrb_sys_nil_value","_mrb_sys_false_value","_mrb_sys_true_value","_mrb_sys_fixnum_value","_mrb_sys_float_value","_mrb_sys_cptr_value","_mrb_sys_obj_value","_mrb_sys_class_value","_mrb_sys_module_value","_mrb_sys_data_value","_mrb_sys_proc_value","_mrb_sys_symbol_name","_mrb_sys_new_symbol","_mrb_sys_set_instance_tt","_mrb_sys_data_init","_mrb_sys_raise","_mrb_sys_raise_current_exception","_mrb_sys_value_debug_str","_mrb_sys_ary_len","_mrb_sys_gc_arena_save","_mrb_sys_gc_arena_restore","_mrb_sys_gc_disable","_mrb_sys_gc_enable","_mrb_sys_value_is_dead","_mrb_sys_gc_live_objects","_mrb_sys_safe_gc_mark","_main","_malloc","_artichoke_web_repl_init","_artichoke_string_new","_artichoke_string_free","_artichoke_string_getlen","_artichoke_string_getch","_artichoke_string_putch","_artichoke_eval"] -C link-arg=-s -C link-arg=EXTRA_EXPORTED_RUNTIME_METHODS=["ccall","cwrap"]

The C static library has a macro for injecting an extern like modifier. The build.rs defines this macro to be __attribute__((used)) to match the EMSCRIPTEN_KEEPALIVE macro.

This code compiles and links, but when the application attempts to call a Rust exported symbol from C, Chrome raises a runtime error saying the function is unreachable.

VM5097:10526 Uncaught RuntimeError: unreachable
    at unreachable:artichoke_ary_push (wasm-function[50]:0x58b7)
    at hash_vals_i (wasm-function[7079]:0x32fba8)
    at ht_foreach (wasm-function[7039]:0x32a4a0)
    at mrb_hash_values (wasm-function[7078]:0x32faa5)
    at dynCall_viii (wasm-function[11266]:0x48ac54)
    at Module.dynCall_viii (eval at module.exports (webpack:///../node_modules/script-loader/addScript.js?), <anonymous>:10366:40)
    at invoke_viii (eval at module.exports (webpack:///../node_modules/script-loader/addScript.js?), <anonymous>:10523:5)
    at mrb_vm_exec (wasm-function[6396]:0x29d490)
    at mrb_vm_run (wasm-function[6386]:0x25f3b4)
    at mrb_top_run (wasm-function[6412]:0x2a84bc)

This function is explicitly exported and linking succeeds.

I'm not sure what is going on here. Any ideas?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions