@@ -13,6 +13,7 @@ use rustc_data_structures::impl_stable_hash_via_hash;
1313
1414use rustc_target:: abi:: { Align , TargetDataLayout } ;
1515use rustc_target:: spec:: { LinkerFlavor , SplitDebuginfo , Target , TargetTriple , TargetWarnings } ;
16+ use rustc_target:: spec:: { PanicStrategy , SanitizerSet , TARGETS } ;
1617
1718use rustc_serialize:: json;
1819
@@ -1067,8 +1068,9 @@ pub fn to_crate_check_config(cfg: CheckCfg) -> CrateCheckConfig {
10671068
10681069impl CrateCheckConfig {
10691070 /// 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`
10721074 const WELL_KNOWN_NAMES : & [ Symbol ] = & [
10731075 sym:: unix,
10741076 sym:: windows,
@@ -1093,13 +1095,108 @@ impl CrateCheckConfig {
10931095 sym:: doctest,
10941096 sym:: feature,
10951097 ] ;
1098+
1099+ // We only insert well-known names if `names()` was activated
10961100 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 ) ;
11001102 }
11011103 }
11021104
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+
11031200 /// Fills a `CrateCheckConfig` with configuration names and values that are actually active.
11041201 pub fn fill_actual ( & mut self , cfg : & CrateConfig ) {
11051202 for & ( k, v) in cfg {
0 commit comments