@@ -2,7 +2,7 @@ use std::borrow::Cow;
2
2
use std:: collections:: BTreeMap ;
3
3
use std:: str:: FromStr ;
4
4
5
- use rustc_abi:: ExternAbi ;
5
+ use rustc_abi:: { Align , AlignFromBytesError , ExternAbi } ;
6
6
use serde_json:: Value ;
7
7
8
8
use super :: { Target , TargetKind , TargetOptions , TargetWarnings } ;
@@ -57,6 +57,14 @@ impl Target {
57
57
base. metadata . std = metadata. remove ( "std" ) . and_then ( |host| host. as_bool ( ) ) ;
58
58
}
59
59
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
+
60
68
let mut incorrect_type = vec ! [ ] ;
61
69
62
70
macro_rules! key {
@@ -111,6 +119,15 @@ impl Target {
111
119
base. $key_name = Some ( s. into( ) ) ;
112
120
}
113
121
} ) ;
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
+ } ) ;
114
131
( $key_name: ident, BinaryFormat ) => ( {
115
132
let name = ( stringify!( $key_name) ) . replace( "_" , "-" ) ;
116
133
obj. remove( & name) . and_then( |f| f. as_str( ) . and_then( |s| {
@@ -617,7 +634,7 @@ impl Target {
617
634
key ! ( crt_static_default, bool ) ;
618
635
key ! ( crt_static_respected, bool ) ;
619
636
key ! ( stack_probes, StackProbeType ) ?;
620
- key ! ( min_global_align, Option <u64 >) ;
637
+ key ! ( min_global_align, Option <Align >) ;
621
638
key ! ( default_codegen_units, Option <u64 >) ;
622
639
key ! ( default_codegen_backend, Option <StaticCow <str >>) ;
623
640
key ! ( trap_unreachable, bool ) ;
0 commit comments