Skip to content

Commit 589ebb8

Browse files
committed
make naked functions always have external linkage *in LLVM*. If we do it earlier, then some other logic causes invalid visibility for the item (exporting when it shouldn't).
1 parent 49a297a commit 589ebb8

File tree

2 files changed

+2
-10
lines changed

2 files changed

+2
-10
lines changed

compiler/rustc_codegen_llvm/src/mono_item.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use rustc_codegen_ssa::traits::*;
22
use rustc_hir::def::DefKind;
33
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
44
use rustc_middle::bug;
5-
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
65
use rustc_middle::mir::mono::{Linkage, Visibility};
76
use rustc_middle::ty::layout::{FnAbiOf, HasTypingEnv, LayoutOf};
87
use rustc_middle::ty::{self, Instance, TypeVisitableExt};
@@ -60,14 +59,7 @@ impl<'tcx> PreDefineCodegenMethods<'tcx> for CodegenCx<'_, 'tcx> {
6059
let fn_abi = self.fn_abi_of_instance(instance, ty::List::empty());
6160
let lldecl = self.declare_fn(symbol_name, fn_abi, Some(instance));
6261
let attrs = self.tcx.codegen_fn_attrs(instance.def_id());
63-
let llvm_linkage =
64-
if attrs.flags.contains(CodegenFnAttrFlags::NAKED) && linkage == Linkage::Internal {
65-
// this is effectively an extern fn, and must have external linkage
66-
llvm::Linkage::ExternalLinkage
67-
} else {
68-
base::linkage_to_llvm(linkage)
69-
};
70-
llvm::set_linkage(lldecl, llvm_linkage);
62+
llvm::set_linkage(lldecl, base::linkage_to_llvm(linkage));
7163
base::set_link_section(lldecl, attrs);
7264
if (linkage == Linkage::LinkOnceODR || linkage == Linkage::WeakODR)
7365
&& self.tcx.sess.target.supports_comdat()

tests/ui/asm/naked-functions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ pub unsafe extern "C" fn invalid_asm_syntax(a: u32) -> u32 {
186186
// this previously ICE'd, see https://github.com/rust-lang/rust/issues/124375
187187
#[naked]
188188
pub unsafe extern "C" fn naked_with_args_and_return(a: isize, b: isize) -> isize {
189-
asm!("lea rax, [rdi + rsi]", "ret", options(noreturn));
189+
naked_asm!("lea rax, [rdi + rsi]", "ret");
190190
}
191191

192192
#[cfg(target_arch = "x86_64")]

0 commit comments

Comments
 (0)