Skip to content

Commit 3c3bf76

Browse files
committed
Declare main as visibility hidden on targets that default to hidden.
On targets with `default_hidden_visibility` set, which is currrently just WebAssembly, declare the generated `main` function with visibility hidden. This makes it consistent with clang's WebAssembly target, where `main` is just a user function that gets the same visibility as any other user function, which is hidden on WebAssembly unless explicitly overridden. This will help simplify use cases which in the future may want to automatically wasm-export all visibility-"default" symbols. `main` isn't intended to be wasm-exported, and marking it hidden prevents it from being wasm-exported in that scenario.
1 parent 09ae784 commit 3c3bf76

File tree

5 files changed

+46
-9
lines changed

5 files changed

+46
-9
lines changed

Diff for: compiler/rustc_codegen_llvm/src/builder.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -1458,7 +1458,12 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
14581458
} else {
14591459
format!("llvm.{}.sat.i{}.f{}", instr, int_width, float_width)
14601460
};
1461-
let f = self.declare_cfn(&name, llvm::UnnamedAddr::No, self.type_func(&[src_ty], dest_ty));
1461+
let f = self.declare_cfn(
1462+
&name,
1463+
llvm::UnnamedAddr::No,
1464+
llvm::Visibility::Default,
1465+
self.type_func(&[src_ty], dest_ty),
1466+
);
14621467
self.call(self.type_func(&[src_ty], dest_ty), f, &[val], None)
14631468
}
14641469

Diff for: compiler/rustc_codegen_llvm/src/context.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,12 @@ impl<'ll, 'tcx> MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> {
528528
llfn
529529
} else {
530530
let fty = self.type_variadic_func(&[], self.type_i32());
531-
let llfn = self.declare_cfn(name, llvm::UnnamedAddr::Global, fty);
531+
let llfn = self.declare_cfn(
532+
name,
533+
llvm::UnnamedAddr::Global,
534+
llvm::Visibility::Default,
535+
fty,
536+
);
532537
let target_cpu = attributes::target_cpu_attr(self);
533538
attributes::apply_to_llfn(llfn, llvm::AttributePlace::Function, &[target_cpu]);
534539
llfn
@@ -585,7 +590,13 @@ impl<'ll, 'tcx> MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> {
585590

586591
fn declare_c_main(&self, fn_type: Self::Type) -> Option<Self::Function> {
587592
if self.get_declared_value("main").is_none() {
588-
Some(self.declare_cfn("main", llvm::UnnamedAddr::Global, fn_type))
593+
let visibility = if self.sess().target.default_hidden_visibility {
594+
llvm::Visibility::Hidden
595+
} else {
596+
llvm::Visibility::Default
597+
};
598+
599+
Some(self.declare_cfn("main", llvm::UnnamedAddr::Global, visibility, fn_type))
589600
} else {
590601
// If the symbol already exists, it is an error: for example, the user wrote
591602
// #[no_mangle] extern "C" fn main(..) {..}
@@ -615,7 +626,7 @@ impl<'ll> CodegenCx<'ll, '_> {
615626
} else {
616627
self.type_variadic_func(&[], ret)
617628
};
618-
let f = self.declare_cfn(name, llvm::UnnamedAddr::No, fn_ty);
629+
let f = self.declare_cfn(name, llvm::UnnamedAddr::No, llvm::Visibility::Default, fn_ty);
619630
self.intrinsics.borrow_mut().insert(name, (fn_ty, f));
620631
(fn_ty, f)
621632
}

Diff for: compiler/rustc_codegen_llvm/src/declare.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ fn declare_raw_fn<'ll>(
3232
name: &str,
3333
callconv: llvm::CallConv,
3434
unnamed: llvm::UnnamedAddr,
35+
visibility: llvm::Visibility,
3536
ty: &'ll Type,
3637
) -> &'ll Value {
3738
debug!("declare_raw_fn(name={:?}, ty={:?})", name, ty);
@@ -41,6 +42,7 @@ fn declare_raw_fn<'ll>(
4142

4243
llvm::SetFunctionCallConv(llfn, callconv);
4344
llvm::SetUnnamedAddress(llfn, unnamed);
45+
llvm::SetVisibility(llfn, visibility);
4446

4547
let mut attrs = SmallVec::<[_; 4]>::new();
4648

@@ -76,9 +78,10 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
7678
&self,
7779
name: &str,
7880
unnamed: llvm::UnnamedAddr,
81+
visibility: llvm::Visibility,
7982
fn_type: &'ll Type,
8083
) -> &'ll Value {
81-
declare_raw_fn(self, name, llvm::CCallConv, unnamed, fn_type)
84+
declare_raw_fn(self, name, llvm::CCallConv, unnamed, visibility, fn_type)
8285
}
8386

