Rollup merge of #101598 - chriswailes:sanitizers, r=nagisa,eholk

Update rustc's information on Android's sanitizers

This patch updates sanitizer support definitions for Android inside the compiler.  It also adjusts the logic to make sure no pre-built sanitizer runtime libraries are emitted as these are instead provided dynamically on Android targets.
This commit is contained in:
Dylan DPC 2022-09-22 18:25:51 +05:30 committed by GitHub
commit b36a10af7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 7 deletions

View File

@ -1090,11 +1090,12 @@ fn add_sanitizer_libraries(sess: &Session, crate_type: CrateType, linker: &mut d
// both executables and dynamic shared objects. Everywhere else the runtimes // both executables and dynamic shared objects. Everywhere else the runtimes
// are currently distributed as static libraries which should be linked to // are currently distributed as static libraries which should be linked to
// executables only. // executables only.
let needs_runtime = match crate_type { let needs_runtime = !sess.target.is_like_android
CrateType::Executable => true, && match crate_type {
CrateType::Dylib | CrateType::Cdylib | CrateType::ProcMacro => sess.target.is_like_osx, CrateType::Executable => true,
CrateType::Rlib | CrateType::Staticlib => false, CrateType::Dylib | CrateType::Cdylib | CrateType::ProcMacro => sess.target.is_like_osx,
}; CrateType::Rlib | CrateType::Staticlib => false,
};
if !needs_runtime { if !needs_runtime {
return; return;

View File

@ -1,10 +1,12 @@
use crate::spec::TargetOptions; use crate::spec::{SanitizerSet, TargetOptions};
pub fn opts() -> TargetOptions { pub fn opts() -> TargetOptions {
let mut base = super::linux_base::opts(); let mut base = super::linux_base::opts();
base.os = "android".into(); base.os = "android".into();
base.is_like_android = true;
base.default_dwarf_version = 2; base.default_dwarf_version = 2;
base.has_thread_local = false; base.has_thread_local = false;
base.supported_sanitizers = SanitizerSet::ADDRESS;
// This is for backward compatibility, see https://github.com/rust-lang/rust/issues/49867 // This is for backward compatibility, see https://github.com/rust-lang/rust/issues/49867
// for context. (At that time, there was no `-C force-unwind-tables`, so the only solution // for context. (At that time, there was no `-C force-unwind-tables`, so the only solution
// was to always emit `uwtable`). // was to always emit `uwtable`).

View File

@ -1,9 +1,10 @@
use crate::spec::{LinkerFlavor, StackProbeType, Target}; use crate::spec::{LinkerFlavor, SanitizerSet, StackProbeType, Target};
pub fn target() -> Target { pub fn target() -> Target {
let mut base = super::linux_gnu_base::opts(); let mut base = super::linux_gnu_base::opts();
base.cpu = "pentium4".into(); base.cpu = "pentium4".into();
base.max_atomic_width = Some(64); base.max_atomic_width = Some(64);
base.supported_sanitizers = SanitizerSet::ADDRESS;
base.add_pre_link_args(LinkerFlavor::Gcc, &["-m32"]); base.add_pre_link_args(LinkerFlavor::Gcc, &["-m32"]);
// don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved
base.stack_probes = StackProbeType::Call; base.stack_probes = StackProbeType::Call;

View File

@ -1381,6 +1381,8 @@ pub struct TargetOptions {
pub is_like_msvc: bool, pub is_like_msvc: bool,
/// Whether a target toolchain is like WASM. /// Whether a target toolchain is like WASM.
pub is_like_wasm: bool, pub is_like_wasm: bool,
/// Whether a target toolchain is like Android, implying a Linux kernel and a Bionic libc
pub is_like_android: bool,
/// Default supported version of DWARF on this platform. /// Default supported version of DWARF on this platform.
/// Useful because some platforms (osx, bsd) only want up to DWARF2. /// Useful because some platforms (osx, bsd) only want up to DWARF2.
pub default_dwarf_version: u32, pub default_dwarf_version: u32,
@ -1673,6 +1675,7 @@ impl Default for TargetOptions {
is_like_windows: false, is_like_windows: false,
is_like_msvc: false, is_like_msvc: false,
is_like_wasm: false, is_like_wasm: false,
is_like_android: false,
default_dwarf_version: 4, default_dwarf_version: 4,
allows_weak_linkage: true, allows_weak_linkage: true,
has_rpath: false, has_rpath: false,
@ -2320,6 +2323,7 @@ impl Target {
key!(is_like_windows, bool); key!(is_like_windows, bool);
key!(is_like_msvc, bool); key!(is_like_msvc, bool);
key!(is_like_wasm, bool); key!(is_like_wasm, bool);
key!(is_like_android, bool);
key!(default_dwarf_version, u32); key!(default_dwarf_version, u32);
key!(allows_weak_linkage, bool); key!(allows_weak_linkage, bool);
key!(has_rpath, bool); key!(has_rpath, bool);
@ -2570,6 +2574,7 @@ impl ToJson for Target {
target_option_val!(is_like_windows); target_option_val!(is_like_windows);
target_option_val!(is_like_msvc); target_option_val!(is_like_msvc);
target_option_val!(is_like_wasm); target_option_val!(is_like_wasm);
target_option_val!(is_like_android);
target_option_val!(default_dwarf_version); target_option_val!(default_dwarf_version);
target_option_val!(allows_weak_linkage); target_option_val!(allows_weak_linkage);
target_option_val!(has_rpath); target_option_val!(has_rpath);

View File

@ -11,9 +11,15 @@ mod tests;
pub const ASAN_SUPPORTED_TARGETS: &[&str] = &[ pub const ASAN_SUPPORTED_TARGETS: &[&str] = &[
"aarch64-apple-darwin", "aarch64-apple-darwin",
"aarch64-fuchsia", "aarch64-fuchsia",
"aarch64-linux-android",
"aarch64-unknown-linux-gnu", "aarch64-unknown-linux-gnu",
"arm-linux-androideabi",
"armv7-linux-androideabi",
"i686-linux-android",
"i686-unknown-linux-gnu",
"x86_64-apple-darwin", "x86_64-apple-darwin",
"x86_64-fuchsia", "x86_64-fuchsia",
"x86_64-linux-android",
"x86_64-unknown-freebsd", "x86_64-unknown-freebsd",
"x86_64-unknown-linux-gnu", "x86_64-unknown-linux-gnu",
]; ];