@@ -4,7 +4,7 @@ use rustc_hir::def_id::CrateNum;
44use  rustc_middle:: middle:: cstore:: { EncodedMetadata ,  LibSource ,  NativeLib } ; 
55use  rustc_middle:: middle:: dependency_format:: Linkage ; 
66use  rustc_session:: config:: { self ,  CFGuard ,  CrateType ,  DebugInfo } ; 
7- use  rustc_session:: config:: { OutputFilenames ,  OutputType ,  PrintRequest ,  Sanitizer } ; 
7+ use  rustc_session:: config:: { OutputFilenames ,  OutputType ,  PrintRequest ,  SanitizerSet } ; 
88use  rustc_session:: output:: { check_file_is_writeable,  invalid_output_for_target,  out_filename} ; 
99use  rustc_session:: search_paths:: PathKind ; 
1010use  rustc_session:: utils:: NativeLibKind ; 
@@ -766,23 +766,26 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
766766    } 
767767} 
768768
769- fn  link_sanitizer_runtime ( sess :  & Session ,  crate_type :  CrateType ,  linker :  & mut  dyn  Linker )  { 
770-     let  sanitizer = match  & sess. opts . debugging_opts . sanitizer  { 
771-         Some ( s)  => s, 
772-         None  => return , 
773-     } ; 
774- 
769+ fn  link_sanitizers ( sess :  & Session ,  crate_type :  CrateType ,  linker :  & mut  dyn  Linker )  { 
775770    if  crate_type != CrateType :: Executable  { 
776771        return ; 
777772    } 
773+     let  sanitizer = sess. opts . debugging_opts . sanitizer ; 
774+     if  sanitizer. contains ( SanitizerSet :: ADDRESS )  { 
775+         link_sanitizer_runtime ( sess,  linker,  "asan" ) ; 
776+     } 
777+     if  sanitizer. contains ( SanitizerSet :: LEAK )  { 
778+         link_sanitizer_runtime ( sess,  linker,  "lsan" ) ; 
779+     } 
780+     if  sanitizer. contains ( SanitizerSet :: MEMORY )  { 
781+         link_sanitizer_runtime ( sess,  linker,  "msan" ) ; 
782+     } 
783+     if  sanitizer. contains ( SanitizerSet :: THREAD )  { 
784+         link_sanitizer_runtime ( sess,  linker,  "tsan" ) ; 
785+     } 
786+ } 
778787
779-     let  name = match  sanitizer { 
780-         Sanitizer :: Address  => "asan" , 
781-         Sanitizer :: Leak  => "lsan" , 
782-         Sanitizer :: Memory  => "msan" , 
783-         Sanitizer :: Thread  => "tsan" , 
784-     } ; 
785- 
788+ fn  link_sanitizer_runtime ( sess :  & Session ,  linker :  & mut  dyn  Linker ,  name :  & str )  { 
786789    let  default_sysroot = filesearch:: get_or_default_sysroot ( ) ; 
787790    let  default_tlib =
788791        filesearch:: make_target_lib_path ( & default_sysroot,  sess. opts . target_triple . triple ( ) ) ; 
@@ -1548,9 +1551,10 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
15481551
15491552    // NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER 
15501553    if  sess. target . target . options . is_like_fuchsia  && crate_type == CrateType :: Executable  { 
1551-         let  prefix = match  sess. opts . debugging_opts . sanitizer  { 
1552-             Some ( Sanitizer :: Address )  => "asan/" , 
1553-             _ => "" , 
1554+         let  prefix = if  sess. opts . debugging_opts . sanitizer . contains ( SanitizerSet :: ADDRESS )  { 
1555+             "asan/" 
1556+         }  else  { 
1557+             "" 
15541558        } ; 
15551559        cmd. arg ( format ! ( "--dynamic-linker={}ld.so.1" ,  prefix) ) ; 
15561560    } 
@@ -1574,7 +1578,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
15741578    } 
15751579
15761580    // OBJECT-FILES-YES, AUDIT-ORDER 
1577-     link_sanitizer_runtime ( sess,  crate_type,  cmd) ; 
1581+     link_sanitizers ( sess,  crate_type,  cmd) ; 
15781582
15791583    // OBJECT-FILES-NO, AUDIT-ORDER 
15801584    // Linker plugins should be specified early in the list of arguments 
0 commit comments