Skip to content

Commit 12608a5

Browse files
author
Kjetil Kjeka
committed
Add the embedded linker as a linker known by the rust comiler
1 parent b603bdd commit 12608a5

File tree

4 files changed

+131
-5
lines changed

4 files changed

+131
-5
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1327,6 +1327,7 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
13271327
}
13281328
LinkerFlavor::Bpf => "bpf-linker",
13291329
LinkerFlavor::Ptx => "rust-ptx-linker",
1330+
LinkerFlavor::Embedded => "rust-embedded-linker",
13301331
}),
13311332
flavor,
13321333
)),

compiler/rustc_codegen_ssa/src/back/linker.rs

+108-1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ pub fn get_linker<'a>(
102102
}
103103
}
104104

105+
// The embedded linker needs to know target and cpu
106+
if flavor == LinkerFlavor::Embedded {
107+
cmd.arg("--target").arg(sess.target.llvm_target.as_ref());
108+
cmd.arg("--target-cpu").arg(&target_cpu);
109+
}
110+
105111
// The compiler's sysroot often has some bundled tools, so add it to the
106112
// PATH for the child.
107113
let mut new_path = sess.get_tools_search_paths(self_contained);
@@ -129,7 +135,11 @@ pub fn get_linker<'a>(
129135

130136
// FIXME: Move `/LIBPATH` addition for uwp targets from the linker construction
131137
// to the linker args construction.
132-
assert!(cmd.get_args().is_empty() || sess.target.vendor == "uwp");
138+
assert!(
139+
cmd.get_args().is_empty()
140+
|| sess.target.vendor == "uwp"
141+
|| flavor == LinkerFlavor::Embedded
142+
);
133143
match flavor {
134144
LinkerFlavor::Unix(Cc::No) if sess.target.os == "l4re" => {
135145
Box::new(L4Bender::new(cmd, sess)) as Box<dyn Linker>
@@ -153,6 +163,7 @@ pub fn get_linker<'a>(
153163
LinkerFlavor::EmCc => Box::new(EmLinker { cmd, sess }) as Box<dyn Linker>,
154164
LinkerFlavor::Bpf => Box::new(BpfLinker { cmd, sess }) as Box<dyn Linker>,
155165
LinkerFlavor::Ptx => Box::new(PtxLinker { cmd, sess }) as Box<dyn Linker>,
166+
LinkerFlavor::Embedded => Box::new(EmbeddedLinker { cmd, sess }) as Box<dyn Linker>,
156167
}
157168
}
158169

@@ -1950,3 +1961,99 @@ impl<'a> Linker for BpfLinker<'a> {
19501961

19511962
fn linker_plugin_lto(&mut self) {}
19521963
}
1964+
1965+
pub struct EmbeddedLinker<'a> {
1966+
cmd: Command,
1967+
sess: &'a Session,
1968+
}
1969+
1970+
impl<'a> Linker for EmbeddedLinker<'a> {
1971+
fn cmd(&mut self) -> &mut Command {
1972+
&mut self.cmd
1973+
}
1974+
1975+
fn set_output_kind(&mut self, _output_kind: LinkOutputKind, _out_filename: &Path) {}
1976+
1977+
fn link_rlib(&mut self, path: &Path) {
1978+
self.cmd.arg("--rlib").arg(path);
1979+
}
1980+
1981+
fn link_whole_rlib(&mut self, path: &Path) {
1982+
self.cmd.arg("--whole-rlib").arg(path);
1983+
}
1984+
1985+
fn include_path(&mut self, path: &Path) {
1986+
self.cmd.arg("-L").arg(path);
1987+
}
1988+
1989+
fn debuginfo(&mut self, _strip: Strip, _: &[PathBuf]) {
1990+
self.cmd.arg("--debug");
1991+
}
1992+
1993+
fn add_object(&mut self, path: &Path) {
1994+
self.cmd.arg("--bitcode").arg(path);
1995+
}
1996+
1997+
fn optimize(&mut self) {
1998+
match self.sess.opts.optimize {
1999+
OptLevel::No => "-O0",
2000+
OptLevel::Less => "-O1",
2001+
OptLevel::Default => "-O2",
2002+
OptLevel::Aggressive => "-O3",
2003+
OptLevel::Size => "-Os",
2004+
OptLevel::SizeMin => "-Oz",
2005+
};
2006+
}
2007+
2008+
fn output_filename(&mut self, path: &Path) {
2009+
self.cmd.arg("-o").arg(path);
2010+
}
2011+
2012+
fn link_dylib(&mut self, _lib: &str, _verbatim: bool, _as_needed: bool) {
2013+
panic!("external dylibs not supported")
2014+
}
2015+
2016+
fn link_rust_dylib(&mut self, _lib: &str, _path: &Path) {
2017+
panic!("external dylibs not supported")
2018+
}
2019+
2020+
fn link_staticlib(&mut self, _lib: &str, _verbatim: bool) {
2021+
panic!("staticlibs not supported")
2022+
}
2023+
2024+
fn link_whole_staticlib(&mut self, _lib: &str, _verbatim: bool, _search_path: &[PathBuf]) {
2025+
panic!("staticlibs not supported")
2026+
}
2027+
2028+
fn framework_path(&mut self, _path: &Path) {
2029+
panic!("frameworks not supported")
2030+
}
2031+
2032+
fn link_framework(&mut self, _framework: &str, _as_needed: bool) {
2033+
panic!("frameworks not supported")
2034+
}
2035+
2036+
fn full_relro(&mut self) {}
2037+
2038+
fn partial_relro(&mut self) {}
2039+
2040+
fn no_relro(&mut self) {}
2041+
2042+
fn gc_sections(&mut self, _keep_metadata: bool) {}
2043+
2044+
fn no_gc_sections(&mut self) {}
2045+
2046+
fn pgo_gen(&mut self) {}
2047+
2048+
fn no_crt_objects(&mut self) {}
2049+
2050+
fn no_default_libraries(&mut self) {}
2051+
2052+
fn control_flow_guard(&mut self) {}
2053+
2054+
fn export_symbols(&mut self, _tmpdir: &Path, _crate_type: CrateType, _symbols: &[String]) {}
2055+
2056+
fn subsystem(&mut self, _subsystem: &str) {}
2057+
2058+
fn linker_plugin_lto(&mut self) {}
2059+
}