8487
/// Declare a Rust function.
@@ -95,6 +98,7 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
9598
name,
9699
fn_abi.llvm_cconv(),
97100
llvm::UnnamedAddr::Global,
101+
llvm::Visibility::Default,
98102
fn_abi.llvm_type(self),
99103
);
100104
fn_abi.apply_attrs_llfn(self, llfn);

Diff for: compiler/rustc_codegen_llvm/src/intrinsic.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
12161216
_ => return_error!("unrecognized intrinsic `{}`", name),
12171217
};
12181218
let llvm_name = &format!("llvm.{0}.v{1}{2}", intr_name, in_len, elem_ty_str);
1219-
let f = bx.declare_cfn(llvm_name, llvm::UnnamedAddr::No, fn_ty);
1219+
let f = bx.declare_cfn(llvm_name, llvm::UnnamedAddr::No, llvm::Visibility::Default, fn_ty);
12201220
let c =
12211221
bx.call(fn_ty, f, &args.iter().map(|arg| arg.immediate()).collect::<Vec<_>>(), None);
12221222
Ok(c)
@@ -1416,7 +1416,12 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
14161416
&[llvm_pointer_vec_ty, alignment_ty, mask_ty, llvm_elem_vec_ty],
14171417
llvm_elem_vec_ty,
14181418
);
1419-
let f = bx.declare_cfn(&llvm_intrinsic, llvm::UnnamedAddr::No, fn_ty);
1419+
let f = bx.declare_cfn(
1420+
&llvm_intrinsic,
1421+
llvm::UnnamedAddr::No,
1422+
llvm::Visibility::Default,
1423+
fn_ty,
1424+
);
14201425
let v =
14211426
bx.call(fn_ty, f, &[args[1].immediate(), alignment, mask, args[0].immediate()], None);
14221427
return Ok(v);
@@ -1542,7 +1547,12 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
15421547
format!("llvm.masked.scatter.{}.{}", llvm_elem_vec_str, llvm_pointer_vec_str);
15431548
let fn_ty =
15441549
bx.type_func(&[llvm_elem_vec_ty, llvm_pointer_vec_ty, alignment_ty, mask_ty], ret_t);
1545-
let f = bx.declare_cfn(&llvm_intrinsic, llvm::UnnamedAddr::No, fn_ty);
1550+
let f = bx.declare_cfn(
1551+
&llvm_intrinsic,
1552+
llvm::UnnamedAddr::No,
1553+
llvm::Visibility::Default,
1554+
fn_ty,
1555+
);
15461556
let v =
15471557
bx.call(fn_ty, f, &[args[0].immediate(), args[1].immediate(), alignment, mask], None);
15481558
return Ok(v);
@@ -1991,7 +2001,8 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
19912001
let vec_ty = bx.cx.type_vector(elem_ty, in_len as u64);
19922002

19932003
let fn_ty = bx.type_func(&[vec_ty, vec_ty], vec_ty);
1994-
let f = bx.declare_cfn(llvm_intrinsic, llvm::UnnamedAddr::No, fn_ty);
2004+
let f =
2005+
bx.declare_cfn(llvm_intrinsic, llvm::UnnamedAddr::No, llvm::Visibility::Default, fn_ty);
19952006
let v = bx.call(fn_ty, f, &[lhs, rhs], None);
19962007
return Ok(v);
19972008
}

Diff for: compiler/rustc_codegen_llvm/src/llvm/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@ pub fn SetUnnamedAddress(global: &Value, unnamed: UnnamedAddr) {
172172
}
173173
}
174174

175+
pub fn SetVisibility(global: &Value, visibility: Visibility) {
176+
unsafe {
177+
LLVMRustSetVisibility(global, visibility);
178+
}
179+
}
180+
175181
pub fn set_thread_local_mode(global: &Value, mode: ThreadLocalMode) {
176182
unsafe {
177183
LLVMSetThreadLocalMode(global, mode);

0 commit comments

Comments
 (0)