test miri-unleash TLS accesses

This commit is contained in:
Ralf Jung 2020-06-01 20:53:45 +02:00
parent d3cba254e4
commit d022603a45
7 changed files with 58 additions and 15 deletions

View File

@ -523,12 +523,12 @@ impl fmt::Display for UnsupportedOpInfo {
match self { match self {
Unsupported(ref msg) => write!(f, "{}", msg), Unsupported(ref msg) => write!(f, "{}", msg),
ReadForeignStatic(did) => { ReadForeignStatic(did) => {
write!(f, "cannot read from foreign (extern) static {:?}", did) write!(f, "cannot read from foreign (extern) static ({:?})", did)
} }
NoMirFor(did) => write!(f, "no MIR body is available for {:?}", did), NoMirFor(did) => write!(f, "no MIR body is available for {:?}", did),
ReadPointerAsBytes => write!(f, "unable to turn pointer into raw bytes",), ReadPointerAsBytes => write!(f, "unable to turn pointer into raw bytes",),
ReadBytesAsPointer => write!(f, "unable to turn bytes into a pointer"), ReadBytesAsPointer => write!(f, "unable to turn bytes into a pointer"),
ThreadLocalStatic(did) => write!(f, "accessing thread local static {:?}", did), ThreadLocalStatic(did) => write!(f, "cannot access thread local static ({:?})", did),
} }
} }
} }

View File

@ -12,9 +12,6 @@ use super::ConstCx;
/// An operation that is not *always* allowed in a const context. /// An operation that is not *always* allowed in a const context.
pub trait NonConstOp: std::fmt::Debug { pub trait NonConstOp: std::fmt::Debug {
/// Whether this operation can be evaluated by miri.
const IS_SUPPORTED_IN_MIRI: bool = true;
/// Returns the `Symbol` corresponding to the feature gate that would enable this operation, /// Returns the `Symbol` corresponding to the feature gate that would enable this operation,
/// or `None` if such a feature gate does not exist. /// or `None` if such a feature gate does not exist.
fn feature_gate() -> Option<Symbol> { fn feature_gate() -> Option<Symbol> {
@ -356,8 +353,6 @@ impl NonConstOp for StaticAccess {
#[derive(Debug)] #[derive(Debug)]
pub struct ThreadLocalAccess; pub struct ThreadLocalAccess;
impl NonConstOp for ThreadLocalAccess { impl NonConstOp for ThreadLocalAccess {
const IS_SUPPORTED_IN_MIRI: bool = false;
fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) { fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
struct_span_err!( struct_span_err!(
ccx.tcx.sess, ccx.tcx.sess,

View File

@ -244,11 +244,7 @@ impl Validator<'mir, 'tcx> {
return; return;
} }
// If an operation is supported in miri it can be turned on with if self.tcx.sess.opts.debugging_opts.unleash_the_miri_inside_of_you {
// `-Zunleash-the-miri-inside-of-you`.
let is_unleashable = O::IS_SUPPORTED_IN_MIRI;
if is_unleashable && self.tcx.sess.opts.debugging_opts.unleash_the_miri_inside_of_you {
self.tcx.sess.miri_unleashed_feature(span, O::feature_gate()); self.tcx.sess.miri_unleashed_feature(span, O::feature_gate());
return; return;
} }

View File

@ -1,15 +1,22 @@
// compile-flags: -Zunleash-the-miri-inside-of-you // compile-flags: -Zunleash-the-miri-inside-of-you
// only-x86_64 // only-x86_64
#![feature(llvm_asm)] #![feature(asm,llvm_asm)]
#![allow(const_err)] #![allow(const_err)]
fn main() {} fn main() {}
// Make sure we catch executing inline assembly. // Make sure we catch executing inline assembly.
static TEST_BAD: () = { static TEST_BAD1: () = {
unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); } unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
//~^ ERROR could not evaluate static initializer //~^ ERROR could not evaluate static initializer
//~| NOTE inline assembly is not supported //~| NOTE inline assembly is not supported
//~| NOTE in this expansion of llvm_asm! //~| NOTE in this expansion of llvm_asm!
//~| NOTE in this expansion of llvm_asm! //~| NOTE in this expansion of llvm_asm!
}; };
// Make sure we catch executing inline assembly.
static TEST_BAD2: () = {
unsafe { asm!("nop"); }
//~^ ERROR could not evaluate static initializer
//~| NOTE inline assembly is not supported
};

View File

@ -6,6 +6,12 @@ LL | unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
| |
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: could not evaluate static initializer
--> $DIR/inline_asm.rs:19:14
|
LL | unsafe { asm!("nop"); }
| ^^^^^^^^^^^^ inline assembly is not supported
warning: skipping const checks warning: skipping const checks
| |
help: skipping check that does not even have a feature gate help: skipping check that does not even have a feature gate
@ -13,8 +19,13 @@ help: skipping check that does not even have a feature gate
| |
LL | unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); } LL | unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: skipping check that does not even have a feature gate
--> $DIR/inline_asm.rs:19:14
|
LL | unsafe { asm!("nop"); }
| ^^^^^^^^^^^^
= note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to previous error; 1 warning emitted error: aborting due to 2 previous errors; 1 warning emitted
For more information about this error, try `rustc --explain E0080`. For more information about this error, try `rustc --explain E0080`.

View File

@ -0,0 +1,17 @@
// compile-flags: -Zunleash-the-miri-inside-of-you
#![feature(thread_local)]
#![allow(const_err)]
use std::thread;
#[thread_local]
static A: u8 = 0;
// Make sure we catch executing inline assembly.
static TEST_BAD: () = {
unsafe { let _val = A; }
//~^ ERROR could not evaluate static initializer
//~| NOTE cannot access thread local static
};
fn main() {}

View File

@ -0,0 +1,17 @@
error[E0080]: could not evaluate static initializer
--> $DIR/tls.rs:12:25
|
LL | unsafe { let _val = A; }
| ^ cannot access thread local static (DefId(0:4 ~ tls[317d]::A[0]))
warning: skipping const checks
|
help: skipping check that does not even have a feature gate
--> $DIR/tls.rs:12:25
|
LL | unsafe { let _val = A; }
| ^
error: aborting due to previous error; 1 warning emitted
For more information about this error, try `rustc --explain E0080`.