helper functions for env_var emulation in Windows
Moving some of the changes submitted in PR #1225, in order to prevent the original PR from bloating too much.
fix conditional compilation condition for os_str <-> bytes conversion
Turns out that condition was wrong and these functions never got compiled... Cc @christianpoveda
give some context in error messages
### Some examples for how different errors look now
Unsupported operation:
```
error: unsupported operation: Miri does not support threading
--> /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/src/libstd/sys/unix/thread.rs:68:19
|
68 | let ret = libc::pthread_create(&mut native, &attr, thread_start, &*p as *const _ as *mut _);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Miri does not support threading
|
= help: this is likely not a bug in the program; it indicates that the program performed an operation that the interpreter does not support
```
Unsupported operation that works without isolation:
```
error: unsupported operation: `clock_gettime` not available when isolation is enabled
--> /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/src/libstd/sys/unix/time.rs:349:22
|
349 | cvt(unsafe { libc::clock_gettime(clock, &mut t.t) }).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `clock_gettime` not available when isolation is enabled
|
= help: pass the flag `-Zmiri-disable-isolation` to disable isolation
```
Program abort:
```
error: program stopped: the evaluated program aborted execution
--> /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/src/libstd/panicking.rs:530:18
|
530 | unsafe { intrinsics::abort() }
| ^^^^^^^^^^^^^^^^^^^ the evaluated program aborted execution
|
```
UB:
```
error: Undefined Behavior: type validation failed: encountered 2, but expected a boolean
--> tests/compile-fail/validity/invalid_bool.rs:2:23
|
2 | let _b = unsafe { std::mem::transmute::<u8, bool>(2) }; //~ ERROR encountered 2, but expected a boolean
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 2, but expected a boolean
|
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
```
Experimental UB:
```
error: Undefined Behavior: not granting access to tag <1562> because incompatible item is protected: [Unique for <1567> (call 1189)]
--> tests/compile-fail/stacked_borrows/aliasing_mut1.rs:3:1
|
3 | pub fn safe(_x: &mut i32, _y: &mut i32) {} //~ ERROR protect
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not granting access to tag <1562> because incompatible item is protected: [Unique for <1567> (call 1189)]
|
= help: this indicates a potential bug in the program: it performed an invalid operation, but the rules it violated are still experimental
```
Fixes https://github.com/rust-lang/miri/issues/417
implement Instant::now
For now, this is Linux-only.
Unlike `SystemTime`, we cannot convert `Instant` to something absolute via an epoch. But that's okay, that clock is relative anyway, so we just make up our own time anchor when interpretation starts.
Fixes https://github.com/rust-lang/miri/issues/1242