@@ -40,14 +40,27 @@ pub struct Config {
40
40
pub usize_ty : UintTy ,
41
41
}
42
42
43
- #[ derive( Clone , Hash , Debug ) ]
43
+ #[ derive( Clone , Debug , Hash , PartialEq , Eq , PartialOrd , Ord ) ]
44
44
pub enum Sanitizer {
45
45
Address ,
46
46
Leak ,
47
47
Memory ,
48
48
Thread ,
49
49
}
50
50
51
+ impl FromStr for Sanitizer {
52
+ type Err = ( ) ;
53
+ fn from_str ( s : & str ) -> Result < Sanitizer , ( ) > {
54
+ match s {
55
+ "address" => Ok ( Sanitizer :: Address ) ,
56
+ "leak" => Ok ( Sanitizer :: Leak ) ,
57
+ "memory" => Ok ( Sanitizer :: Memory ) ,
58
+ "thread" => Ok ( Sanitizer :: Thread ) ,
59
+ _ => Err ( ( ) ) ,
60
+ }
61
+ }
62
+ }
63
+
51
64
#[ derive( Clone , Copy , Debug , PartialEq , Hash ) ]
52
65
pub enum OptLevel {
53
66
No , // -O0
@@ -816,6 +829,9 @@ macro_rules! options {
816
829
Some ( "one of: `full`, `partial`, or `off`" ) ;
817
830
pub const parse_sanitizer: Option <& str > =
818
831
Some ( "one of: `address`, `leak`, `memory` or `thread`" ) ;
832
+ pub const parse_sanitizer_list: Option <& str > =
833
+ Some ( "comma separated list of sanitizers" ) ;
834
+ pub const parse_sanitizer_memory_track_origins: Option <& str > = None ;
819
835
pub const parse_linker_flavor: Option <& str > =
820
836
Some ( :: rustc_target:: spec:: LinkerFlavor :: one_of( ) ) ;
821
837
pub const parse_optimization_fuel: Option <& str > =
@@ -1010,15 +1026,46 @@ macro_rules! options {
1010
1026
true
1011
1027
}
1012
1028
1013
- fn parse_sanitizer( slote: & mut Option <Sanitizer >, v: Option <& str >) -> bool {
1014
- match v {
1015
- Some ( "address" ) => * slote = Some ( Sanitizer :: Address ) ,
1016
- Some ( "leak" ) => * slote = Some ( Sanitizer :: Leak ) ,
1017
- Some ( "memory" ) => * slote = Some ( Sanitizer :: Memory ) ,
1018
- Some ( "thread" ) => * slote = Some ( Sanitizer :: Thread ) ,
1019
- _ => return false ,
1029
+ fn parse_sanitizer( slot: & mut Option <Sanitizer >, v: Option <& str >) -> bool {
1030
+ if let Some ( Ok ( s) ) = v. map( str :: parse) {
1031
+ * slot = Some ( s) ;
1032
+ true
1033
+ } else {
1034
+ false
1035
+ }
1036
+ }
1037
+
1038
+ fn parse_sanitizer_list( slot: & mut Vec <Sanitizer >, v: Option <& str >) -> bool {
1039
+ if let Some ( v) = v {
1040
+ for s in v. split( ',' ) . map( str :: parse) {
1041
+ if let Ok ( s) = s {
1042
+ if !slot. contains( & s) {
1043
+ slot. push( s) ;
1044
+ }
1045
+ } else {
1046
+ return false ;
1047
+ }
1048
+ }
1049
+ true
1050
+ } else {
1051
+ false
1052
+ }
1053
+ }
1054
+
1055
+ fn parse_sanitizer_memory_track_origins( slot: & mut usize , v: Option <& str >) -> bool {
1056
+ match v. map( |s| s. parse( ) ) {
1057
+ None => {
1058
+ * slot = 2 ;
1059
+ true
1060
+ }
1061
+ Some ( Ok ( i) ) if i <= 2 => {
1062
+ * slot = i;
1063
+ true
1064
+ }
1065
+ _ => {
1066
+ false
1067
+ }
1020
1068
}
1021
- true
1022
1069
}
1023
1070
1024
1071
fn parse_linker_flavor( slote: & mut Option <LinkerFlavor >, v: Option <& str >) -> bool {
@@ -1376,6 +1423,10 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
1376
1423
"pass `-install_name @rpath/...` to the macOS linker" ) ,
1377
1424
sanitizer: Option <Sanitizer > = ( None , parse_sanitizer, [ TRACKED ] ,
1378
1425
"use a sanitizer" ) ,
1426
+ sanitizer_recover: Vec <Sanitizer > = ( vec![ ] , parse_sanitizer_list, [ TRACKED ] ,
1427
+ "Enable recovery for selected sanitizers" ) ,
1428
+ sanitizer_memory_track_origins: usize = ( 0 , parse_sanitizer_memory_track_origins, [ TRACKED ] ,
1429
+ "Enable origins tracking in MemorySanitizer" ) ,
1379
1430
fuel: Option <( String , u64 ) > = ( None , parse_optimization_fuel, [ TRACKED ] ,
1380
1431
"set the optimization fuel quota for a crate" ) ,
1381
1432
print_fuel: Option <String > = ( None , parse_opt_string, [ TRACKED ] ,
@@ -2881,6 +2932,7 @@ mod dep_tracking {
2881
2932
Option <cstore:: NativeLibraryKind >
2882
2933
) ) ;
2883
2934
impl_dep_tracking_hash_for_sortable_vec_of ! ( ( String , u64 ) ) ;
2935
+ impl_dep_tracking_hash_for_sortable_vec_of ! ( Sanitizer ) ;
2884
2936
2885
2937
impl < T1 , T2 > DepTrackingHash for ( T1 , T2 )
2886
2938
where
0 commit comments