@@ -2,7 +2,7 @@ use std::borrow::Cow;
22use std:: collections:: BTreeMap ;
33use std:: str:: FromStr ;
44
5- use rustc_abi:: ExternAbi ;
5+ use rustc_abi:: { Align , AlignFromBytesError , ExternAbi } ;
66use serde_json:: Value ;
77
88use super :: { Target , TargetKind , TargetOptions , TargetWarnings } ;
@@ -57,6 +57,14 @@ impl Target {
5757 base. metadata . std = metadata. remove ( "std" ) . and_then ( |host| host. as_bool ( ) ) ;
5858 }
5959
60+ let alignment_error = |field_name : & str , error : AlignFromBytesError | -> String {
61+ let msg = match error {
62+ AlignFromBytesError :: NotPowerOfTwo ( _) => "not a power of 2 number of bytes" ,
63+ AlignFromBytesError :: TooLarge ( _) => "too large" ,
64+ } ;
65+ format ! ( "`{}` bits is not a valid value for {field_name}: {msg}" , error. align( ) * 8 )
66+ } ;
67+
6068 let mut incorrect_type = vec ! [ ] ;
6169
6270 macro_rules! key {
@@ -111,6 +119,15 @@ impl Target {
111119 base. $key_name = Some ( s. into( ) ) ;
112120 }
113121 } ) ;
122+ ( $key_name: ident, Option <Align >) => ( {
123+ let name = ( stringify!( $key_name) ) . replace( "_" , "-" ) ;
124+ if let Some ( b) = obj. remove( & name) . and_then( |b| b. as_u64( ) ) {
125+ match Align :: from_bits( b) {
126+ Ok ( align) => base. $key_name = Some ( align) ,
127+ Err ( e) => return Err ( alignment_error( & name, e) ) ,
128+ }
129+ }
130+ } ) ;
114131 ( $key_name: ident, BinaryFormat ) => ( {
115132 let name = ( stringify!( $key_name) ) . replace( "_" , "-" ) ;
116133 obj. remove( & name) . and_then( |f| f. as_str( ) . and_then( |s| {
@@ -617,7 +634,7 @@ impl Target {
617634 key ! ( crt_static_default, bool ) ;
618635 key ! ( crt_static_respected, bool ) ;
619636 key ! ( stack_probes, StackProbeType ) ?;
620- key ! ( min_global_align, Option <u64 >) ;
637+ key ! ( min_global_align, Option <Align >) ;
621638 key ! ( default_codegen_units, Option <u64 >) ;
622639 key ! ( default_codegen_backend, Option <StaticCow <str >>) ;
623640 key ! ( trap_unreachable, bool ) ;
0 commit comments