| #![crate_type = "rlib"] |
| #![crate_type = "cdylib"] |
| |
| #[macro_export] |
| macro_rules! asm_func { |
| ($name:expr, $body:expr $(, $($args:tt)*)?) => { |
| core::arch::global_asm!( |
| concat!( |
| ".p2align 4\n", |
| ".hidden ", $name, "\n", |
| ".global ", $name, "\n", |
| ".type ", $name, ",@function\n", |
| $name, ":\n", |
| $body, |
| ".size ", $name, ",.-", $name, |
| ) |
| $(, $($args)*)? |
| ); |
| }; |
| } |
| |
| macro_rules! libcall_trampoline { |
| ($libcall:ident ; $libcall_impl:ident) => { |
| asm_func!( |
| stringify!($libcall), |
| concat!( |
| " |
| .cfi_startproc simple |
| .cfi_def_cfa_offset 0 |
| jmp {} |
| .cfi_endproc |
| ", |
| ), |
| sym $libcall_impl |
| ); |
| }; |
| } |
| |
| pub mod trampolines { |
| extern "C" { |
| pub fn table_fill_funcref(); |
| pub fn table_fill_externref(); |
| } |
| |
| unsafe extern "C" fn impl_table_fill_funcref() {} |
| unsafe extern "C" fn impl_table_fill_externref() {} |
| |
| libcall_trampoline!(table_fill_funcref ; impl_table_fill_funcref); |
| libcall_trampoline!(table_fill_externref ; impl_table_fill_externref); |
| } |