@@ -43,14 +43,27 @@ pub struct Config {
4343 pub usize_ty : UintTy ,
4444}
4545
46- #[ derive( Clone , Hash , Debug ) ]
46+ #[ derive( Clone , Debug , Hash , PartialEq , Eq , PartialOrd , Ord ) ]
4747pub enum Sanitizer {
4848 Address ,
4949 Leak ,
5050 Memory ,
5151 Thread ,
5252}
5353
54+ impl FromStr for Sanitizer {
55+ type Err = ( ) ;
56+ fn from_str ( s : & str ) -> Result < Sanitizer , ( ) > {
57+ match s {
58+ "address" => Ok ( Sanitizer :: Address ) ,
59+ "leak" => Ok ( Sanitizer :: Leak ) ,
60+ "memory" => Ok ( Sanitizer :: Memory ) ,
61+ "thread" => Ok ( Sanitizer :: Thread ) ,
62+ _ => Err ( ( ) ) ,
63+ }
64+ }
65+ }
66+
5467#[ derive( Clone , Copy , Debug , PartialEq , Hash ) ]
5568pub enum OptLevel {
5669 No , // -O0
@@ -819,6 +832,8 @@ macro_rules! options {
819832 Some ( "one of: `full`, `partial`, or `off`" ) ;
820833 pub const parse_sanitizer: Option <& str > =
821834 Some ( "one of: `address`, `leak`, `memory` or `thread`" ) ;
835+ pub const parse_sanitizer_list: Option <& str > =
836+ Some ( "comma separated list of sanitizers" ) ;
822837 pub const parse_linker_flavor: Option <& str > =
823838 Some ( :: rustc_target:: spec:: LinkerFlavor :: one_of( ) ) ;
824839 pub const parse_optimization_fuel: Option <& str > =
@@ -1013,15 +1028,30 @@ macro_rules! options {
10131028 true
10141029 }
10151030
1016- fn parse_sanitizer( slote: & mut Option <Sanitizer >, v: Option <& str >) -> bool {
1017- match v {
1018- Some ( "address" ) => * slote = Some ( Sanitizer :: Address ) ,
1019- Some ( "leak" ) => * slote = Some ( Sanitizer :: Leak ) ,
1020- Some ( "memory" ) => * slote = Some ( Sanitizer :: Memory ) ,
1021- Some ( "thread" ) => * slote = Some ( Sanitizer :: Thread ) ,
1022- _ => return false ,
1031+ fn parse_sanitizer( slot: & mut Option <Sanitizer >, v: Option <& str >) -> bool {
1032+ if let Some ( Ok ( s) ) = v. map( str :: parse) {
1033+ * slot = Some ( s) ;
1034+ true
1035+ } else {
1036+ false
1037+ }
1038+ }
1039+
1040+ fn parse_sanitizer_list( slot: & mut Vec <Sanitizer >, v: Option <& str >) -> bool {
1041+ if let Some ( v) = v {
1042+ for s in v. split( ',' ) . map( str :: parse) {
1043+ if let Ok ( s) = s {
1044+ if !slot. contains( & s) {
1045+ slot. push( s) ;
1046+ }
1047+ } else {
1048+ return false ;
1049+ }
1050+ }
1051+ true
1052+ } else {
1053+ false
10231054 }
1024- true
10251055 }
10261056
10271057 fn parse_linker_flavor( slote: & mut Option <LinkerFlavor >, v: Option <& str >) -> bool {
@@ -1379,6 +1409,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
13791409 "pass `-install_name @rpath/...` to the macOS linker" ) ,
13801410 sanitizer: Option <Sanitizer > = ( None , parse_sanitizer, [ TRACKED ] ,
13811411 "use a sanitizer" ) ,
1412+ sanitizer_recover: Vec <Sanitizer > = ( vec![ ] , parse_sanitizer_list, [ TRACKED ] ,
1413+ "Enable recovery for selected sanitizers" ) ,
13821414 fuel: Option <( String , u64 ) > = ( None , parse_optimization_fuel, [ TRACKED ] ,
13831415 "set the optimization fuel quota for a crate" ) ,
13841416 print_fuel: Option <String > = ( None , parse_opt_string, [ TRACKED ] ,
@@ -2984,6 +3016,7 @@ mod dep_tracking {
29843016 Option <cstore:: NativeLibraryKind >
29853017 ) ) ;
29863018 impl_dep_tracking_hash_for_sortable_vec_of ! ( ( String , u64 ) ) ;
3019+ impl_dep_tracking_hash_for_sortable_vec_of ! ( Sanitizer ) ;
29873020
29883021 impl < T1 , T2 > DepTrackingHash for ( T1 , T2 )
29893022 where
0 commit comments