Revert "Fix linking statics on Arm64EC #140176" · Amanieu/rust@734a5b1 (original) (raw)

`@@ -337,12 +337,7 @@ pub(crate) trait Linker {

`

337

337

`fn debuginfo(&mut self, strip: Strip, natvis_debugger_visualizers: &[PathBuf]);

`

338

338

`fn no_crt_objects(&mut self);

`

339

339

`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]);

`

346

341

`fn subsystem(&mut self, subsystem: &str);

`

347

342

`fn linker_plugin_lto(&mut self);

`

348

343

`fn add_eh_frame_header(&mut self) {}

`

`@@ -775,12 +770,7 @@ impl<'a> Linker for GccLinker<'a> {

`

775

770

`}

`

776

771

`}

`

777

772

``

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]) {

`

784

774

`// Symbol visibility in object files typically takes care of this.

`

785

775

`if crate_type == CrateType::Executable {

`

786

776

`let should_export_executable_symbols =

`

`@@ -809,7 +799,7 @@ impl<'a> Linker for GccLinker<'a> {

`

809

799

`// Write a plain, newline-separated list of symbols

`

810

800

`let res: io::Result<()> = try {

`

811

801

`let mut f = File::create_buffered(&path)?;

`

812

``

`-

for (sym, _) in symbols {

`

``

802

`+

for sym in symbols {

`

813

803

`debug!(" _{sym}");

`

814

804

`writeln!(f, "_{sym}")?;

`

815

805

`}

`

`@@ -824,12 +814,11 @@ impl<'a> Linker for GccLinker<'a> {

`

824

814

`// .def file similar to MSVC one but without LIBRARY section

`

825

815

`// because LD doesn't like when it's empty

`

826

816

`writeln!(f, "EXPORTS")?;

`

827

``

`-

for (symbol, kind) in symbols {

`

828

``

`-

let kind_marker = if *kind == SymbolExportKind::Data { " DATA" } else { "" };

`

``

817

`+

for symbol in symbols {

`

829

818

`debug!(" _{symbol}");

`

830

819

`// Quote the name in case it's reserved by linker in some way

`

831

820

`// (this accounts for names with dots in particular).

`

832

``

`-

writeln!(f, " "{symbol}"{kind_marker}")?;

`

``

821

`+

writeln!(f, " "{symbol}"")?;

`

833

822

`}

`

834

823

`};

`

835

824

`if let Err(error) = res {

`

`@@ -842,7 +831,7 @@ impl<'a> Linker for GccLinker<'a> {

`

842

831

`writeln!(f, "{{")?;

`

843

832

`if !symbols.is_empty() {

`

844

833

`writeln!(f, " global:")?;

`

845

``

`-

for (sym, _) in symbols {

`

``

834

`+

for sym in symbols {

`

846

835

`debug!(" {sym};");

`

847

836

`writeln!(f, " {sym};")?;

`

848

837

`}

`

`@@ -1109,12 +1098,7 @@ impl<'a> Linker for MsvcLinker<'a> {

`

1109

1098

`// crates. Upstream rlibs may be linked statically to this dynamic library,

`

1110

1099

`// in which case they may continue to transitively be used and hence need

`

1111

1100

`// 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]) {

`

1118

1102

`// Symbol visibility takes care of this typically

`

1119

1103

`if crate_type == CrateType::Executable {

`

1120

1104

`let should_export_executable_symbols =

`

`@@ -1132,10 +1116,9 @@ impl<'a> Linker for MsvcLinker<'a> {

`

1132

1116

`// straight to exports.

`

1133

1117

`writeln!(f, "LIBRARY")?;

`

1134

1118

`writeln!(f, "EXPORTS")?;

`

1135

``

`-

for (symbol, kind) in symbols {

`

1136

``

`-

let kind_marker = if *kind == SymbolExportKind::Data { " DATA" } else { "" };

`

``

1119

`+

for symbol in symbols {

`

1137

1120

`debug!(" _{symbol}");

`

1138

``

`-

writeln!(f, " {symbol}{kind_marker}")?;

`

``

1121

`+

writeln!(f, " {symbol}")?;

`

1139

1122

`}

`

1140

1123

`};

`

1141

1124

`if let Err(error) = res {

`

`@@ -1276,19 +1259,14 @@ impl<'a> Linker for EmLinker<'a> {

`

1276

1259

`self.cc_arg("-nodefaultlibs");

`

1277

1260

`}

`

1278

1261

``

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]) {

`

1285

1263

`debug!("EXPORTED SYMBOLS:");

`

1286

1264

``

1287

1265

`self.cc_arg("-s");

`

1288

1266

``

1289

1267

`let mut arg = OsString::from("EXPORTED_FUNCTIONS=");

`

1290

1268

`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<_>>(),

`

1292

1270

`)

`

1293

1271

`.unwrap();

`

1294

1272

`debug!("{encoded}");

`

`@@ -1450,13 +1428,8 @@ impl<'a> Linker for WasmLd<'a> {

`

1450

1428

``

1451

1429

`fn no_default_libraries(&mut self) {}

`

1452

1430

``

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 {

`

1460

1433

`self.link_args(&["--export", sym]);

`

1461

1434

`}

`

1462

1435

``

`@@ -1590,7 +1563,7 @@ impl<'a> Linker for L4Bender<'a> {

`

1590

1563

`self.cc_arg("-nostdlib");

`

1591

1564

`}

`

1592

1565

``

1593

``

`-

fn export_symbols(&mut self, _: &Path, _: CrateType, _: &[(String, SymbolExportKind)]) {

`

``

1566

`+

fn export_symbols(&mut self, _: &Path, _: CrateType, _: &[String]) {

`

1594

1567

`// ToDo, not implemented, copy from GCC

`

1595

1568

`self.sess.dcx().emit_warn(errors::L4BenderExportingSymbolsUnimplemented);

`

1596

1569

`}

`

`@@ -1747,17 +1720,12 @@ impl<'a> Linker for AixLinker<'a> {

`

1747

1720

``

1748

1721

`fn no_default_libraries(&mut self) {}

`

1749

1722

``

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]) {

`

1756

1724

`let path = tmpdir.join("list.exp");

`

1757

1725

`let res: io::Result<()> = try {

`

1758

1726

`let mut f = File::create_buffered(&path)?;

`

1759

1727

`// FIXME: use llvm-nm to generate export list.

`

1760

``

`-

for (symbol, _) in symbols {

`

``

1728

`+

for symbol in symbols {

`

1761

1729

`debug!(" _{symbol}");

`

1762

1730

`writeln!(f, " {symbol}")?;

`

1763

1731

`}

`

`@@ -1801,12 +1769,9 @@ fn for_each_exported_symbols_include_dep<'tcx>(

`

1801

1769

`}

`

1802

1770

`}

`

1803

1771

``

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 {

`

1808

1773

`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();

`

1810

1775

`}

`

1811

1776

``

1812

1777

`if let CrateType::ProcMacro = crate_type {

`

`@@ -1816,29 +1781,25 @@ pub(crate) fn exported_symbols(

`

1816

1781

`}

`

1817

1782

`}

`

1818

1783

``

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 {

`

1823

1785

`let mut symbols = Vec::new();

`

1824

1786

`let export_threshold = symbol_export::crates_export_threshold(&[crate_type]);

`

1825

1787

`for_each_exported_symbols_include_dep(tcx, crate_type, |symbol, info, cnum| {

`

1826

1788

`// Do not export mangled symbols from cdylibs and don't attempt to export compiler-builtins

`

1827

1789

`// from any cdylib. The latter doesn't work anyway as we use hidden visibility for

`

1828

1790

`// compiler-builtins. Most linkers silently ignore it, but ld64 gives a warning.

`

1829

1791

`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,

`

1833

1794

`));

`

1834

``

`-

symbol_export::extend_exported_symbols(&mut symbols, tcx, symbol, info, cnum);

`

``

1795

`+

symbol_export::extend_exported_symbols(&mut symbols, tcx, symbol, cnum);

`

1835

1796

`}

`

1836

1797

`});

`

1837

1798

``

1838

1799

` symbols

`

1839

1800

`}

`

1840

1801

``

1841

``

`-

fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec<(String, SymbolExportKind)> {

`

``

1802

`+

fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec {

`

1842

1803

`` // exported_symbols will be empty when !should_codegen.

``

1843

1804

`if !tcx.sess.opts.output_types.should_codegen() {

`

1844

1805

`return Vec::new();

`

`@@ -1848,10 +1809,7 @@ fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec<(String, Symbol

`

1848

1809

`let proc_macro_decls_name = tcx.sess.generate_proc_macro_decls_symbol(stable_crate_id);

`

1849

1810

`let metadata_symbol_name = exported_symbols::metadata_symbol_name(tcx);

`

1850

1811

``

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]

`

1855

1813

`}

`

1856

1814

``

1857

1815

`pub(crate) fn linked_symbols(

`

`@@ -1873,9 +1831,7 @@ pub(crate) fn linked_symbols(

`

1873

1831

` || info.used

`

1874

1832

`{

`

1875

1833

` 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),

`

1879

1835

` info.kind,

`

1880

1836

`));

`

1881

1837

`}

`

`@@ -1950,13 +1906,7 @@ impl<'a> Linker for PtxLinker<'a> {

`

1950

1906

``

1951

1907

`fn ehcont_guard(&mut self) {}

`

1952

1908

``

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]) {}

`

1960

1910

``

1961

1911

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

`

1962

1912

``

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

`

2025

1975

``

2026

1976

`fn ehcont_guard(&mut self) {}

`

2027

1977

``

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]) {

`

2034

1979

`match _crate_type {

`

2035

1980

`CrateType::Cdylib => {

`

2036

``

`-

for (sym, _) in symbols {

`

``

1981

`+

for sym in symbols {

`

2037

1982

`self.link_args(&["--export-symbol", sym]);

`

2038

1983

`}

`

2039

1984

`}

`

`@@ -2107,16 +2052,11 @@ impl<'a> Linker for BpfLinker<'a> {

`

2107

2052

``

2108

2053

`fn ehcont_guard(&mut self) {}

`

2109

2054

``

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]) {

`

2116

2056

`let path = tmpdir.join("symbols");

`

2117

2057

`let res: io::Result<()> = try {

`

2118

2058

`let mut f = File::create_buffered(&path)?;

`

2119

``

`-

for (sym, _) in symbols {

`

``

2059

`+

for sym in symbols {

`

2120

2060

`writeln!(f, "{sym}")?;

`

2121

2061

`}

`

2122

2062

`};

`