@@ -13,6 +13,7 @@ use rustc_data_structures::impl_stable_hash_via_hash;
13
13
14
14
use rustc_target:: abi:: { Align , TargetDataLayout } ;
15
15
use rustc_target:: spec:: { LinkerFlavor , SplitDebuginfo , Target , TargetTriple , TargetWarnings } ;
16
+ use rustc_target:: spec:: { PanicStrategy , SanitizerSet , TARGETS } ;
16
17
17
18
use rustc_serialize:: json;
18
19
@@ -1067,8 +1068,9 @@ pub fn to_crate_check_config(cfg: CheckCfg) -> CrateCheckConfig {
1067
1068
1068
1069
impl CrateCheckConfig {
1069
1070
/// Fills a `CrateCheckConfig` with well-known configuration names.
1070
- pub fn fill_well_known ( & mut self ) {
1071
- // NOTE: This should be kept in sync with `default_configuration`
1071
+ fn fill_well_known_names ( & mut self ) {
1072
+ // NOTE: This should be kept in sync with `default_configuration` and
1073
+ // `fill_well_known_values`
1072
1074
const WELL_KNOWN_NAMES : & [ Symbol ] = & [
1073
1075
sym:: unix,
1074
1076
sym:: windows,
@@ -1093,13 +1095,108 @@ impl CrateCheckConfig {
1093
1095
sym:: doctest,
1094
1096
sym:: feature,
1095
1097
] ;
1098
+
1099
+ // We only insert well-known names if `names()` was activated
1096
1100
if let Some ( names_valid) = & mut self . names_valid {
1097
- for & name in WELL_KNOWN_NAMES {
1098
- names_valid. insert ( name) ;
1099
- }
1101
+ names_valid. extend ( WELL_KNOWN_NAMES ) ;
1100
1102
}
1101
1103
}
1102
1104
1105
+ /// Fills a `CrateCheckConfig` with well-known configuration values.
1106
+ fn fill_well_known_values ( & mut self ) {
1107
+ if !self . well_known_values {
1108
+ return ;
1109
+ }
1110
+
1111
+ // NOTE: This should be kept in sync with `default_configuration` and
1112
+ // `fill_well_known_names`
1113
+
1114
+ let panic_values = & PanicStrategy :: all ( ) ;
1115
+
1116
+ let atomic_values = & [
1117
+ sym:: ptr,
1118
+ sym:: integer ( 8usize ) ,
1119
+ sym:: integer ( 16usize ) ,
1120
+ sym:: integer ( 32usize ) ,
1121
+ sym:: integer ( 64usize ) ,
1122
+ sym:: integer ( 128usize ) ,
1123
+ ] ;
1124
+
1125
+ let sanitize_values = SanitizerSet :: all ( )
1126
+ . into_iter ( )
1127
+ . map ( |sanitizer| Symbol :: intern ( sanitizer. as_str ( ) . unwrap ( ) ) ) ;
1128
+
1129
+ // No-values
1130
+ for name in [
1131
+ sym:: unix,
1132
+ sym:: windows,
1133
+ sym:: debug_assertions,
1134
+ sym:: proc_macro,
1135
+ sym:: test,
1136
+ sym:: doc,
1137
+ sym:: doctest,
1138
+ sym:: target_thread_local,
1139
+ ] {
1140
+ self . values_valid . entry ( name) . or_default ( ) ;
1141
+ }
1142
+
1143
+ // Pre-defined values
1144
+ self . values_valid . entry ( sym:: panic) . or_default ( ) . extend ( panic_values) ;
1145
+ self . values_valid . entry ( sym:: sanitize) . or_default ( ) . extend ( sanitize_values) ;
1146
+ self . values_valid . entry ( sym:: target_has_atomic) . or_default ( ) . extend ( atomic_values) ;
1147
+ self . values_valid
1148
+ . entry ( sym:: target_has_atomic_load_store)
1149
+ . or_default ( )
1150
+ . extend ( atomic_values) ;
1151
+ self . values_valid
1152
+ . entry ( sym:: target_has_atomic_equal_alignment)
1153
+ . or_default ( )
1154
+ . extend ( atomic_values) ;
1155
+
1156
+ // Target specific values
1157
+ for target in
1158
+ TARGETS . iter ( ) . map ( |target| Target :: expect_builtin ( & TargetTriple :: from_triple ( target) ) )
1159
+ {
1160
+ self . values_valid
1161
+ . entry ( sym:: target_os)
1162
+ . or_default ( )
1163
+ . insert ( Symbol :: intern ( & target. options . os ) ) ;
1164
+ self . values_valid
1165
+ . entry ( sym:: target_family)
1166
+ . or_default ( )
1167
+ . extend ( target. options . families . iter ( ) . map ( |family| Symbol :: intern ( family) ) ) ;
1168
+ self . values_valid
1169
+ . entry ( sym:: target_arch)
1170
+ . or_default ( )
1171
+ . insert ( Symbol :: intern ( & target. arch ) ) ;
1172
+ self . values_valid
1173
+ . entry ( sym:: target_endian)
1174
+ . or_default ( )
1175
+ . insert ( Symbol :: intern ( & target. options . endian . as_str ( ) ) ) ;
1176
+ self . values_valid
1177
+ . entry ( sym:: target_env)
1178
+ . or_default ( )
1179
+ . insert ( Symbol :: intern ( & target. options . env ) ) ;
1180
+ self . values_valid
1181
+ . entry ( sym:: target_abi)
1182
+ . or_default ( )
1183
+ . insert ( Symbol :: intern ( & target. options . abi ) ) ;
1184
+ self . values_valid
1185
+ . entry ( sym:: target_vendor)
1186
+ . or_default ( )
1187
+ . insert ( Symbol :: intern ( & target. options . vendor ) ) ;
1188
+ self . values_valid
1189
+ . entry ( sym:: target_pointer_width)
1190
+ . or_default ( )
1191
+ . insert ( sym:: integer ( target. pointer_width ) ) ;
1192
+ }
1193
+ }
1194
+
1195
+ pub fn fill_well_known ( & mut self ) {
1196
+ self . fill_well_known_names ( ) ;
1197
+ self . fill_well_known_values ( ) ;
1198
+ }
1199
+
1103
1200
/// Fills a `CrateCheckConfig` with configuration names and values that are actually active.
1104
1201
pub fn fill_actual ( & mut self , cfg : & CrateConfig ) {
1105
1202
for & ( k, v) in cfg {
0 commit comments