mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #128348 - dingxiangfei2009:allow-shadow-call-stack-sanitizer, r=tmandry
Unconditionally allow shadow call-stack sanitizer for AArch64 It is possible to do so whenever `-Z fixed-x18` is applied. cc ``@Darksonn`` for context The reasoning is that, as soon as reservation on `x18` is forced through the flag `fixed-x18`, on AArch64 the option to instrument with [Shadow Call Stack sanitizer](https://clang.llvm.org/docs/ShadowCallStack.html) is then applicable regardless of the target configuration. At the every least, we would like to relax the restriction on specifically `aarch64-unknonw-none`. For this option, we can include a documentation change saying that users of compiled objects need to ensure that they are linked to runtime with Shadow Call Stack instrumentation support. Related: #121972
This commit is contained in:
commit
3075644a3d
@ -1188,7 +1188,12 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
||||
|
||||
// Sanitizers can only be used on platforms that we know have working sanitizer codegen.
|
||||
let supported_sanitizers = sess.target.options.supported_sanitizers;
|
||||
let unsupported_sanitizers = sess.opts.unstable_opts.sanitizer - supported_sanitizers;
|
||||
let mut unsupported_sanitizers = sess.opts.unstable_opts.sanitizer - supported_sanitizers;
|
||||
// Niche: if `fixed-x18`, or effectively switching on `reserved-x18` flag, is enabled
|
||||
// we should allow Shadow Call Stack sanitizer.
|
||||
if sess.opts.unstable_opts.fixed_x18 && sess.target.arch == "aarch64" {
|
||||
unsupported_sanitizers -= SanitizerSet::SHADOWCALLSTACK;
|
||||
}
|
||||
match unsupported_sanitizers.into_iter().count() {
|
||||
0 => {}
|
||||
1 => {
|
||||
|
@ -61,3 +61,8 @@ Currently the `riscv64-linux-android` target requires the following architecture
|
||||
* `Zba` (address calculation instructions)
|
||||
* `Zbb` (base instructions)
|
||||
* `Zbs` (single-bit instructions)
|
||||
|
||||
### aarch64-linux-android on Nightly compilers
|
||||
|
||||
As soon as `-Zfixed-x18` compiler flag is supplied, the [`ShadowCallStack` sanitizer](https://releases.llvm.org/7.0.1/tools/clang/docs/ShadowCallStack.html)
|
||||
instrumentation is also made avaiable by supplying the second compiler flag `-Zsanitizer=shadow-call-stack`.
|
||||
|
@ -1,7 +1,7 @@
|
||||
# `fixed-x18`
|
||||
|
||||
This option prevents the compiler from using the x18 register. It is only
|
||||
supported on aarch64.
|
||||
supported on `aarch64`.
|
||||
|
||||
From the [ABI spec][arm-abi]:
|
||||
|
||||
@ -23,6 +23,11 @@ Currently, the `-Zsanitizer=shadow-call-stack` flag is only supported on
|
||||
platforms that always treat x18 as a reserved register, and the `-Zfixed-x18`
|
||||
flag is not required to use the sanitizer on such platforms. However, the
|
||||
sanitizer may be supported on targets where this is not the case in the future.
|
||||
One way to do so now on Nightly compilers is to explicitly supply this `-Zfixed-x18`
|
||||
flag with `aarch64` targets, so that the sanitizer is available for instrumentation
|
||||
on targets like `aarch64-unknown-none`, for instance. However, discretion is still
|
||||
required to make sure that the runtime support is in place for this sanitizer
|
||||
to be effective.
|
||||
|
||||
It is undefined behavior for `-Zsanitizer=shadow-call-stack` code to call into
|
||||
code where x18 is a temporary register. On the other hand, when you are *not*
|
||||
|
@ -787,6 +787,10 @@ A runtime must be provided by the application or operating system.
|
||||
|
||||
See the [Clang ShadowCallStack documentation][clang-scs] for more details.
|
||||
|
||||
* `aarch64-unknown-none`
|
||||
|
||||
In addition to support from a runtime by the application or operating system, the `-Zfixed-x18` flag is also mandatory.
|
||||
|
||||
# ThreadSanitizer
|
||||
|
||||
ThreadSanitizer is a data race detection tool. It is supported on the following
|
||||
|
@ -0,0 +1,19 @@
|
||||
//@ revisions: aarch64 android
|
||||
//@[aarch64] compile-flags: --target aarch64-unknown-none -Zfixed-x18 -Zsanitizer=shadow-call-stack
|
||||
//@[aarch64] needs-llvm-components: aarch64
|
||||
//@[android] compile-flags: --target aarch64-linux-android -Zsanitizer=shadow-call-stack
|
||||
//@[android] needs-llvm-components: aarch64
|
||||
|
||||
#![allow(internal_features)]
|
||||
#![crate_type = "rlib"]
|
||||
#![feature(no_core, lang_items)]
|
||||
#![no_core]
|
||||
|
||||
#[lang = "sized"]
|
||||
trait Sized {}
|
||||
|
||||
// CHECK: ; Function Attrs:{{.*}}shadowcallstack
|
||||
#[no_mangle]
|
||||
pub fn foo() {}
|
||||
|
||||
// CHECK: attributes #0 = {{.*}}shadowcallstack{{.*}}
|
15
tests/ui/abi/shadow-call-stack-without-fixed-x18.rs
Normal file
15
tests/ui/abi/shadow-call-stack-without-fixed-x18.rs
Normal file
@ -0,0 +1,15 @@
|
||||
//@ compile-flags: --target aarch64-unknown-none -Zsanitizer=shadow-call-stack
|
||||
//@ error-pattern: shadow-call-stack sanitizer is not supported for this target
|
||||
//@ dont-check-compiler-stderr
|
||||
//@ needs-llvm-components: aarch64
|
||||
|
||||
#![allow(internal_features)]
|
||||
#![crate_type = "rlib"]
|
||||
#![feature(no_core, lang_items)]
|
||||
#![no_core]
|
||||
|
||||
#[lang = "sized"]
|
||||
trait Sized {}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn foo() {}
|
Loading…
Reference in New Issue
Block a user