Skip to content

Commit 19a83ba

Browse files
loicUrgau
loic
authored andcommitted
Lazify crt objects fields
1 parent c0e3b4f commit 19a83ba

File tree

9 files changed

+43
-35
lines changed

9 files changed

+43
-35
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1832,7 +1832,7 @@ fn add_pre_link_objects(
18321832
// FIXME: we are currently missing some infra here (per-linker-flavor CRT objects),
18331833
// so Fuchsia has to be special-cased.
18341834
let opts = &sess.target;
1835-
let empty = Default::default();
1835+
let empty = CrtObjects::default();
18361836
let objects = if self_contained {
18371837
&opts.pre_link_objects_self_contained
18381838
} else if !(sess.target.os == "fuchsia" && matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))) {

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

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::abi::Endian;
2-
use crate::spec::{crt_objects, cvs, Cc, CodeModel, LinkOutputKind, LinkerFlavor, TargetOptions};
2+
use crate::spec::{crt_objects, cvs, Cc, CodeModel, LinkOutputKind, LinkerFlavor};
3+
use crate::spec::{MaybeLazy, TargetOptions};
34

45
pub fn opts() -> TargetOptions {
56
TargetOptions {
@@ -22,10 +23,12 @@ pub fn opts() -> TargetOptions {
2223
is_like_aix: true,
2324
default_dwarf_version: 3,
2425
function_sections: true,
25-
pre_link_objects: crt_objects::new(&[
26-
(LinkOutputKind::DynamicNoPicExe, &["/usr/lib/crt0_64.o", "/usr/lib/crti_64.o"]),
27-
(LinkOutputKind::DynamicPicExe, &["/usr/lib/crt0_64.o", "/usr/lib/crti_64.o"]),
28-
]),
26+
pre_link_objects: MaybeLazy::lazy(|| {
27+
crt_objects::new(&[
28+
(LinkOutputKind::DynamicNoPicExe, &["/usr/lib/crt0_64.o", "/usr/lib/crti_64.o"]),
29+
(LinkOutputKind::DynamicPicExe, &["/usr/lib/crt0_64.o", "/usr/lib/crti_64.o"]),
30+
])
31+
}),
2932
dll_suffix: ".a".into(),
3033
..Default::default()
3134
}

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

+8-6
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ pub fn opts() -> TargetOptions {
3434
dynamic_linking: true,
3535
families: cvs!["unix"],
3636
pre_link_args,
37-
pre_link_objects: crt_objects::new(&[
38-
(LinkOutputKind::DynamicNoPicExe, &["Scrt1.o"]),
39-
(LinkOutputKind::DynamicPicExe, &["Scrt1.o"]),
40-
(LinkOutputKind::StaticNoPicExe, &["Scrt1.o"]),
41-
(LinkOutputKind::StaticPicExe, &["Scrt1.o"]),
42-
]),
37+
pre_link_objects: MaybeLazy::lazy(|| {
38+
crt_objects::new(&[
39+
(LinkOutputKind::DynamicNoPicExe, &["Scrt1.o"]),
40+
(LinkOutputKind::DynamicPicExe, &["Scrt1.o"]),
41+
(LinkOutputKind::StaticNoPicExe, &["Scrt1.o"]),
42+
(LinkOutputKind::StaticPicExe, &["Scrt1.o"]),
43+
])
44+
}),
4345
position_independent_executables: true,
4446
has_thread_local: true,
4547
frame_pointer: FramePointer::NonLeaf,

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, TargetOptions};
2+
use crate::spec::{base, LinkSelfContainedDefault, MaybeLazy, 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 = crt_objects::pre_musl_self_contained();
9-
base.post_link_objects_self_contained = crt_objects::post_musl_self_contained();
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);
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
@@ -99,10 +99,10 @@ pub fn opts() -> TargetOptions {
9999
is_like_windows: true,
100100
allows_weak_linkage: false,
101101
pre_link_args,
102-
pre_link_objects: crt_objects::pre_mingw(),
103-
post_link_objects: crt_objects::post_mingw(),
104-
pre_link_objects_self_contained: crt_objects::pre_mingw_self_contained(),
105-
post_link_objects_self_contained: crt_objects::post_mingw_self_contained(),
102+
pre_link_objects: MaybeLazy::lazy(crt_objects::pre_mingw),
103+
post_link_objects: MaybeLazy::lazy(crt_objects::post_mingw),
104+
pre_link_objects_self_contained: MaybeLazy::lazy(crt_objects::pre_mingw_self_contained),
105+
post_link_objects_self_contained: MaybeLazy::lazy(crt_objects::post_mingw_self_contained),
106106
link_self_contained: LinkSelfContainedDefault::InferredForMingw,
107107
late_link_args,
108108
late_link_args_dynamic,

compiler/rustc_target/src/spec/mod.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -1981,11 +1981,11 @@ pub struct TargetOptions {
19811981
linker_is_gnu_json: bool,
19821982

19831983
/// Objects to link before and after all other object code.
1984-
pub pre_link_objects: CrtObjects,
1985-
pub post_link_objects: CrtObjects,
1984+
pub pre_link_objects: MaybeLazy<CrtObjects>,
1985+
pub post_link_objects: MaybeLazy<CrtObjects>,
19861986
/// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled.
1987-
pub pre_link_objects_self_contained: CrtObjects,
1988-
pub post_link_objects_self_contained: CrtObjects,
1987+
pub pre_link_objects_self_contained: MaybeLazy<CrtObjects>,
1988+
pub post_link_objects_self_contained: MaybeLazy<CrtObjects>,
19891989
/// Behavior for the self-contained linking mode: inferred for some targets, or explicitly
19901990
/// enabled (in bulk, or with individual components).
19911991
pub link_self_contained: LinkSelfContainedDefault,
@@ -2465,10 +2465,10 @@ impl Default for TargetOptions {
24652465
static_position_independent_executables: false,
24662466
plt_by_default: true,
24672467
relro_level: RelroLevel::None,
2468-
pre_link_objects: Default::default(),
2469-
post_link_objects: Default::default(),
2470-
pre_link_objects_self_contained: Default::default(),
2471-
post_link_objects_self_contained: Default::default(),
2468+
pre_link_objects: MaybeLazy::lazy(Default::default),
2469+
post_link_objects: MaybeLazy::lazy(Default::default),
2470+
pre_link_objects_self_contained: MaybeLazy::lazy(Default::default),
2471+
post_link_objects_self_contained: MaybeLazy::lazy(Default::default),
24722472
link_self_contained: LinkSelfContainedDefault::False,
24732473
pre_link_args: MaybeLazy::lazy(LinkArgs::new),
24742474
pre_link_args_json: LinkArgsCli::new(),
@@ -3059,7 +3059,7 @@ impl Target {
30593059

30603060
args.insert(kind, v);
30613061
}
3062-
base.$key_name = args;
3062+
base.$key_name = MaybeLazy::owned(args);
30633063
}
30643064
} );
30653065
($key_name:ident = $json_name:expr, link_args) => ( {

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

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

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

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

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

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

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

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

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

+4-3
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, Target};
21+
use crate::spec::{base, MaybeLazy, Target};
2222

2323
pub fn target() -> Target {
2424
let mut options = base::wasm::options();
@@ -27,8 +27,9 @@ 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 = crt_objects::pre_wasi_self_contained();
31-
options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained();
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);
3233

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

0 commit comments

Comments
 (0)