@@ -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