Skip to content

Commit 92afdf5

Browse files
loicUrgau
loic
authored andcommitted
Lazify crt objects fields
1 parent 3f4692d commit 92afdf5

File tree

9 files changed

+43
-35
lines changed

9 files changed

+43
-35
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1802,7 +1802,7 @@ fn add_pre_link_objects(
18021802
// FIXME: we are currently missing some infra here (per-linker-flavor CRT objects),
18031803
// so Fuchsia has to be special-cased.
18041804
let opts = &sess.target;
1805-
let empty = Default::default();
1805+
let empty = CrtObjects::default();
18061806
let objects = if self_contained {
18071807
&opts.pre_link_objects_self_contained
18081808
} else if !(sess.target.os == "fuchsia" && matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))) {

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

Lines changed: 8 additions & 5 deletions
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

Lines changed: 8 additions & 6 deletions
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
..Default::default()

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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 4 additions & 4 deletions
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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,11 +1882,11 @@ pub struct TargetOptions {
18821882
linker_is_gnu_json: bool,
18831883

18841884
/// Objects to link before and after all other object code.
1885-
pub pre_link_objects: CrtObjects,
1886-
pub post_link_objects: CrtObjects,
1885+
pub pre_link_objects: MaybeLazy<CrtObjects>,
1886+
pub post_link_objects: MaybeLazy<CrtObjects>,
18871887
/// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled.
1888-
pub pre_link_objects_self_contained: CrtObjects,
1889-
pub post_link_objects_self_contained: CrtObjects,
1888+
pub pre_link_objects_self_contained: MaybeLazy<CrtObjects>,
1889+
pub post_link_objects_self_contained: MaybeLazy<CrtObjects>,
18901890
/// Behavior for the self-contained linking mode: inferred for some targets, or explicitly
18911891
/// enabled (in bulk, or with individual components).
18921892
pub link_self_contained: LinkSelfContainedDefault,
@@ -2366,10 +2366,10 @@ impl Default for TargetOptions {
23662366
static_position_independent_executables: false,
23672367
plt_by_default: true,
23682368
relro_level: RelroLevel::None,
2369-
pre_link_objects: Default::default(),
2370-
post_link_objects: Default::default(),
2371-
pre_link_objects_self_contained: Default::default(),
2372-
post_link_objects_self_contained: Default::default(),
2369+
pre_link_objects: MaybeLazy::lazy(Default::default),
2370+
post_link_objects: MaybeLazy::lazy(Default::default),
2371+
pre_link_objects_self_contained: MaybeLazy::lazy(Default::default),
2372+
post_link_objects_self_contained: MaybeLazy::lazy(Default::default),
23732373
link_self_contained: LinkSelfContainedDefault::False,
23742374
pre_link_args: MaybeLazy::lazy(LinkArgs::new),
23752375
pre_link_args_json: LinkArgsCli::new(),
@@ -2949,7 +2949,7 @@ impl Target {
29492949

29502950
args.insert(kind, v);
29512951
}
2952-
base.$key_name = args;
2952+
base.$key_name = MaybeLazy::owned(args);
29532953
}
29542954
} );
29552955
($key_name:ident = $json_name:expr, link_args) => ( {

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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 4 additions & 3 deletions
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)