@@ -40,14 +40,27 @@ pub struct Config {
4040 pub usize_ty : UintTy ,
4141}
4242
43- #[ derive( Clone , Hash , Debug ) ]
43+ #[ derive( Clone , Debug , Hash , PartialEq , Eq , PartialOrd , Ord ) ]
4444pub enum Sanitizer {
4545 Address ,
4646 Leak ,
4747 Memory ,
4848 Thread ,
4949}
5050
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+
5164#[ derive( Clone , Copy , Debug , PartialEq , Hash ) ]
5265pub enum OptLevel {
5366 No , // -O0
@@ -816,6 +829,9 @@ macro_rules! options {
816829 Some ( "one of: `full`, `partial`, or `off`" ) ;
817830 pub const parse_sanitizer: Option <& str > =
818831 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 ;
819835 pub const parse_linker_flavor: Option <& str > =
820836 Some ( :: rustc_target:: spec:: LinkerFlavor :: one_of( ) ) ;
821837 pub const parse_optimization_fuel: Option <& str > =
@@ -1010,15 +1026,46 @@ macro_rules! options {
10101026 true
10111027 }
10121028
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+ }
10201068 }
1021- true
10221069 }
10231070
10241071 fn parse_linker_flavor( slote: & mut Option <LinkerFlavor >, v: Option <& str >) -> bool {
@@ -1376,6 +1423,10 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
13761423 "pass `-install_name @rpath/...` to the macOS linker" ) ,
13771424 sanitizer: Option <Sanitizer > = ( None , parse_sanitizer, [ TRACKED ] ,
13781425 "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" ) ,
13791430 fuel: Option <( String , u64 ) > = ( None , parse_optimization_fuel, [ TRACKED ] ,
13801431 "set the optimization fuel quota for a crate" ) ,
13811432 print_fuel: Option <String > = ( None , parse_opt_string, [ TRACKED ] ,
@@ -2881,6 +2932,7 @@ mod dep_tracking {
28812932 Option <cstore:: NativeLibraryKind >
28822933 ) ) ;
28832934 impl_dep_tracking_hash_for_sortable_vec_of ! ( ( String , u64 ) ) ;
2935+ impl_dep_tracking_hash_for_sortable_vec_of ! ( Sanitizer ) ;
28842936
28852937 impl < T1 , T2 > DepTrackingHash for ( T1 , T2 )
28862938 where
0 commit comments