blob: 9d166b174b1fdc2123932c3d52fa94e1b7bf7f22 [file] [log] [blame]
Sanitizer runtimes are currently behind the `-Z` flag, which is only available
on nightly builds of the compiler. We would like to enable fuzzing on chrome
os anyway so move the sanitizer option under `-C` instead since we don't build
the toolchain in nightly mode.
diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
index a9e4fdba030..df78eaa7a75 100644
--- a/src/librustc_codegen_llvm/attributes.rs
+++ b/src/librustc_codegen_llvm/attributes.rs
@@ -49,7 +49,7 @@ fn inline(cx: &CodegenCx<'ll, '_>, val: &'ll Value, inline: InlineAttr) {
/// Apply LLVM sanitize attributes.
#[inline]
pub fn sanitize(cx: &CodegenCx<'ll, '_>, codegen_fn_flags: CodegenFnAttrFlags, llfn: &'ll Value) {
- if let Some(ref sanitizer) = cx.tcx.sess.opts.debugging_opts.sanitizer {
+ if let Some(ref sanitizer) = cx.tcx.sess.opts.cg.sanitizer {
match *sanitizer {
Sanitizer::Address => {
if !codegen_fn_flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
@@ -141,7 +141,7 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
// Currently stack probes seem somewhat incompatible with the address
// sanitizer and thread sanitizer. With asan we're already protected from
// stack overflow anyway so we don't really need stack probes regardless.
- match cx.sess().opts.debugging_opts.sanitizer {
+ match cx.sess().opts.cg.sanitizer {
Some(Sanitizer::Address) | Some(Sanitizer::Thread) => return,
_ => {}
}
diff --git a/src/librustc_codegen_llvm/builder.rs b/src/librustc_codegen_llvm/builder.rs
index 32604d5601d..fd6176ed061 100644
--- a/src/librustc_codegen_llvm/builder.rs
+++ b/src/librustc_codegen_llvm/builder.rs
@@ -1244,7 +1244,7 @@ impl Builder<'a, 'll, 'tcx> {
}
let opts = &self.cx.sess().opts;
- let emit = match opts.debugging_opts.sanitizer {
+ let emit = match opts.cg.sanitizer {
// Some sanitizer use lifetime intrinsics. When they are in use,
// emit lifetime intrinsics regardless of optimization level.
Some(Sanitizer::Address) | Some(Sanitizer::Memory) => true,
diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
index 0dd2f029e8d..2ada4518cc7 100644
--- a/src/librustc_codegen_ssa/back/link.rs
+++ b/src/librustc_codegen_ssa/back/link.rs
@@ -507,7 +507,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
cmd.args(&sess.opts.debugging_opts.pre_link_arg);
if sess.target.target.options.is_like_fuchsia {
- let prefix = match sess.opts.debugging_opts.sanitizer {
+ let prefix = match sess.opts.cg.sanitizer {
Some(Sanitizer::Address) => "asan/",
_ => "",
};
@@ -746,7 +746,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
}
fn link_sanitizer_runtime(sess: &Session, crate_type: config::CrateType, linker: &mut dyn Linker) {
- let sanitizer = match &sess.opts.debugging_opts.sanitizer {
+ let sanitizer = match &sess.opts.cg.sanitizer {
Some(s) => s,
None => return,
};
@@ -780,7 +780,11 @@ fn link_sanitizer_runtime(sess: &Session, crate_type: config::CrateType, linker:
linker.args(&["-Wl,-rpath".into(), "-Xlinker".into(), rpath.into()]);
linker.link_dylib(Symbol::intern(&libname));
}
- "x86_64-unknown-linux-gnu" | "x86_64-fuchsia" | "aarch64-fuchsia" => {
+ "x86_64-unknown-linux-gnu"
+ | "x86_64-fuchsia"
+ | "aarch64-fuchsia"
+ | "x86_64-cros-linux-gnu"
+ | "x86_64-pc-linux-gnu" => {
let filename = format!("librustc{}_rt.{}.a", channel, name);
let path = default_tlib.join(&filename);
linker.link_whole_rlib(&path);
diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs
index 3fe256ce25b..1604704ce6d 100644
--- a/src/librustc_codegen_ssa/back/symbol_export.rs
+++ b/src/librustc_codegen_ssa/back/symbol_export.rs
@@ -204,7 +204,7 @@ fn exported_symbols_provider_local(
}));
}
- if let Some(Sanitizer::Memory) = tcx.sess.opts.debugging_opts.sanitizer {
+ if let Some(Sanitizer::Memory) = tcx.sess.opts.cg.sanitizer {
// Similar to profiling, preserve weak msan symbol during LTO.
const MSAN_WEAK_SYMBOLS: [&str; 2] = ["__msan_track_origins", "__msan_keep_going"];
diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
index 3afa4758253..5d0f7435374 100644
--- a/src/librustc_codegen_ssa/back/write.rs
+++ b/src/librustc_codegen_ssa/back/write.rs
@@ -369,7 +369,7 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
modules_config.pgo_gen = sess.opts.cg.profile_generate.clone();
modules_config.pgo_use = sess.opts.cg.profile_use.clone();
- modules_config.sanitizer = sess.opts.debugging_opts.sanitizer.clone();
+ modules_config.sanitizer = sess.opts.cg.sanitizer.clone();
modules_config.sanitizer_recover = sess.opts.debugging_opts.sanitizer_recover.clone();
modules_config.sanitizer_memory_track_origins =
sess.opts.debugging_opts.sanitizer_memory_track_origins;
diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
index b6802505df7..40608fd94ff 100644
--- a/src/librustc_mir/transform/inline.rs
+++ b/src/librustc_mir/transform/inline.rs
@@ -231,7 +231,7 @@ impl Inliner<'tcx> {
// Avoid inlining functions marked as no_sanitize if sanitizer is enabled,
// since instrumentation might be enabled and performed on the caller.
- match self.tcx.sess.opts.debugging_opts.sanitizer {
+ match self.tcx.sess.opts.cg.sanitizer {
Some(Sanitizer::Address) => {
if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
return false;
diff --git a/src/librustc_session/config.rs b/src/librustc_session/config.rs
index c273e7fdbf9..1e0f80d9e83 100644
--- a/src/librustc_session/config.rs
+++ b/src/librustc_session/config.rs
@@ -716,7 +716,7 @@ pub fn default_configuration(sess: &Session) -> CrateConfig {
}
}
}
- if let Some(s) = &sess.opts.debugging_opts.sanitizer {
+ if let Some(s) = &sess.opts.cg.sanitizer {
let symbol = Symbol::intern(&s.to_string());
ret.insert((sym::sanitize, Some(symbol)));
}
diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs
index a1ecf4e8528..9cfc99b8ae2 100644
--- a/src/librustc_session/options.rs
+++ b/src/librustc_session/options.rs
@@ -699,6 +699,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
"allow the linker to link its default libraries"),
linker_flavor: Option<LinkerFlavor> = (None, parse_linker_flavor, [UNTRACKED],
"linker flavor"),
+ sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
+ "use a sanitizer"),
linker_plugin_lto: LinkerPluginLto = (LinkerPluginLto::Disabled,
parse_linker_plugin_lto, [TRACKED],
"generate build artifacts that are compatible with linker-based LTO."),
@@ -860,8 +862,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
"take the breaks off const evaluation. NOTE: this is unsound"),
osx_rpath_install_name: bool = (false, parse_bool, [TRACKED],
"pass `-install_name @rpath/...` to the macOS linker"),
- sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
- "use a sanitizer"),
sanitizer_recover: Vec<Sanitizer> = (vec![], parse_sanitizer_list, [TRACKED],
"Enable recovery for selected sanitizers"),
sanitizer_memory_track_origins: usize = (0, parse_sanitizer_memory_track_origins, [TRACKED],
diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs
index 173b120e1f6..62a4389f167 100644
--- a/src/librustc_session/session.rs
+++ b/src/librustc_session/session.rs
@@ -520,7 +520,7 @@ impl Session {
|| self.opts.output_types.contains_key(&OutputType::Bitcode);
// Address sanitizer and memory sanitizer use alloca name when reporting an issue.
- let more_names = match self.opts.debugging_opts.sanitizer {
+ let more_names = match self.opts.cg.sanitizer {
Some(Sanitizer::Address) => true,
Some(Sanitizer::Memory) => true,
_ => more_names,
@@ -1136,18 +1136,32 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
}
// Sanitizers can only be used on some tested platforms.
- if let Some(ref sanitizer) = sess.opts.debugging_opts.sanitizer {
+ if let Some(ref sanitizer) = sess.opts.cg.sanitizer {
const ASAN_SUPPORTED_TARGETS: &[&str] = &[
"x86_64-unknown-linux-gnu",
+ "x86_64-cros-linux-gnu",
+ "x86_64-pc-linux-gnu",
"x86_64-apple-darwin",
"x86_64-fuchsia",
"aarch64-fuchsia",
];
- const TSAN_SUPPORTED_TARGETS: &[&str] =
- &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
- const LSAN_SUPPORTED_TARGETS: &[&str] =
- &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
- const MSAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu"];
+ const TSAN_SUPPORTED_TARGETS: &[&str] = &[
+ "x86_64-unknown-linux-gnu",
+ "x86_64-cros-linux-gnu",
+ "x86_64-pc-linux-gnu",
+ "x86_64-apple-darwin",
+ ];
+ const LSAN_SUPPORTED_TARGETS: &[&str] = &[
+ "x86_64-unknown-linux-gnu",
+ "x86_64-cros-linux-gnu",
+ "x86_64-pc-linux-gnu",
+ "x86_64-apple-darwin",
+ ];
+ const MSAN_SUPPORTED_TARGETS: &[&str] = &[
+ "x86_64-unknown-linux-gnu",
+ "x86_64-cros-linux-gnu",
+ "x86_64-pc-linux-gnu",
+ ];
let supported_targets = match *sanitizer {
Sanitizer::Address => ASAN_SUPPORTED_TARGETS,