Skip to content

Commit 6783e26

Browse files
committed
add rmake test for naked function visibility
1 parent 10169de commit 6783e26

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#![feature(naked_functions, asm_const)]
2+
#![crate_type = "dylib"]
3+
4+
use std::arch::asm;
5+
6+
pub trait TraitWithConst {
7+
const COUNT: u32;
8+
}
9+
10+
struct Test;
11+
12+
impl TraitWithConst for Test {
13+
const COUNT: u32 = 1;
14+
}
15+
16+
#[no_mangle]
17+
fn entry() {
18+
private_vanilla_rust_function_from_rust_dylib();
19+
private_naked_rust_function_from_rust_dylib();
20+
21+
public_vanilla_generic_function_from_rust_dylib::<Test>();
22+
public_naked_generic_function_from_rust_dylib::<Test>();
23+
}
24+
25+
extern "C" fn private_vanilla_rust_function_from_rust_dylib() -> u32 {
26+
42
27+
}
28+
29+
#[no_mangle]
30+
pub extern "C" fn public_vanilla_rust_function_from_rust_dylib() -> u32 {
31+
42
32+
}
33+
34+
pub extern "C" fn public_vanilla_generic_function_from_rust_dylib<T: TraitWithConst>() -> u32 {
35+
T::COUNT
36+
}
37+
38+
#[naked]
39+
extern "C" fn private_naked_rust_function_from_rust_dylib() -> u32 {
40+
unsafe { asm!("mov rax, 42", "ret", options(noreturn)) }
41+
}
42+
43+
#[naked]
44+
#[no_mangle]
45+
pub extern "C" fn public_naked_rust_function_from_rust_dylib() -> u32 {
46+
unsafe { asm!("mov rax, 42", "ret", options(noreturn)) }
47+
}
48+
49+
#[naked]
50+
pub extern "C" fn public_naked_generic_function_from_rust_dylib<T: TraitWithConst>() -> u32 {
51+
unsafe { asm!("mov rax, {}", "ret", const T::COUNT, options(noreturn)) }
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// @only-x86_64
2+
use run_make_support::{dynamic_lib_name, llvm_readobj, regex, rustc};
3+
4+
fn main() {
5+
let rdylib_name = dynamic_lib_name("a_rust_dylib");
6+
rustc().arg("-Zshare-generics=no").input("a_rust_dylib.rs").run();
7+
8+
// check vanilla symbols
9+
not_dynamic_symbol(&rdylib_name, "private_vanilla_rust_function_from_rust_dylib");
10+
dynamic_symbol(&rdylib_name, "public_vanilla_rust_function_from_rust_dylib");
11+
not_dynamic_symbol(&rdylib_name, "public_vanilla_generic_function_from_rust_dylib");
12+
13+
// naked should mirror vanilla
14+
not_dynamic_symbol(&rdylib_name, "private_naked_rust_function_from_rust_dylib");
15+
dynamic_symbol(&rdylib_name, "public_naked_rust_function_from_rust_dylib");
16+
not_dynamic_symbol(&rdylib_name, "public_naked_generic_function_from_rust_dylib");
17+
18+
// share generics should expose the generic functions
19+
rustc().arg("-Zshare-generics=yes").input("a_rust_dylib.rs").run();
20+
dynamic_symbol(&rdylib_name, "public_vanilla_generic_function_from_rust_dylib");
21+
dynamic_symbol(&rdylib_name, "public_naked_generic_function_from_rust_dylib");
22+
}
23+
24+
#[track_caller]
25+
fn dynamic_symbol(path: &str, symbol_name: &str) {
26+
assert_eq!(find_dynamic_symbol(path, symbol_name), 1)
27+
}
28+
29+
#[track_caller]
30+
fn not_dynamic_symbol(path: &str, symbol_name: &str) {
31+
assert_eq!(find_dynamic_symbol(path, symbol_name), 0)
32+
}
33+
34+
fn find_dynamic_symbol(path: &str, symbol_name: &str) -> usize {
35+
let out = llvm_readobj().arg("--dyn-symbols").input(path).run().stdout_utf8();
36+
out.lines().filter(|&line| !line.contains("__imp_") && line.contains(symbol_name)).count()
37+
}

0 commit comments

Comments
 (0)