Skip to content

Commit 723e040

Browse files
committed
Move TargetOptions CRT objects to MaybeLazy
1 parent a8ff91b commit 723e040

File tree

6 files changed

+91
-74
lines changed

6 files changed

+91
-74
lines changed

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/crt_objects.rs

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,12 @@
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

4747
pub type CrtObjects = BTreeMap<LinkOutputKind, Vec<Cow<'static, str>>>;
48+
pub type LazyCrtObjects = MaybeLazy<CrtObjects>;
4849

4950
pub(super) fn new(obj_table: &[(LinkOutputKind, &[&'static str])]) -> CrtObjects {
5051
obj_table.iter().map(|(z, k)| (*z, k.iter().map(|b| (*b).into()).collect())).collect()
@@ -61,63 +62,71 @@ pub(super) fn all(obj: &'static str) -> CrtObjects {
6162
])
6263
}
6364

64-
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-
])
65+
pub(super) fn pre_musl_self_contained() -> LazyCrtObjects {
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

75-
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-
])
78+
pub(super) fn post_musl_self_contained() -> LazyCrtObjects {
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

86-
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-
])
91+
pub(super) fn pre_mingw_self_contained() -> LazyCrtObjects {
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

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

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

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

109-
pub(super) fn pre_wasi_self_contained() -> CrtObjects {
116+
pub(super) fn pre_wasi_self_contained() -> LazyCrtObjects {
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

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

compiler/rustc_target/src/spec/mod.rs

Lines changed: 6 additions & 6 deletions
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, LazyCrtObjects};
4242
use rustc_fs_util::try_canonicalize;
4343
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
4444
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
@@ -2017,11 +2017,11 @@ pub struct TargetOptions {
20172017
linker_is_gnu_json: bool,
20182018

20192019
/// Objects to link before and after all other object code.
2020-
pub pre_link_objects: CrtObjects,
2021-
pub post_link_objects: CrtObjects,
2020+
pub pre_link_objects: LazyCrtObjects,
2021+
pub post_link_objects: LazyCrtObjects,
20222022
/// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled.
2023-
pub pre_link_objects_self_contained: CrtObjects,
2024-
pub post_link_objects_self_contained: CrtObjects,
2023+
pub pre_link_objects_self_contained: LazyCrtObjects,
2024+
pub post_link_objects_self_contained: LazyCrtObjects,
20252025
/// Behavior for the self-contained linking mode: inferred for some targets, or explicitly
20262026
/// enabled (in bulk, or with individual components).
20272027
pub link_self_contained: LinkSelfContainedDefault,
@@ -3095,7 +3095,7 @@ impl Target {
30953095

30963096
args.insert(kind, v);
30973097
}
3098-
base.$key_name = args;
3098+
base.$key_name = MaybeLazy::owned(args);
30993099
}
31003100
} );
31013101
($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();

0 commit comments

Comments
 (0)