Skip to content

Commit a49198e

Browse files
committed
WIP2
1 parent a040142 commit a49198e

File tree

7 files changed

+68
-62
lines changed

7 files changed

+68
-62
lines changed

compiler/rustc_target/src/spec/base/linux_musl.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use crate::spec::crt_objects;
2-
use crate::spec::{base, LinkSelfContainedDefault, MaybeLazy, TargetOptions};
2+
use crate::spec::{base, LinkSelfContainedDefault, TargetOptions};
33

44
pub fn opts() -> TargetOptions {
55
let mut base = base::linux::opts();
66

77
base.env = "musl".into();
8-
base.pre_link_objects_self_contained = MaybeLazy::lazy(crt_objects::pre_musl_self_contained);
9-
base.post_link_objects_self_contained = MaybeLazy::lazy(crt_objects::post_musl_self_contained);
8+
base.pre_link_objects_self_contained = crt_objects::pre_musl_self_contained();
9+
base.post_link_objects_self_contained = crt_objects::post_musl_self_contained();
1010
base.link_self_contained = LinkSelfContainedDefault::InferredForMusl;
1111

1212
// These targets statically link libc by default

compiler/rustc_target/src/spec/base/windows_gnu.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,10 @@ pub fn opts() -> TargetOptions {
102102
is_like_windows: true,
103103
allows_weak_linkage: false,
104104
pre_link_args,
105-
pre_link_objects: MaybeLazy::lazy(crt_objects::pre_mingw),
106-
post_link_objects: MaybeLazy::lazy(crt_objects::post_mingw),
107-
pre_link_objects_self_contained: MaybeLazy::lazy(crt_objects::pre_mingw_self_contained),
108-
post_link_objects_self_contained: MaybeLazy::lazy(crt_objects::post_mingw_self_contained),
105+
pre_link_objects: crt_objects::pre_mingw(),
106+
post_link_objects: crt_objects::post_mingw(),
107+
pre_link_objects_self_contained: crt_objects::pre_mingw_self_contained(),
108+
post_link_objects_self_contained: crt_objects::post_mingw_self_contained(),
109109
link_self_contained: LinkSelfContainedDefault::InferredForMingw,
110110
late_link_args,
111111
late_link_args_dynamic,

compiler/rustc_target/src/spec/crt_objects.rs

+48-39
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,18 @@
4040
//! but not gcc's. As a result rustc cannot link with C++ static libraries (#36710)
4141
//! when linking in self-contained mode.
4242
43-
use crate::spec::LinkOutputKind;
43+
use crate::spec::{LinkOutputKind, MaybeLazy};
4444
use std::borrow::Cow;
4545
use std::collections::BTreeMap;
4646

47-
pub type CrtObjects = BTreeMap<LinkOutputKind, Vec<Cow<'static, str>>>;
47+
pub type CrtObjectsData = BTreeMap<LinkOutputKind, Vec<Cow<'static, str>>>;
48+
pub type CrtObjects = MaybeLazy<CrtObjectsData>;
4849

49-
pub(super) fn new(obj_table: &[(LinkOutputKind, &[&'static str])]) -> CrtObjects {
50+
pub(super) fn new(obj_table: &[(LinkOutputKind, &[&'static str])]) -> CrtObjectsData {
5051
obj_table.iter().map(|(z, k)| (*z, k.iter().map(|b| (*b).into()).collect())).collect()
5152
}
5253

53-
pub(super) fn all(obj: &'static str) -> CrtObjects {
54+
pub(super) fn all(obj: &'static str) -> CrtObjectsData {
5455
new(&[
5556
(LinkOutputKind::DynamicNoPicExe, &[obj]),
5657
(LinkOutputKind::DynamicPicExe, &[obj]),
@@ -62,62 +63,70 @@ pub(super) fn all(obj: &'static str) -> CrtObjects {
6263
}
6364

6465
pub(super) fn pre_musl_self_contained() -> CrtObjects {
65-
new(&[
66-
(LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]),
67-
(LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o", "crtbeginS.o"]),
68-
(LinkOutputKind::StaticNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]),
69-
(LinkOutputKind::StaticPicExe, &["rcrt1.o", "crti.o", "crtbeginS.o"]),
70-
(LinkOutputKind::DynamicDylib, &["crti.o", "crtbeginS.o"]),
71-
(LinkOutputKind::StaticDylib, &["crti.o", "crtbeginS.o"]),
72-
])
66+
MaybeLazy::lazy(|| {
67+
new(&[
68+
(LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]),
69+
(LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o", "crtbeginS.o"]),
70+
(LinkOutputKind::StaticNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]),
71+
(LinkOutputKind::StaticPicExe, &["rcrt1.o", "crti.o", "crtbeginS.o"]),
72+
(LinkOutputKind::DynamicDylib, &["crti.o", "crtbeginS.o"]),
73+
(LinkOutputKind::StaticDylib, &["crti.o", "crtbeginS.o"]),
74+
])
75+
})
7376
}
7477

7578
pub(super) fn post_musl_self_contained() -> CrtObjects {
76-
new(&[
77-
(LinkOutputKind::DynamicNoPicExe, &["crtend.o", "crtn.o"]),
78-
(LinkOutputKind::DynamicPicExe, &["crtendS.o", "crtn.o"]),
79-
(LinkOutputKind::StaticNoPicExe, &["crtend.o", "crtn.o"]),
80-
(LinkOutputKind::StaticPicExe, &["crtendS.o", "crtn.o"]),
81-
(LinkOutputKind::DynamicDylib, &["crtendS.o", "crtn.o"]),
82-
(LinkOutputKind::StaticDylib, &["crtendS.o", "crtn.o"]),
83-
])
79+
MaybeLazy::lazy(|| {
80+
new(&[
81+
(LinkOutputKind::DynamicNoPicExe, &["crtend.o", "crtn.o"]),
82+
(LinkOutputKind::DynamicPicExe, &["crtendS.o", "crtn.o"]),
83+
(LinkOutputKind::StaticNoPicExe, &["crtend.o", "crtn.o"]),
84+
(LinkOutputKind::StaticPicExe, &["crtendS.o", "crtn.o"]),
85+
(LinkOutputKind::DynamicDylib, &["crtendS.o", "crtn.o"]),
86+
(LinkOutputKind::StaticDylib, &["crtendS.o", "crtn.o"]),
87+
])
88+
})
8489
}
8590

8691
pub(super) fn pre_mingw_self_contained() -> CrtObjects {
87-
new(&[
88-
(LinkOutputKind::DynamicNoPicExe, &["crt2.o", "rsbegin.o"]),
89-
(LinkOutputKind::DynamicPicExe, &["crt2.o", "rsbegin.o"]),
90-
(LinkOutputKind::StaticNoPicExe, &["crt2.o", "rsbegin.o"]),
91-
(LinkOutputKind::StaticPicExe, &["crt2.o", "rsbegin.o"]),
92-
(LinkOutputKind::DynamicDylib, &["dllcrt2.o", "rsbegin.o"]),
93-
(LinkOutputKind::StaticDylib, &["dllcrt2.o", "rsbegin.o"]),
94-
])
92+
MaybeLazy::lazy(|| {
93+
new(&[
94+
(LinkOutputKind::DynamicNoPicExe, &["crt2.o", "rsbegin.o"]),
95+
(LinkOutputKind::DynamicPicExe, &["crt2.o", "rsbegin.o"]),
96+
(LinkOutputKind::StaticNoPicExe, &["crt2.o", "rsbegin.o"]),
97+
(LinkOutputKind::StaticPicExe, &["crt2.o", "rsbegin.o"]),
98+
(LinkOutputKind::DynamicDylib, &["dllcrt2.o", "rsbegin.o"]),
99+
(LinkOutputKind::StaticDylib, &["dllcrt2.o", "rsbegin.o"]),
100+
])
101+
})
95102
}
96103

97104
pub(super) fn post_mingw_self_contained() -> CrtObjects {
98-
all("rsend.o")
105+
MaybeLazy::lazy(|| all("rsend.o"))
99106
}
100107

101108
pub(super) fn pre_mingw() -> CrtObjects {
102-
all("rsbegin.o")
109+
MaybeLazy::lazy(|| all("rsbegin.o"))
103110
}
104111

105112
pub(super) fn post_mingw() -> CrtObjects {
106-
all("rsend.o")
113+
MaybeLazy::lazy(|| all("rsend.o"))
107114
}
108115

109116
pub(super) fn pre_wasi_self_contained() -> CrtObjects {
110117
// Use crt1-command.o instead of crt1.o to enable support for new-style
111118
// commands. See https://reviews.llvm.org/D81689 for more info.
112-
new(&[
113-
(LinkOutputKind::DynamicNoPicExe, &["crt1-command.o"]),
114-
(LinkOutputKind::DynamicPicExe, &["crt1-command.o"]),
115-
(LinkOutputKind::StaticNoPicExe, &["crt1-command.o"]),
116-
(LinkOutputKind::StaticPicExe, &["crt1-command.o"]),
117-
(LinkOutputKind::WasiReactorExe, &["crt1-reactor.o"]),
118-
])
119+
MaybeLazy::lazy(|| {
120+
new(&[
121+
(LinkOutputKind::DynamicNoPicExe, &["crt1-command.o"]),
122+
(LinkOutputKind::DynamicPicExe, &["crt1-command.o"]),
123+
(LinkOutputKind::StaticNoPicExe, &["crt1-command.o"]),
124+
(LinkOutputKind::StaticPicExe, &["crt1-command.o"]),
125+
(LinkOutputKind::WasiReactorExe, &["crt1-reactor.o"]),
126+
])
127+
})
119128
}
120129

121130
pub(super) fn post_wasi_self_contained() -> CrtObjects {
122-
new(&[])
131+
MaybeLazy::lazy(|| new(&[]))
123132
}

compiler/rustc_target/src/spec/mod.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use crate::abi::call::Conv;
3838
use crate::abi::{Endian, Integer, Size, TargetDataLayout, TargetDataLayoutErrors};
3939
use crate::json::{Json, ToJson};
4040
use crate::spec::abi::Abi;
41-
use crate::spec::crt_objects::CrtObjects;
41+
use crate::spec::crt_objects::{CrtObjects, CrtObjectsData};
4242
use rustc_fs_util::try_canonicalize;
4343
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
4444
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
@@ -2012,11 +2012,11 @@ pub struct TargetOptions {
20122012
linker_is_gnu_json: bool,
20132013

20142014
/// Objects to link before and after all other object code.
2015-
pub pre_link_objects: MaybeLazy<CrtObjects>,
2016-
pub post_link_objects: MaybeLazy<CrtObjects>,
2015+
pub pre_link_objects: CrtObjects,
2016+
pub post_link_objects: CrtObjects,
20172017
/// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled.
2018-
pub pre_link_objects_self_contained: MaybeLazy<CrtObjects>,
2019-
pub post_link_objects_self_contained: MaybeLazy<CrtObjects>,
2018+
pub pre_link_objects_self_contained: CrtObjects,
2019+
pub post_link_objects_self_contained: CrtObjects,
20202020
/// Behavior for the self-contained linking mode: inferred for some targets, or explicitly
20212021
/// enabled (in bulk, or with individual components).
20222022
pub link_self_contained: LinkSelfContainedDefault,
@@ -3070,7 +3070,7 @@ impl Target {
30703070
if let Some(val) = obj.remove(name) {
30713071
let obj = val.as_object().ok_or_else(|| format!("{}: expected a \
30723072
JSON object with fields per CRT object kind.", name))?;
3073-
let mut args = CrtObjects::new();
3073+
let mut args = CrtObjectsData::new();
30743074
for (k, v) in obj {
30753075
let kind = LinkOutputKind::from_str(&k).ok_or_else(|| {
30763076
format!("{}: '{}' is not a valid value for CRT object kind. \

compiler/rustc_target/src/spec/targets/wasm32_wasip1.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ pub fn target() -> Target {
2424
TargetOptions::link_args(LinkerFlavor::WasmLld(Cc::Yes), &["--target=wasm32-wasi"])
2525
});
2626

27-
options.pre_link_objects_self_contained = MaybeLazy::lazy(crt_objects::pre_wasi_self_contained);
28-
options.post_link_objects_self_contained =
29-
MaybeLazy::lazy(crt_objects::post_wasi_self_contained);
27+
options.pre_link_objects_self_contained = crt_objects::pre_wasi_self_contained();
28+
options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained();
3029

3130
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
3231
options.link_self_contained = LinkSelfContainedDefault::True;

compiler/rustc_target/src/spec/targets/wasm32_wasip1_threads.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ pub fn target() -> Target {
3535
pre_link_args
3636
});
3737

38-
options.pre_link_objects_self_contained = MaybeLazy::lazy(crt_objects::pre_wasi_self_contained);
39-
options.post_link_objects_self_contained =
40-
MaybeLazy::lazy(crt_objects::post_wasi_self_contained);
38+
options.pre_link_objects_self_contained = crt_objects::pre_wasi_self_contained();
39+
options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained();
4140

4241
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
4342
options.link_self_contained = LinkSelfContainedDefault::True;

compiler/rustc_target/src/spec/targets/wasm32_wasip2.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
1919
use crate::spec::crt_objects;
2020
use crate::spec::LinkSelfContainedDefault;
21-
use crate::spec::{base, MaybeLazy, RelocModel, Target};
21+
use crate::spec::{base, RelocModel, Target};
2222

2323
pub fn target() -> Target {
2424
let mut options = base::wasm::options();
@@ -27,9 +27,8 @@ pub fn target() -> Target {
2727
options.env = "p2".into();
2828
options.linker = Some("wasm-component-ld".into());
2929

30-
options.pre_link_objects_self_contained = MaybeLazy::lazy(crt_objects::pre_wasi_self_contained);
31-
options.post_link_objects_self_contained =
32-
MaybeLazy::lazy(crt_objects::post_wasi_self_contained);
30+
options.pre_link_objects_self_contained = crt_objects::pre_wasi_self_contained();
31+
options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained();
3332

3433
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
3534
options.link_self_contained = LinkSelfContainedDefault::True;

0 commit comments

Comments
 (0)