Make file descriptors into refcount references
fixes#3525
Remove `fn dup` in `trait FileDescription`, define `struct FileDescriptor(Rc<RefCell<dyn FileDescription>>)`, and use `BTreeMap<i32, FileDescriptor>` in `FdTable`.
---
There are some refactors similar to the following form:
```rust
{ // origin:
if let Some(file_descriptor) = this.machine.fds.get_mut(fd) {
// write file_descriptor
this.try_unwrap_io_result(result)
} else {
this.fd_not_found()
}
}
{ // now:
let Some(mut file_descriptor) = this.machine.fds.get_mut(fd) else {
return this.fd_not_found();
};
// write file_descriptor
drop(file_descriptor);
this.try_unwrap_io_result(result)
}
```
The origin form can't compile because as using `RefCell` to get interior mutability, `fn get_mut` return `Option<std::cell::RefMut<'_, dyn FileDescription>>` instead of `Option<&mut dyn FileDescription>` now, and the `deref_mut` on `file_descriptor: RefMut` will cause borrow `this` as mutable more than once at a time.
So this form of refactors and manual drops are are implemented to avoid borrowing `this` at the same time.
make many-seeds a mode of ./miri run rather than a separate command
Also parallelize it so we use all cores to try seeds at the same time.
Fixes https://github.com/rust-lang/miri/issues/3509 by not alternating between different build modes (with/without dev-dependencies) all the time.
Rollup of 6 pull requests
Successful merges:
- #124461 (handle the targets that are missing in stage0)
- #124492 (Generalize `adjust_from_tcx` for `Allocation`)
- #124588 (Use `ObligationCtxt` in favor of `TraitEngine` in many more places)
- #124612 (Add support for inputing via stdin with run-make-support)
- #124613 (Allow fmt to run on rmake.rs test files)
- #124649 (Fix HorizonOS build broken by #124210)
r? `@ghost`
`@rustbot` modify labels: rollup
Fix HorizonOS build broken by #124210
HorizonOS (for the Tier-3 target `armv6k-nintendo-3ds`) does not support `dirfd()`, as many other similar targets.
Allow fmt to run on rmake.rs test files
As discussed with `@jieyouxu,` `rmake.rs` from the `run-make` testsuite would benefit from being formatted as well.
Only thing needed to be done for it to work: allow support for `!` in our `rustfmt.toml` file parsing.
r? `@onur-ozkan`
Add support for inputing via stdin with run-make-support
This PR adds the facility to set a input bytes that will be passed via the standard input.
This is useful for testing `rustc -` (and soon `rustdoc -`).
In #124611 took the approach of having a dedicated `run` method but it is not very convenient to use and would necessitate many functions, one for success, one for fail, ...
Instead this PR takes a different approach and allows setting the input bytes as if it were a parameter and when calling the (now custom) `output` function, we write the input bytes into stdin. I think this gives us maximum flexibility in the implementation and a simple interface for users.
To test this new logic I ported `tests/run-make/stdin-non-utf8/` to an `rmake.rs` one.
r? `@jieyouxu`
Generalize `adjust_from_tcx` for `Allocation`
Previously, `adjust_from_tcx` would take an `Allocation` and "adjust allocation from the ones in `tcx` to a custom Machine instance [...]".
This PR generalizes this so the Machine instance can also determine the `Bytes` type of the output `Allocation`.
r? `@RalfJung`
handle the targets that are missing in stage0
During sanity checks, we search for target names to determine if they exist in the compiler's built-in target list (`rustc --print target-list`). While a target name may be present in the stage2 compiler, it might not yet be included in stage0. This PR handles that difference.
Follow-up of https://github.com/rust-lang/rust/pull/123546