@@ -4,7 +4,7 @@ use rustc_hir::def_id::CrateNum;
4
4
use rustc_middle:: middle:: cstore:: { EncodedMetadata , LibSource , NativeLib } ;
5
5
use rustc_middle:: middle:: dependency_format:: Linkage ;
6
6
use 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 } ;
8
8
use rustc_session:: output:: { check_file_is_writeable, invalid_output_for_target, out_filename} ;
9
9
use rustc_session:: search_paths:: PathKind ;
10
10
use rustc_session:: utils:: NativeLibKind ;
@@ -766,23 +766,26 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
766
766
}
767
767
}
768
768
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 ) {
775
770
if crate_type != CrateType :: Executable {
776
771
return ;
777
772
}
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
+ }
778
787
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 ) {
786
789
let default_sysroot = filesearch:: get_or_default_sysroot ( ) ;
787
790
let default_tlib =
788
791
filesearch:: make_target_lib_path ( & default_sysroot, sess. opts . target_triple . triple ( ) ) ;
@@ -1555,9 +1558,10 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
1555
1558
1556
1559
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
1557
1560
if sess. target . target . options . is_like_fuchsia && crate_type == CrateType :: Executable {
1558
- let prefix = match sess. opts . debugging_opts . sanitizer {
1559
- Some ( Sanitizer :: Address ) => "asan/" ,
1560
- _ => "" ,
1561
+ let prefix = if sess. opts . debugging_opts . sanitizer . contains ( SanitizerSet :: ADDRESS ) {
1562
+ "asan/"
1563
+ } else {
1564
+ ""
1561
1565
} ;
1562
1566
cmd. arg ( format ! ( "--dynamic-linker={}ld.so.1" , prefix) ) ;
1563
1567
}
@@ -1581,7 +1585,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
1581
1585
}
1582
1586
1583
1587
// OBJECT-FILES-YES, AUDIT-ORDER
1584
- link_sanitizer_runtime ( sess, crate_type, cmd) ;
1588
+ link_sanitizers ( sess, crate_type, cmd) ;
1585
1589
1586
1590
// OBJECT-FILES-NO, AUDIT-ORDER
1587
1591
// Linker plugins should be specified early in the list of arguments
0 commit comments