Skip to content

Commit f664cda

Browse files
committed
Move TargetOptions CRT objects to MaybeLazy
1 parent 9fb09f6 commit f664cda

File tree

11 files changed

+59
-48
lines changed

11 files changed

+59
-48
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 1 addition & 1 deletion
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

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
frame_pointer: FramePointer::NonLeaf,

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
@@ -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: 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(),
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),
109109
link_self_contained: LinkSelfContainedDefault::InferredForMingw,
110110
late_link_args,
111111
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
@@ -1968,11 +1968,11 @@ pub struct TargetOptions {
19681968
linker_is_gnu_json: bool,
19691969

19701970
/// Objects to link before and after all other object code.
1971-
pub pre_link_objects: CrtObjects,
1972-
pub post_link_objects: CrtObjects,
1971+
pub pre_link_objects: MaybeLazy<CrtObjects>,
1972+
pub post_link_objects: MaybeLazy<CrtObjects>,
19731973
/// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled.
1974-
pub pre_link_objects_self_contained: CrtObjects,
1975-
pub post_link_objects_self_contained: CrtObjects,
1974+
pub pre_link_objects_self_contained: MaybeLazy<CrtObjects>,
1975+
pub post_link_objects_self_contained: MaybeLazy<CrtObjects>,
19761976
/// Behavior for the self-contained linking mode: inferred for some targets, or explicitly
19771977
/// enabled (in bulk, or with individual components).
19781978
pub link_self_contained: LinkSelfContainedDefault,
@@ -2452,10 +2452,10 @@ impl Default for TargetOptions {
24522452
static_position_independent_executables: false,
24532453
plt_by_default: true,
24542454
relro_level: RelroLevel::None,
2455-
pre_link_objects: Default::default(),
2456-
post_link_objects: Default::default(),
2457-
pre_link_objects_self_contained: Default::default(),
2458-
post_link_objects_self_contained: Default::default(),
2455+
pre_link_objects: MaybeLazy::lazy(Default::default),
2456+
post_link_objects: MaybeLazy::lazy(Default::default),
2457+
pre_link_objects_self_contained: MaybeLazy::lazy(Default::default),
2458+
post_link_objects_self_contained: MaybeLazy::lazy(Default::default),
24592459
link_self_contained: LinkSelfContainedDefault::False,
24602460
pre_link_args: MaybeLazy::lazy(LinkArgs::new),
24612461
pre_link_args_json: LinkArgsCli::new(),
@@ -3046,7 +3046,7 @@ impl Target {
30463046

30473047
args.insert(kind, v);
30483048
}
3049-
base.$key_name = args;
3049+
base.$key_name = MaybeLazy::owned(args);
30503050
}
30513051
} );
30523052
($key_name:ident = $json_name:expr, link_args) => ( {

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@ pub fn target() -> Target {
66
base.max_atomic_width = Some(64);
77
base.vendor = "win7".into();
88

9-
base.add_pre_link_args(
10-
LinkerFlavor::Msvc(Lld::No),
11-
&[
12-
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
13-
// space available to x86 Windows binaries on x86_64.
14-
"/LARGEADDRESSAWARE",
15-
// Ensure the linker will only produce an image if it can also produce a table of
16-
// the image's safe exception handlers.
17-
// https://docs.microsoft.com/en-us/cpp/build/reference/safeseh-image-has-safe-exception-handlers
18-
"/SAFESEH",
19-
],
20-
);
9+
base.pre_link_args = MaybeLazy::lazy(|| {
10+
TargetOptions::link_args(
11+
LinkerFlavor::Msvc(Lld::No),
12+
&[
13+
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
14+
// space available to x86 Windows binaries on x86_64.
15+
"/LARGEADDRESSAWARE",
16+
// Ensure the linker will only produce an image if it can also produce a table of
17+
// the image's safe exception handlers.
18+
// https://docs.microsoft.com/en-us/cpp/build/reference/safeseh-image-has-safe-exception-handlers
19+
"/SAFESEH",
20+
],
21+
)
22+
});
2123

2224
Target {
2325
llvm_target: "i686-pc-windows-msvc".into(),

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
//! This target is more or less managed by the Rust and WebAssembly Working
1111
//! Group nowadays at <https://github.com/rustwasm>.
1212
13-
use crate::spec::{base, Cc, LinkerFlavor, MaybeLazy, Target};
13+
use crate::spec::add_link_args;
14+
use crate::spec::{base, Cc, LinkerFlavor, MaybeLazy, Target, TargetOptions};
1415

1516
pub fn target() -> Target {
1617
let mut options = base::wasm::options();

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