1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#![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);
}
|