unconditionally allow shadow call-stack for AArch64 whenever fixed-x18 is applied
This commit is contained in:
parent
8c7e0e1608
commit
b368dcb246
@ -1187,7 +1187,12 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
|||||||
|
|
||||||
// Sanitizers can only be used on platforms that we know have working sanitizer codegen.
|
// Sanitizers can only be used on platforms that we know have working sanitizer codegen.
|
||||||
let supported_sanitizers = sess.target.options.supported_sanitizers;
|
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() {
|
match unsupported_sanitizers.into_iter().count() {
|
||||||
0 => {}
|
0 => {}
|
||||||
1 => {
|
1 => {
|
||||||
|
@ -61,3 +61,8 @@ Currently the `riscv64-linux-android` target requires the following architecture
|
|||||||
* `Zba` (address calculation instructions)
|
* `Zba` (address calculation instructions)
|
||||||
* `Zbb` (base instructions)
|
* `Zbb` (base instructions)
|
||||||
* `Zbs` (single-bit 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`
|
# `fixed-x18`
|
||||||
|
|
||||||
This option prevents the compiler from using the x18 register. It is only
|
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]:
|
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`
|
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
|
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.
|
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
|
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*
|
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.
|
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
|
||||||
|
|
||||||
ThreadSanitizer is a data race detection tool. It is supported on the following
|
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