Skip to content

Commit 94b51d1

Browse files
committed
Make all compiler-builtins symbols hidden
This matches cg_llvm Fixes #1152
1 parent f3e8f6d commit 94b51d1

File tree

7 files changed

+59
-17
lines changed

7 files changed

+59
-17
lines changed

src/base.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@ use rustc_target::abi::call::FnAbi;
88

99
use crate::prelude::*;
1010

11-
pub(crate) fn codegen_fn<'tcx>(
12-
cx: &mut crate::CodegenCx<'_, 'tcx>,
13-
instance: Instance<'tcx>,
14-
linkage: Linkage,
15-
) {
11+
pub(crate) fn codegen_fn<'tcx>(cx: &mut crate::CodegenCx<'_, 'tcx>, instance: Instance<'tcx>) {
1612
let tcx = cx.tcx;
1713

1814
let _inst_guard =
@@ -24,7 +20,7 @@ pub(crate) fn codegen_fn<'tcx>(
2420
// Declare function
2521
let name = tcx.symbol_name(instance).name.to_string();
2622
let sig = get_function_sig(tcx, cx.module.isa().triple(), instance);
27-
let func_id = cx.module.declare_function(&name, linkage, &sig).unwrap();
23+
let func_id = cx.module.declare_function(&name, Linkage::Local, &sig).unwrap();
2824

2925
cx.cached_context.clear();
3026

src/compiler_builtins.rs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
macro builtin_functions($register:ident; $(fn $name:ident($($arg_name:ident: $arg_ty:ty),*) -> $ret_ty:ty;)*) {
2+
#[cfg(feature = "jit")]
3+
#[allow(improper_ctypes)]
4+
extern "C" {
5+
$(fn $name($($arg_name: $arg_ty),*) -> $ret_ty;)*
6+
}
7+
8+
#[cfg(feature = "jit")]
9+
pub(crate) fn $register(builder: &mut cranelift_jit::JITBuilder) {
10+
for &(name, val) in &[$((stringify!($name), $name as *const u8)),*] {
11+
builder.symbol(name, val);
12+
}
13+
}
14+
}
15+
16+
builtin_functions! {
17+
register_functions_for_jit;
18+
19+
// integers
20+
fn __multi3(a: i128, b: i128) -> i128;
21+
fn __udivti3(n: u128, d: u128) -> u128;
22+
fn __divti3(n: i128, d: i128) -> i128;
23+
fn __umodti3(n: u128, d: u128) -> u128;
24+
fn __modti3(n: i128, d: i128) -> i128;
25+
fn __rust_u128_addo(a: u128, b: u128) -> (u128, bool);
26+
fn __rust_i128_addo(a: i128, b: i128) -> (i128, bool);
27+
fn __rust_u128_subo(a: u128, b: u128) -> (u128, bool);
28+
fn __rust_i128_subo(a: i128, b: i128) -> (i128, bool);
29+
fn __rust_u128_mulo(a: u128, b: u128) -> (u128, bool);
30+
fn __rust_i128_mulo(a: i128, b: i128) -> (i128, bool);
31+
32+
// floats
33+
fn __floattisf(i: i128) -> f32;
34+
fn __floattidf(i: i128) -> f64;
35+
fn __floatuntisf(i: u128) -> f32;
36+
fn __floatuntidf(i: u128) -> f64;
37+
fn __fixsfti(f: f32) -> i128;
38+
fn __fixdfti(f: f64) -> i128;
39+
fn __fixunssfti(f: f32) -> u128;
40+
fn __fixunsdfti(f: f64) -> u128;
41+
}

src/driver/aot.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,10 @@ fn module_codegen(
119119
tcx.sess.opts.debuginfo != DebugInfo::None,
120120
);
121121
super::predefine_mono_items(&mut cx, &mono_items);
122-
for (mono_item, (linkage, visibility)) in mono_items {
123-
let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility);
122+
for (mono_item, _) in mono_items {
124123
match mono_item {
125124
MonoItem::Fn(inst) => {
126-
cx.tcx.sess.time("codegen fn", || crate::base::codegen_fn(&mut cx, inst, linkage));
125+
cx.tcx.sess.time("codegen fn", || crate::base::codegen_fn(&mut cx, inst));
127126
}
128127
MonoItem::Static(def_id) => {
129128
crate::constant::codegen_static(&mut cx.constants_cx, def_id)

src/driver/jit.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>, backend_config: BackendConfig) -> ! {
3030
let mut jit_builder =
3131
JITBuilder::with_isa(crate::build_isa(tcx.sess), cranelift_module::default_libcall_names());
3232
jit_builder.hotswap(matches!(backend_config.codegen_mode, CodegenMode::JitLazy));
33+
crate::compiler_builtins::register_functions_for_jit(&mut jit_builder);
3334
jit_builder.symbols(imported_symbols);
3435
let mut jit_module = JITModule::new(jit_builder);
3536
assert_eq!(pointer_ty(tcx), jit_module.target_config().pointer_type());
@@ -47,15 +48,12 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>, backend_config: BackendConfig) -> ! {
4748

4849
super::time(tcx, "codegen mono items", || {
4950
super::predefine_mono_items(&mut cx, &mono_items);
50-
for (mono_item, (linkage, visibility)) in mono_items {
51-
let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility);
51+
for (mono_item, _) in mono_items {
5252
match mono_item {
5353
MonoItem::Fn(inst) => match backend_config.codegen_mode {
5454
CodegenMode::Aot => unreachable!(),
5555
CodegenMode::Jit => {
56-
cx.tcx
57-
.sess
58-
.time("codegen fn", || crate::base::codegen_fn(&mut cx, inst, linkage));
56+
cx.tcx.sess.time("codegen fn", || crate::base::codegen_fn(&mut cx, inst));
5957
}
6058
CodegenMode::JitLazy => codegen_shim(&mut cx, inst),
6159
},
@@ -175,8 +173,7 @@ extern "C" fn __clif_jit_fn(instance_ptr: *const Instance<'static>) -> *const u8
175173
jit_module.prepare_for_function_redefine(func_id).unwrap();
176174

177175
let mut cx = crate::CodegenCx::new(tcx, backend_config, jit_module, false);
178-
tcx.sess
179-
.time("codegen fn", || crate::base::codegen_fn(&mut cx, instance, Linkage::Export));
176+
tcx.sess.time("codegen fn", || crate::base::codegen_fn(&mut cx, instance));
180177

181178
let (global_asm, _debug_context, unwind_context) = cx.finalize();
182179
assert!(global_asm.is_empty());

src/driver/mod.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,19 @@ fn predefine_mono_items<'tcx>(
4444
mono_items: &[(MonoItem<'tcx>, (RLinkage, Visibility))],
4545
) {
4646
cx.tcx.sess.time("predefine functions", || {
47+
let is_compiler_builtins = cx.tcx.is_compiler_builtins(LOCAL_CRATE);
4748
for &(mono_item, (linkage, visibility)) in mono_items {
4849
match mono_item {
4950
MonoItem::Fn(instance) => {
5051
let name = cx.tcx.symbol_name(instance).name.to_string();
5152
let _inst_guard = crate::PrintOnPanic(|| format!("{:?} {}", instance, name));
5253
let sig = get_function_sig(cx.tcx, cx.module.isa().triple(), instance);
53-
let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility);
54+
let linkage = crate::linkage::get_clif_linkage(
55+
mono_item,
56+
linkage,
57+
visibility,
58+
is_compiler_builtins,
59+
);
5460
cx.module.declare_function(&name, linkage, &sig).unwrap();
5561
}
5662
MonoItem::Static(_) | MonoItem::GlobalAsm(_) => {}

src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ mod base;
4848
mod cast;
4949
mod codegen_i128;
5050
mod common;
51+
mod compiler_builtins;
5152
mod constant;
5253
mod debuginfo;
5354
mod discriminant;

src/linkage.rs

+2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ pub(crate) fn get_clif_linkage(
66
mono_item: MonoItem<'_>,
77
linkage: RLinkage,
88
visibility: Visibility,
9+
is_compiler_builtins: bool,
910
) -> Linkage {
1011
match (linkage, visibility) {
12+
(RLinkage::External, Visibility::Default) if is_compiler_builtins => Linkage::Hidden,
1113
(RLinkage::External, Visibility::Default) => Linkage::Export,
1214
(RLinkage::Internal, Visibility::Default) => Linkage::Local,
1315
(RLinkage::External, Visibility::Hidden) => Linkage::Hidden,

0 commit comments

Comments
 (0)