@@ -305,6 +305,42 @@ impl ToJson for RelocModel {
305
305
}
306
306
}
307
307
308
+ #[ derive( Clone , Copy , PartialEq , Hash , Debug ) ]
309
+ pub enum TlsModel {
310
+ GeneralDynamic ,
311
+ LocalDynamic ,
312
+ InitialExec ,
313
+ LocalExec ,
314
+ }
315
+
316
+ impl FromStr for TlsModel {
317
+ type Err = ( ) ;
318
+
319
+ fn from_str ( s : & str ) -> Result < TlsModel , ( ) > {
320
+ Ok ( match s {
321
+ // Note the difference "general" vs "global" difference. The model name is "general",
322
+ // but the user-facing option name is "global" for consistency with other compilers.
323
+ "global-dynamic" => TlsModel :: GeneralDynamic ,
324
+ "local-dynamic" => TlsModel :: LocalDynamic ,
325
+ "initial-exec" => TlsModel :: InitialExec ,
326
+ "local-exec" => TlsModel :: LocalExec ,
327
+ _ => return Err ( ( ) ) ,
328
+ } )
329
+ }
330
+ }
331
+
332
+ impl ToJson for TlsModel {
333
+ fn to_json ( & self ) -> Json {
334
+ match * self {
335
+ TlsModel :: GeneralDynamic => "global-dynamic" ,
336
+ TlsModel :: LocalDynamic => "local-dynamic" ,
337
+ TlsModel :: InitialExec => "initial-exec" ,
338
+ TlsModel :: LocalExec => "local-exec" ,
339
+ }
340
+ . to_json ( )
341
+ }
342
+ }
343
+
308
344
pub enum LoadTargetError {
309
345
BuiltinTargetNotFound ( String ) ,
310
346
Other ( String ) ,
@@ -660,7 +696,7 @@ pub struct TargetOptions {
660
696
pub code_model : Option < String > ,
661
697
/// TLS model to use. Options are "global-dynamic" (default), "local-dynamic", "initial-exec"
662
698
/// and "local-exec". This is similar to the -ftls-model option in GCC/Clang.
663
- pub tls_model : String ,
699
+ pub tls_model : TlsModel ,
664
700
/// Do not emit code that uses the "red zone", if the ABI has one. Defaults to false.
665
701
pub disable_redzone : bool ,
666
702
/// Eliminate frame pointers from stack frames if possible. Defaults to true.
@@ -863,7 +899,7 @@ impl Default for TargetOptions {
863
899
executables : false ,
864
900
relocation_model : RelocModel :: Pic ,
865
901
code_model : None ,
866
- tls_model : "global-dynamic" . to_string ( ) ,
902
+ tls_model : TlsModel :: GeneralDynamic ,
867
903
disable_redzone : false ,
868
904
eliminate_frame_pointer : true ,
869
905
function_sections : true ,
@@ -1060,6 +1096,18 @@ impl Target {
1060
1096
Some ( Ok ( ( ) ) )
1061
1097
} ) ) . unwrap_or( Ok ( ( ) ) )
1062
1098
} ) ;
1099
+ ( $key_name: ident, TlsModel ) => ( {
1100
+ let name = ( stringify!( $key_name) ) . replace( "_" , "-" ) ;
1101
+ obj. find( & name[ ..] ) . and_then( |o| o. as_string( ) . and_then( |s| {
1102
+ match s. parse:: <TlsModel >( ) {
1103
+ Ok ( tls_model) => base. options. $key_name = tls_model,
1104
+ _ => return Some ( Err ( format!( "'{}' is not a valid TLS model. \
1105
+ Run `rustc --print tls-models` to \
1106
+ see the list of supported values.", s) ) ) ,
1107
+ }
1108
+ Some ( Ok ( ( ) ) )
1109
+ } ) ) . unwrap_or( Ok ( ( ) ) )
1110
+ } ) ;
1063
1111
( $key_name: ident, PanicStrategy ) => ( {
1064
1112
let name = ( stringify!( $key_name) ) . replace( "_" , "-" ) ;
1065
1113
obj. find( & name[ ..] ) . and_then( |o| o. as_string( ) . and_then( |s| {
@@ -1200,7 +1248,7 @@ impl Target {
1200
1248
key ! ( executables, bool ) ;
1201
1249
key ! ( relocation_model, RelocModel ) ?;
1202
1250
key ! ( code_model, optional) ;
1203
- key ! ( tls_model) ;
1251
+ key ! ( tls_model, TlsModel ) ? ;
1204
1252
key ! ( disable_redzone, bool ) ;
1205
1253
key ! ( eliminate_frame_pointer, bool ) ;
1206
1254
key ! ( function_sections, bool ) ;
0 commit comments