Skip to content

Commit b0e9259

Browse files
committed
Auto merge of #141024 - jieyouxu:revert-arm64ec, r=wesleywiser
Revert "Fix linking statics on Arm64EC #140176" This reverts PR #140176. Unfortunately, this will reopen #138541 (re-breaking the `arm64ec-pc-windows-msvc` target). Unfortunately, multiple people are [reporting linker warnings related to `__rust_no_alloc_shim_is_unstable`](#140176 (comment)) after this change in `x86_64-pc-windows-msvc` as well. The solution isn't quite clear yet, let's revert to avoid the linker warnings on the Tier 1 MSVC target for now[^timing], and try a reland with a determined solution for `__rust_no_alloc_shim_is_unstable`. Judging from [people reporting that they are observing this also when bootstrapping w/ stage0 rustc](#140176 (comment)), we may have to cut a new beta and then repoint stage0 against that newer beta? cc `@dpaoliello` `@wesleywiser` r? `@wesleywiser` (or compiler) [^timing]: Note that it's still RustWeek this week, so most team members are N/A.
2 parents a69bc17 + 734a5b1 commit b0e9259

File tree

11 files changed

+54
-201
lines changed

11 files changed

+54
-201
lines changed

compiler/rustc_codegen_llvm/src/consts.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,7 @@ impl<'ll> CodegenCx<'ll, '_> {
364364

365365
if !def_id.is_local() {
366366
let needs_dll_storage_attr = self.use_dll_storage_attrs
367-
// If the symbol is a foreign item, then don't automatically apply DLLImport, as
368-
// we'll rely on the #[link] attribute instead. BUT, if this is an internal symbol
369-
// then it may be generated by the compiler in some crate, so we do need to apply
370-
// DLLImport when linking with the MSVC linker.
371-
&& (!self.tcx.is_foreign_item(def_id)
372-
|| (self.sess().target.is_like_msvc && fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL)))
367+
&& !self.tcx.is_foreign_item(def_id)
373368
// Local definitions can never be imported, so we must not apply
374369
// the DLLImport annotation.
375370
&& !dso_local

compiler/rustc_codegen_ssa/src/back/linker.rs

+30-90
Original file line numberDiff line numberDiff line change
@@ -337,12 +337,7 @@ pub(crate) trait Linker {
337337
fn debuginfo(&mut self, strip: Strip, natvis_debugger_visualizers: &[PathBuf]);
338338
fn no_crt_objects(&mut self);
339339
fn no_default_libraries(&mut self);
340-
fn export_symbols(
341-
&mut self,
342-
tmpdir: &Path,
343-
crate_type: CrateType,
344-
symbols: &[(String, SymbolExportKind)],
345-
);
340+
fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType, symbols: &[String]);
346341
fn subsystem(&mut self, subsystem: &str);
347342
fn linker_plugin_lto(&mut self);
348343
fn add_eh_frame_header(&mut self) {}
@@ -775,12 +770,7 @@ impl<'a> Linker for GccLinker<'a> {
775770
}
776771
}
777772

