summaryrefslogtreecommitdiffstats
path: root/tests/run-make/lto-linkage-used-attr/lib.rs
blob: 0a92ea9cd226b2c8aeedc3f4b72561863bc822bb (plain)
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);
}