compiler/rustc_target/src/spec/mod.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ pub enum LinkerFlavor {
160160
Bpf,
161161
/// Linker tool for Nvidia PTX.
162162
Ptx,
163+
/// The embedded linker calling on llvm tools to link.
164+
Embedded,
163165
}
164166

165167
/// Linker flavors available externally through command line (`-Clinker-flavor`)
@@ -178,6 +180,7 @@ pub enum LinkerFlavorCli {
178180
EmCc,
179181
Bpf,
180182
Ptx,
183+
Embedded,
181184

182185
// Legacy stable values
183186
Gcc,
@@ -197,7 +200,8 @@ impl LinkerFlavorCli {
197200
| LinkerFlavorCli::Msvc(Lld::Yes)
198201
| LinkerFlavorCli::EmCc
199202
| LinkerFlavorCli::Bpf
200-
| LinkerFlavorCli::Ptx => true,
203+
| LinkerFlavorCli::Ptx
204+
| LinkerFlavorCli::Embedded => true,
201205
LinkerFlavorCli::Gcc
202206
| LinkerFlavorCli::Ld
203207
| LinkerFlavorCli::Lld(..)
@@ -257,6 +261,7 @@ impl LinkerFlavor {
257261
LinkerFlavorCli::EmCc => LinkerFlavor::EmCc,
258262
LinkerFlavorCli::Bpf => LinkerFlavor::Bpf,
259263
LinkerFlavorCli::Ptx => LinkerFlavor::Ptx,
264+
LinkerFlavorCli::Embedded => LinkerFlavor::Embedded,
260265

261266
// Below: legacy stable values
262267
LinkerFlavorCli::Gcc => match lld_flavor {
@@ -296,6 +301,7 @@ impl LinkerFlavor {
296301
LinkerFlavor::EmCc => LinkerFlavorCli::Em,
297302
LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
298303
LinkerFlavor::Ptx => LinkerFlavorCli::Ptx,
304+
LinkerFlavor::Embedded => LinkerFlavorCli::Embedded,
299305
}
300306
}
301307

@@ -310,6 +316,7 @@ impl LinkerFlavor {
310316
LinkerFlavor::EmCc => LinkerFlavorCli::EmCc,
311317
LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
312318
LinkerFlavor::Ptx => LinkerFlavorCli::Ptx,
319+
LinkerFlavor::Embedded => LinkerFlavorCli::Embedded,
313320
}
314321
}
315322

@@ -322,7 +329,7 @@ impl LinkerFlavor {
322329
LinkerFlavorCli::Unix(cc) => (Some(cc), None),
323330
LinkerFlavorCli::Msvc(lld) => (Some(Cc::No), Some(lld)),
324331
LinkerFlavorCli::EmCc => (Some(Cc::Yes), Some(Lld::Yes)),
325-
LinkerFlavorCli::Bpf | LinkerFlavorCli::Ptx => (None, None),
332+
LinkerFlavorCli::Bpf | LinkerFlavorCli::Ptx | LinkerFlavorCli::Embedded => (None, None),
326333

327334
// Below: legacy stable values
328335
LinkerFlavorCli::Gcc => (Some(Cc::Yes), None),
@@ -377,7 +384,9 @@ impl LinkerFlavor {
377384
LinkerFlavor::WasmLld(cc) => LinkerFlavor::WasmLld(cc_hint.unwrap_or(cc)),
378385
LinkerFlavor::Unix(cc) => LinkerFlavor::Unix(cc_hint.unwrap_or(cc)),
379386
LinkerFlavor::Msvc(lld) => LinkerFlavor::Msvc(lld_hint.unwrap_or(lld)),
380-
LinkerFlavor::EmCc | LinkerFlavor::Bpf | LinkerFlavor::Ptx => self,
387+
LinkerFlavor::EmCc | LinkerFlavor::Bpf | LinkerFlavor::Ptx | LinkerFlavor::Embedded => {
388+
self
389+
}
381390
}
382391
}
383392

@@ -400,6 +409,7 @@ impl LinkerFlavor {
400409
| (LinkerFlavor::Unix(..), LinkerFlavorCli::Unix(..))
401410
| (LinkerFlavor::Msvc(..), LinkerFlavorCli::Msvc(..))
402411
| (LinkerFlavor::EmCc, LinkerFlavorCli::EmCc)
412+
| (LinkerFlavor::Embedded, LinkerFlavorCli::Embedded)
403413
| (LinkerFlavor::Bpf, LinkerFlavorCli::Bpf)
404414
| (LinkerFlavor::Ptx, LinkerFlavorCli::Ptx) => return true,
405415
_ => {}
@@ -424,6 +434,7 @@ impl LinkerFlavor {
424434
| LinkerFlavor::Unix(..)
425435
| LinkerFlavor::EmCc
426436
| LinkerFlavor::Bpf
437+
| LinkerFlavor::Embedded
427438
| LinkerFlavor::Ptx => LldFlavor::Ld,
428439
LinkerFlavor::Darwin(..) => LldFlavor::Ld64,
429440
LinkerFlavor::WasmLld(..) => LldFlavor::Wasm,
@@ -448,6 +459,7 @@ impl LinkerFlavor {
448459
| LinkerFlavor::Darwin(..)
449460
| LinkerFlavor::Msvc(_)
450461
| LinkerFlavor::Unix(_)
462+
| LinkerFlavor::Embedded
451463
| LinkerFlavor::Bpf
452464
| LinkerFlavor::Ptx => false,
453465
}
@@ -467,6 +479,7 @@ impl LinkerFlavor {
467479
| LinkerFlavor::WasmLld(_)
468480
| LinkerFlavor::Msvc(_)
469481
| LinkerFlavor::Unix(_)
482+
| LinkerFlavor::Embedded
470483
| LinkerFlavor::Bpf
471484
| LinkerFlavor::Ptx => false,
472485
}
@@ -516,6 +529,7 @@ linker_flavor_cli_impls! {
516529
(LinkerFlavorCli::Msvc(Lld::Yes)) "msvc-lld"
517530
(LinkerFlavorCli::Msvc(Lld::No)) "msvc"
518531
(LinkerFlavorCli::EmCc) "em-cc"
532+
(LinkerFlavorCli::Embedded) "embedded"
519533
(LinkerFlavorCli::Bpf) "bpf"
520534
(LinkerFlavorCli::Ptx) "ptx"
521535

@@ -2258,6 +2272,7 @@ fn add_link_args_iter(
22582272
LinkerFlavor::WasmLld(..)
22592273
| LinkerFlavor::Unix(..)
22602274
| LinkerFlavor::EmCc
2275+
| LinkerFlavor::Embedded
22612276
| LinkerFlavor::Bpf
22622277
| LinkerFlavor::Ptx => {}
22632278
}

compiler/rustc_target/src/spec/tests/tests_impl.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ impl Target {
5656
LinkerFlavor::Msvc(..) => {
5757
assert_matches!(flavor, LinkerFlavor::Msvc(..))
5858
}
59-
LinkerFlavor::EmCc | LinkerFlavor::Bpf | LinkerFlavor::Ptx => {
59+
LinkerFlavor::EmCc
60+
| LinkerFlavor::Bpf
61+
| LinkerFlavor::Ptx
62+
| LinkerFlavor::Embedded => {
6063
assert_eq!(flavor, self.linker_flavor)
6164
}
6265
}

0 commit comments

Comments
 (0)