Skip to content

Commit 5f04281

Browse files
committed
Use get_many_mut to reduce the cost of setup ping check cfg values
1 parent a4cec97 commit 5f04281

File tree

2 files changed

+90
-34
lines changed

2 files changed

+90
-34
lines changed

compiler/rustc_session/src/config.rs

+89-34
Original file line numberDiff line numberDiff line change
@@ -1102,41 +1102,96 @@ impl CrateCheckConfig {
11021102
.extend(atomic_values);
11031103

11041104
// Target specific values
1105-
for target in
1106-
TARGETS.iter().map(|target| Target::expect_builtin(&TargetTriple::from_triple(target)))
1105+
#[cfg(bootstrap)]
11071106
{
1108-
self.values_valid
1109-
.entry(sym::target_os)
1110-
.or_default()
1111-
.insert(Symbol::intern(&target.options.os));
1112-
self.values_valid
1113-
.entry(sym::target_family)
1114-
.or_default()
1115-
.extend(target.options.families.iter().map(|family| Symbol::intern(family)));
1116-
self.values_valid
1117-
.entry(sym::target_arch)
1118-
.or_default()
1119-
.insert(Symbol::intern(&target.arch));
1120-
self.values_valid
1121-
.entry(sym::target_endian)
1122-
.or_default()
1123-
.insert(Symbol::intern(&target.options.endian.as_str()));
1124-
self.values_valid
1125-
.entry(sym::target_env)
1126-
.or_default()
1127-
.insert(Symbol::intern(&target.options.env));
1128-
self.values_valid
1129-
.entry(sym::target_abi)
1130-
.or_default()
1131-
.insert(Symbol::intern(&target.options.abi));
1132-
self.values_valid
1133-
.entry(sym::target_vendor)
1134-
.or_default()
1135-
.insert(Symbol::intern(&target.options.vendor));
1136-
self.values_valid
1137-
.entry(sym::target_pointer_width)
1138-
.or_default()
1139-
.insert(sym::integer(target.pointer_width));
1107+
for target in TARGETS
1108+
.iter()
1109+
.map(|target| Target::expect_builtin(&TargetTriple::from_triple(target)))
1110+
{
1111+
self.values_valid
1112+
.entry(sym::target_os)
1113+
.or_default()
1114+
.insert(Symbol::intern(&target.options.os));
1115+
self.values_valid
1116+
.entry(sym::target_family)
1117+
.or_default()
1118+
.extend(target.options.families.iter().map(|family| Symbol::intern(family)));
1119+
self.values_valid
1120+
.entry(sym::target_arch)
1121+
.or_default()
1122+
.insert(Symbol::intern(&target.arch));
1123+
self.values_valid
1124+
.entry(sym::target_endian)
1125+
.or_default()
1126+
.insert(Symbol::intern(&target.options.endian.as_str()));
1127+
self.values_valid
1128+
.entry(sym::target_env)
1129+
.or_default()
1130+
.insert(Symbol::intern(&target.options.env));
1131+
self.values_valid
1132+
.entry(sym::target_abi)
1133+
.or_default()
1134+
.insert(Symbol::intern(&target.options.abi));
1135+
self.values_valid
1136+
.entry(sym::target_vendor)
1137+
.or_default()
1138+
.insert(Symbol::intern(&target.options.vendor));
1139+
self.values_valid
1140+
.entry(sym::target_pointer_width)
1141+
.or_default()
1142+
.insert(sym::integer(target.pointer_width));
1143+
}
1144+
}
1145+
1146+
// Target specific values
1147+
#[cfg(not(bootstrap))]
1148+
{
1149+
const VALUES: [&Symbol; 8] = [
1150+
&sym::target_os,
1151+
&sym::target_family,
1152+
&sym::target_arch,
1153+
&sym::target_endian,
1154+
&sym::target_env,
1155+
&sym::target_abi,
1156+
&sym::target_vendor,
1157+
&sym::target_pointer_width,
1158+
];
1159+
1160+
// Initialize (if not already initialized)
1161+
for &e in VALUES {
1162+
self.values_valid.entry(e).or_default();
1163+
}
1164+
1165+
// Get all values map at once otherwise it would be costly.
1166+
// (8 values * 220 targets ~= 1760 times, at the time of writing this comment).
1167+
let [
1168+
values_target_os,
1169+
values_target_family,
1170+
values_target_arch,
1171+
values_target_endian,
1172+
values_target_env,
1173+
values_target_abi,
1174+
values_target_vendor,
1175+
values_target_pointer_width,
1176+
] = self
1177+
.values_valid
1178+
.get_many_mut(VALUES)
1179+
.expect("unable to get all the check-cfg values buckets");
1180+
1181+
for target in TARGETS
1182+
.iter()
1183+
.map(|target| Target::expect_builtin(&TargetTriple::from_triple(target)))
1184+
{
1185+
values_target_os.insert(Symbol::intern(&target.options.os));
1186+
values_target_family
1187+
.extend(target.options.families.iter().map(|family| Symbol::intern(family)));
1188+
values_target_arch.insert(Symbol::intern(&target.arch));
1189+
values_target_endian.insert(Symbol::intern(&target.options.endian.as_str()));
1190+
values_target_env.insert(Symbol::intern(&target.options.env));
1191+
values_target_abi.insert(Symbol::intern(&target.options.abi));
1192+
values_target_vendor.insert(Symbol::intern(&target.options.vendor));
1193+
values_target_pointer_width.insert(sym::integer(target.pointer_width));
1194+
}
11401195
}
11411196
}
11421197

compiler/rustc_session/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![feature(once_cell)]
77
#![feature(option_get_or_insert_default)]
88
#![feature(rustc_attrs)]
9+
#![cfg_attr(not(bootstrap), feature(map_many_mut))]
910
#![recursion_limit = "256"]
1011
#![allow(rustc::potential_query_instability)]
1112

0 commit comments

Comments
 (0)