rust-lang / rust-bindgen

Automatically generates Rust FFI bindings to C (and some C++) libraries.
https://rust-lang.github.io/rust-bindgen/
BSD 3-Clause "New" or "Revised" License
4.45k stars 694 forks source link

Support `import_name` and `import_module` attributes when targeting `wasm32` #2918

Open nasso opened 2 months ago

nasso commented 2 months ago

I know we already have wasm_import_module_name, but clang already has attributes for that! Supporting them directly would be much more convenient, I think?

See: https://clang.llvm.org/docs/AttributeReference.html#import-module

Another big motivation for this would be that it allows importing from different modules in the same header.

Input C/C++ Header

#ifdef __wasm__
__attribute__((visibility("default"), import_module("foo"), import_name("bar")))
#endif
void foo_bar();

Bindgen Invocation

$ bindgen input.h -- -target wasm32

Note that clang must be passed -target wasm32 to recognize the attributes.

Actual Results

/* automatically generated by rust-bindgen 0.70.1 */

extern "C" {
    pub fn foo_bar();
}

Expected Results

/* automatically generated by rust-bindgen 0.70.1 */

#[link(wasm_import_module = "foo")]
extern "C" {
    #[link_name = "bar"]
    pub fn foo_bar();
}
pvdrz commented 2 months ago

My first impression is that this shouldn't be too difficult to do as we already do some attribute detection for other things. Maybe the hardest part would be to set the attribute for the extern "C" block.