@@ -43,14 +43,27 @@ pub struct Config {
43
43
pub usize_ty : UintTy ,
44
44
}
45
45
46
- #[ derive( Clone , Hash , Debug ) ]
46
+ #[ derive( Clone , Debug , Hash , PartialEq , Eq , PartialOrd , Ord ) ]
47
47
pub enum Sanitizer {
48
48
Address ,
49
49
Leak ,
50
50
Memory ,
51
51
Thread ,
52
52
}
53
53
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
+
54
67
#[ derive( Clone , Copy , Debug , PartialEq , Hash ) ]
55
68
pub enum OptLevel {
56
69
No , // -O0
@@ -819,6 +832,9 @@ macro_rules! options {
819
832
Some ( "one of: `full`, `partial`, or `off`" ) ;
820
833
pub const parse_sanitizer: Option <& str > =
821
834
Some ( "one of: `address`, `leak`, `memory` or `thread`" ) ;
835
+ pub const parse_sanitizer_list: Option <& str > =
836
+ Some ( "comma separated list of sanitizers" ) ;
837
+ pub const parse_sanitizer_memory_track_origins: Option <& str > = None ;
822
838
pub const parse_linker_flavor: Option <& str > =
823
839
Some ( :: rustc_target:: spec:: LinkerFlavor :: one_of( ) ) ;
824
840
pub const parse_optimization_fuel: Option <& str > =
@@ -1013,15 +1029,46 @@ macro_rules! options {
1013
1029
true
1014
1030
}
1015
1031
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 ,
1032
+ fn parse_sanitizer( slot: & mut Option <Sanitizer >, v: Option <& str >) -> bool {
1033
+ if let Some ( Ok ( s) ) = v. map( str :: parse) {
1034
+ * slot = Some ( s) ;
1035
+ true
1036
+ } else {
1037
+ false
1038
+ }
1039
+ }
1040
+
1041
+ fn parse_sanitizer_list( slot: & mut Vec <Sanitizer >, v: Option <& str >) -> bool {
1042
+ if let Some ( v) = v {
1043
+ for s in v. split( ',' ) . map( str :: parse) {
1044
+ if let Ok ( s) = s {
1045
+ if !slot. contains( & s) {
1046
+ slot. push( s) ;
1047
+ }
1048
+ } else {
1049
+ return false ;
1050
+ }
1051
+ }
1052
+ true
1053
+ } else {
1054
+ false
1055
+ }
1056
+ }
1057
+
1058
+ fn parse_sanitizer_memory_track_origins( slot: & mut usize , v: Option <& str >) -> bool {
1059
+ match v. map( |s| s. parse( ) ) {
1060
+ None => {
1061
+ * slot = 2 ;
1062
+ true
1063
+ }
1064
+ Some ( Ok ( i) ) if i <= 2 => {
1065
+ * slot = i;
1066
+ true
1067
+ }
1068
+ _ => {
1069
+ false
1070
+ }
1023
1071
}
1024
- true
1025
1072
}
1026
1073
1027
1074
fn parse_linker_flavor( slote: & mut Option <LinkerFlavor >, v: Option <& str >) -> bool {
@@ -1379,6 +1426,10 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
1379
1426
"pass `-install_name @rpath/...` to the macOS linker" ) ,
1380
1427
sanitizer: Option <Sanitizer > = ( None , parse_sanitizer, [ TRACKED ] ,
1381
1428
"use a sanitizer" ) ,
1429
+ sanitizer_recover: Vec <Sanitizer > = ( vec![ ] , parse_sanitizer_list, [ TRACKED ] ,
1430
+ "Enable recovery for selected sanitizers" ) ,
1431
+ sanitizer_memory_track_origins: usize = ( 0 , parse_sanitizer_memory_track_origins, [ TRACKED ] ,
1432
+ "Enable origins tracking in MemorySanitizer" ) ,
1382
1433
fuel: Option <( String , u64 ) > = ( None , parse_optimization_fuel, [ TRACKED ] ,
1383
1434
"set the optimization fuel quota for a crate" ) ,
1384
1435
print_fuel: Option <String > = ( None , parse_opt_string, [ TRACKED ] ,
@@ -2984,6 +3035,7 @@ mod dep_tracking {
2984
3035
Option <cstore:: NativeLibraryKind >
2985
3036
) ) ;
2986
3037
impl_dep_tracking_hash_for_sortable_vec_of ! ( ( String , u64 ) ) ;
3038
+ impl_dep_tracking_hash_for_sortable_vec_of ! ( Sanitizer ) ;
2987
3039
2988
3040
impl < T1 , T2 > DepTrackingHash for ( T1 , T2 )
2989
3041
where
0 commit comments