Skip to content

Commit b89e852

Browse files
committed
report an error when building proc-macro crates with sanitizers. some changes to control flow for readability
1 parent 0c285fb commit b89e852

File tree

1 file changed

+39
-22
lines changed

1 file changed

+39
-22
lines changed

src/librustc_metadata/creader.rs

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -803,38 +803,55 @@ impl<'a> CrateLoader<'a> {
803803
return
804804
}
805805

806+
let any_unsupported = self.sess.crate_types.borrow().iter().any(|ct| {
807+
match *ct {
808+
config::CrateType::Executable |
809+
config::CrateType::Staticlib |
810+
config::CrateType::Cdylib |
811+
config::CrateType::Dylib |
812+
config::CrateType::Rlib => false,
813+
_ => true,
814+
}
815+
});
816+
if any_unsupported {
817+
self.sess.err("Only executables, staticlibs, cdylibs, dylibs and rlibs can be compiled \
818+
with `-Z sanitizer`");
819+
self.sess.injected_sanitizer_runtime.set(None);
820+
return
821+
}
822+
806823
let mut uses_std = false;
807824
self.cstore.iter_crate_data(|_, data| {
808825
if data.name == sym::std {
809826
uses_std = true;
810827
}
811828
});
829+
if !uses_std {
830+
self.sess.err("Must link std to be compiled with `-Z sanitizer`");
831+
return
832+
}
812833

813-
if uses_std {
814-
let name = match *sanitizer {
815-
Sanitizer::Address => "rustc_asan",
816-
Sanitizer::Leak => "rustc_lsan",
817-
Sanitizer::Memory => "rustc_msan",
818-
Sanitizer::Thread => "rustc_tsan",
819-
};
820-
info!("loading sanitizer: {}", name);
834+
let name = match *sanitizer {
835+
Sanitizer::Address => "rustc_asan",
836+
Sanitizer::Leak => "rustc_lsan",
837+
Sanitizer::Memory => "rustc_msan",
838+
Sanitizer::Thread => "rustc_tsan",
839+
};
840+
info!("loading sanitizer: {}", name);
821841

822-
let symbol = Symbol::intern(name);
823-
let dep_kind = DepKind::Implicit;
824-
let (cnum, data) =
825-
self.resolve_crate(&None, symbol, symbol, None, None, DUMMY_SP,
826-
PathKind::Crate, dep_kind)
827-
.unwrap_or_else(|err| err.report());
842+
let symbol = Symbol::intern(name);
843+
let dep_kind = DepKind::Implicit;
844+
let (cnum, data) =
845+
self.resolve_crate(&None, symbol, symbol, None, None, DUMMY_SP,
846+
PathKind::Crate, dep_kind)
847+
.unwrap_or_else(|err| err.report());
828848

829-
// Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
830-
if !data.root.sanitizer_runtime {
831-
self.sess.err(&format!("the crate `{}` is not a sanitizer runtime",
832-
name));
833-
}
834-
self.sess.injected_sanitizer_runtime.set(Some(cnum));
835-
} else {
836-
self.sess.err("Must link std to be compiled with `-Z sanitizer`");
849+
// Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
850+
if !data.root.sanitizer_runtime {
851+
self.sess.err(&format!("the crate `{}` is not a sanitizer runtime",
852+
name));
837853
}
854+
self.sess.injected_sanitizer_runtime.set(Some(cnum));
838855
}
839856

840857
fn inject_profiler_runtime(&mut self) {

0 commit comments

Comments
 (0)