778-
fn export_symbols(
779-
&mut self,
780-
tmpdir: &Path,
781-
crate_type: CrateType,
782-
symbols: &[(String, SymbolExportKind)],
783-
) {
773+
fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType, symbols: &[String]) {
784774
// Symbol visibility in object files typically takes care of this.
785775
if crate_type == CrateType::Executable {
786776
let should_export_executable_symbols =
@@ -809,7 +799,7 @@ impl<'a> Linker for GccLinker<'a> {
809799
// Write a plain, newline-separated list of symbols
810800
let res: io::Result<()> = try {
811801
let mut f = File::create_buffered(&path)?;
812-
for (sym, _) in symbols {
802+
for sym in symbols {
813803
debug!(" _{sym}");
814804
writeln!(f, "_{sym}")?;
815805
}
@@ -824,12 +814,11 @@ impl<'a> Linker for GccLinker<'a> {
824814
// .def file similar to MSVC one but without LIBRARY section
825815
// because LD doesn't like when it's empty
826816
writeln!(f, "EXPORTS")?;
827-
for (symbol, kind) in symbols {
828-
let kind_marker = if *kind == SymbolExportKind::Data { " DATA" } else { "" };
817+
for symbol in symbols {
829818
debug!(" _{symbol}");
830819
// Quote the name in case it's reserved by linker in some way
831820
// (this accounts for names with dots in particular).
832-
writeln!(f, " \"{symbol}\"{kind_marker}")?;
821+
writeln!(f, " \"{symbol}\"")?;
833822
}
834823
};
835824
if let Err(error) = res {
@@ -842,7 +831,7 @@ impl<'a> Linker for GccLinker<'a> {
842831
writeln!(f, "{{")?;
843832
if !symbols.is_empty() {
844833
writeln!(f, " global:")?;
845-
for (sym, _) in symbols {
834+
for sym in symbols {
846835
debug!(" {sym};");
847836
writeln!(f, " {sym};")?;
848837
}
@@ -1109,12 +1098,7 @@ impl<'a> Linker for MsvcLinker<'a> {
11091098
// crates. Upstream rlibs may be linked statically to this dynamic library,
11101099
// in which case they may continue to transitively be used and hence need
11111100
// their symbols exported.
1112-
fn export_symbols(
1113-
&mut self,
1114-
tmpdir: &Path,
1115-
crate_type: CrateType,
1116-
symbols: &[(String, SymbolExportKind)],
1117-
) {
1101+
fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType, symbols: &[String]) {
11181102
// Symbol visibility takes care of this typically
11191103
if crate_type == CrateType::Executable {
11201104
let should_export_executable_symbols =
@@ -1132,10 +1116,9 @@ impl<'a> Linker for MsvcLinker<'a> {
11321116
// straight to exports.
11331117
writeln!(f, "LIBRARY")?;
11341118
writeln!(f, "EXPORTS")?;
1135-
for (symbol, kind) in symbols {
1136-
let kind_marker = if *kind == SymbolExportKind::Data { " DATA" } else { "" };
1119+
for symbol in symbols {
11371120
debug!(" _{symbol}");
1138-
writeln!(f, " {symbol}{kind_marker}")?;
1121+
writeln!(f, " {symbol}")?;
11391122
}
11401123
};
11411124
if let Err(error) = res {
@@ -1276,19 +1259,14 @@ impl<'a> Linker for EmLinker<'a> {
12761259
self.cc_arg("-nodefaultlibs");
12771260
}
12781261

1279-
fn export_symbols(
1280-
&mut self,
1281-
_tmpdir: &Path,
1282-
_crate_type: CrateType,
1283-
symbols: &[(String, SymbolExportKind)],
1284-
) {
1262+
fn export_symbols(&mut self, _tmpdir: &Path, _crate_type: CrateType, symbols: &[String]) {
12851263
debug!("EXPORTED SYMBOLS:");
12861264

12871265
self.cc_arg("-s");
12881266

12891267
let mut arg = OsString::from("EXPORTED_FUNCTIONS=");
12901268
let encoded = serde_json::to_string(
1291-
&symbols.iter().map(|(sym, _)| "_".to_owned() + sym).collect::<Vec<_>>(),
1269+
&symbols.iter().map(|sym| "_".to_owned() + sym).collect::<Vec<_>>(),
12921270
)
12931271
.unwrap();
12941272
debug!("{encoded}");
@@ -1450,13 +1428,8 @@ impl<'a> Linker for WasmLd<'a> {
14501428

14511429
fn no_default_libraries(&mut self) {}
14521430

1453-
fn export_symbols(
1454-
&mut self,
1455-
_tmpdir: &Path,
1456-
_crate_type: CrateType,
1457-
symbols: &[(String, SymbolExportKind)],
1458-
) {
1459-
for (sym, _) in symbols {
1431+
fn export_symbols(&mut self, _tmpdir: &Path, _crate_type: CrateType, symbols: &[String]) {
1432+
for sym in symbols {
14601433
self.link_args(&["--export", sym]);
14611434
}
14621435

@@ -1590,7 +1563,7 @@ impl<'a> Linker for L4Bender<'a> {
15901563
self.cc_arg("-nostdlib");
15911564
}
15921565

1593-
fn export_symbols(&mut self, _: &Path, _: CrateType, _: &[(String, SymbolExportKind)]) {
1566+
fn export_symbols(&mut self, _: &Path, _: CrateType, _: &[String]) {
15941567
// ToDo, not implemented, copy from GCC
15951568
self.sess.dcx().emit_warn(errors::L4BenderExportingSymbolsUnimplemented);
15961569
}
@@ -1747,17 +1720,12 @@ impl<'a> Linker for AixLinker<'a> {
17471720

17481721
fn no_default_libraries(&mut self) {}
17491722

1750-
fn export_symbols(
1751-
&mut self,
1752-
tmpdir: &Path,
1753-
_crate_type: CrateType,
1754-
symbols: &[(String, SymbolExportKind)],
1755-
) {
1723+
fn export_symbols(&mut self, tmpdir: &Path, _crate_type: CrateType, symbols: &[String]) {
17561724
let path = tmpdir.join("list.exp");
17571725
let res: io::Result<()> = try {
17581726
let mut f = File::create_buffered(&path)?;
17591727
// FIXME: use llvm-nm to generate export list.
1760-
for (symbol, _) in symbols {
1728+
for symbol in symbols {
17611729
debug!(" _{symbol}");
17621730
writeln!(f, " {symbol}")?;
17631731
}
@@ -1801,12 +1769,9 @@ fn for_each_exported_symbols_include_dep<'tcx>(
18011769
}
18021770
}
18031771

1804-
pub(crate) fn exported_symbols(
1805-
tcx: TyCtxt<'_>,
1806-
crate_type: CrateType,
1807-
) -> Vec<(String, SymbolExportKind)> {
1772+
pub(crate) fn exported_symbols(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec<String> {
18081773
if let Some(ref exports) = tcx.sess.target.override_export_symbols {
1809-
return exports.iter().map(|name| (name.to_string(), SymbolExportKind::Text)).collect();
1774+
return exports.iter().map(ToString::to_string).collect();
18101775
}
18111776

18121777
if let CrateType::ProcMacro = crate_type {
@@ -1816,29 +1781,25 @@ pub(crate) fn exported_symbols(
18161781
}
18171782
}
18181783

1819-
fn exported_symbols_for_non_proc_macro(
1820-
tcx: TyCtxt<'_>,
1821-
crate_type: CrateType,
1822-
) -> Vec<(String, SymbolExportKind)> {
1784+
fn exported_symbols_for_non_proc_macro(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec<String> {
18231785
let mut symbols = Vec::new();
18241786
let export_threshold = symbol_export::crates_export_threshold(&[crate_type]);
18251787
for_each_exported_symbols_include_dep(tcx, crate_type, |symbol, info, cnum| {
18261788
// Do not export mangled symbols from cdylibs and don't attempt to export compiler-builtins
18271789
// from any cdylib. The latter doesn't work anyway as we use hidden visibility for
18281790
// compiler-builtins. Most linkers silently ignore it, but ld64 gives a warning.
18291791
if info.level.is_below_threshold(export_threshold) && !tcx.is_compiler_builtins(cnum) {
1830-
symbols.push((
1831-
symbol_export::exporting_symbol_name_for_instance_in_crate(tcx, symbol, cnum),
1832-
info.kind,
1792+
symbols.push(symbol_export::exporting_symbol_name_for_instance_in_crate(
1793+
tcx, symbol, cnum,
18331794
));
1834-
symbol_export::extend_exported_symbols(&mut symbols, tcx, symbol, info, cnum);
1795+
symbol_export::extend_exported_symbols(&mut symbols, tcx, symbol, cnum);
18351796
}
18361797
});
18371798

18381799
symbols
18391800
}
18401801

1841-
fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec<(String, SymbolExportKind)> {
1802+
fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec<String> {
18421803
// `exported_symbols` will be empty when !should_codegen.
18431804
if !tcx.sess.opts.output_types.should_codegen() {
18441805
return Vec::new();
@@ -1848,10 +1809,7 @@ fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec<(String, Symbol
18481809
let proc_macro_decls_name = tcx.sess.generate_proc_macro_decls_symbol(stable_crate_id);
18491810
let metadata_symbol_name = exported_symbols::metadata_symbol_name(tcx);
18501811

1851-
vec![
1852-
(proc_macro_decls_name, SymbolExportKind::Text),
1853-
(metadata_symbol_name, SymbolExportKind::Text),
1854-
]
1812+
vec![proc_macro_decls_name, metadata_symbol_name]
18551813
}
18561814

18571815
pub(crate) fn linked_symbols(
@@ -1873,9 +1831,7 @@ pub(crate) fn linked_symbols(
18731831
|| info.used
18741832
{
18751833
symbols.push((
1876-
symbol_export::linking_symbol_name_for_instance_in_crate(
1877-
tcx, symbol, info.kind, cnum,
1878-
),
1834+
symbol_export::linking_symbol_name_for_instance_in_crate(tcx, symbol, cnum),
18791835
info.kind,
18801836
));
18811837
}
@@ -1950,13 +1906,7 @@ impl<'a> Linker for PtxLinker<'a> {
19501906

19511907
fn ehcont_guard(&mut self) {}
19521908

1953-
fn export_symbols(
1954-
&mut self,
1955-
_tmpdir: &Path,
1956-
_crate_type: CrateType,
1957-
_symbols: &[(String, SymbolExportKind)],
1958-
) {
1959-
}
1909+
fn export_symbols(&mut self, _tmpdir: &Path, _crate_type: CrateType, _symbols: &[String]) {}
19601910

19611911
fn subsystem(&mut self, _subsystem: &str) {}
19621912

@@ -2025,15 +1975,10 @@ impl<'a> Linker for LlbcLinker<'a> {
20251975

20261976
fn ehcont_guard(&mut self) {}
20271977

2028-
fn export_symbols(
2029-
&mut self,
2030-
_tmpdir: &Path,
2031-
_crate_type: CrateType,
2032-
symbols: &[(String, SymbolExportKind)],
2033-
) {
1978+
fn export_symbols(&mut self, _tmpdir: &Path, _crate_type: CrateType, symbols: &[String]) {
20341979
match _crate_type {
20351980
CrateType::Cdylib => {
2036-
for (sym, _) in symbols {
1981+
for sym in symbols {
20371982
self.link_args(&["--export-symbol", sym]);
20381983
}
20391984
}
@@ -2107,16 +2052,11 @@ impl<'a> Linker for BpfLinker<'a> {
21072052

21082053
fn ehcont_guard(&mut self) {}
21092054

2110-
fn export_symbols(
2111-
&mut self,
2112-
tmpdir: &Path,
2113-
_crate_type: CrateType,
2114-
symbols: &[(String, SymbolExportKind)],
2115-
) {
2055+
fn export_symbols(&mut self, tmpdir: &Path, _crate_type: CrateType, symbols: &[String]) {
21162056
let path = tmpdir.join("symbols");
21172057
let res: io::Result<()> = try {
21182058
let mut f = File::create_buffered(&path)?;
2119-
for (sym, _) in symbols {
2059+
for sym in symbols {
21202060
writeln!(f, "{sym}")?;
21212061
}
21222062
};

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,6 @@ fn calling_convention_for_symbol<'tcx>(
692692
pub(crate) fn linking_symbol_name_for_instance_in_crate<'tcx>(
693693
tcx: TyCtxt<'tcx>,
694694
symbol: ExportedSymbol<'tcx>,
695-
export_kind: SymbolExportKind,
696695
instantiating_crate: CrateNum,
697696
) -> String {
698697
let mut undecorated = symbol_name_for_instance_in_crate(tcx, symbol, instantiating_crate);
@@ -713,9 +712,8 @@ pub(crate) fn linking_symbol_name_for_instance_in_crate<'tcx>(
713712
let prefix = match &target.arch[..] {
714713
"x86" => Some('_'),
715714
"x86_64" => None,
716-
// Only functions are decorated for arm64ec.
717-
"arm64ec" if export_kind == SymbolExportKind::Text => Some('#'),
718-
// Only x86/64 and arm64ec use symbol decorations.
715+
"arm64ec" => Some('#'),
716+
// Only x86/64 use symbol decorations.
719717
_ => return undecorated,
720718
};
721719

@@ -755,10 +753,9 @@ pub(crate) fn exporting_symbol_name_for_instance_in_crate<'tcx>(
755753
/// Add it to the symbols list for all kernel functions, so that it is exported in the linked
756754
/// object.
757755
pub(crate) fn extend_exported_symbols<'tcx>(
758-
symbols: &mut Vec<(String, SymbolExportKind)>,
756+
symbols: &mut Vec<String>,
759757
tcx: TyCtxt<'tcx>,
760758
symbol: ExportedSymbol<'tcx>,
761-
info: SymbolExportInfo,
762759
instantiating_crate: CrateNum,
763760
) {
764761
let (conv, _) = calling_convention_for_symbol(tcx, symbol);
@@ -770,7 +767,7 @@ pub(crate) fn extend_exported_symbols<'tcx>(
770767
let undecorated = symbol_name_for_instance_in_crate(tcx, symbol, instantiating_crate);
771768

772769
// Add the symbol for the kernel descriptor (with .kd suffix)
773-
symbols.push((format!("{undecorated}.kd"), info.kind));
770+
symbols.push(format!("{undecorated}.kd"));
774771
}
775772

776773
fn maybe_emutls_symbol_name<'tcx>(

0 commit comments

Comments
 (0)