1
Fork 0

Auto merge of #115095 - RalfJung:miri, r=RalfJung

update Miri

r? `@ghost`
This commit is contained in:
bors 2023-08-22 12:32:50 +00:00
commit d8c69dfb37
22 changed files with 326 additions and 100 deletions

View file

@ -218,7 +218,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"serde", "serde",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -500,7 +500,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -525,7 +525,7 @@ dependencies = [
"regex", "regex",
"rustc_tools_util", "rustc_tools_util",
"serde", "serde",
"syn 2.0.27", "syn 2.0.29",
"tempfile", "tempfile",
"termize", "termize",
"tester", "tester",
@ -849,7 +849,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -860,7 +860,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -875,7 +875,7 @@ version = "0.1.73"
dependencies = [ dependencies = [
"itertools", "itertools",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -911,7 +911,7 @@ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -988,7 +988,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -1354,7 +1354,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -2334,6 +2334,7 @@ dependencies = [
"rand", "rand",
"regex", "regex",
"rustc_version", "rustc_version",
"serde",
"smallvec", "smallvec",
"ui_test", "ui_test",
] ]
@ -2503,7 +2504,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -2691,7 +2692,7 @@ dependencies = [
"pest_meta", "pest_meta",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -3636,7 +3637,7 @@ dependencies = [
"fluent-syntax", "fluent-syntax",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
"unic-langid", "unic-langid",
] ]
@ -3906,7 +3907,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
"synstructure 0.13.0", "synstructure 0.13.0",
] ]
@ -4514,7 +4515,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"serde", "serde",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -4666,22 +4667,22 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.164" version = "1.0.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.164" version = "1.0.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -4962,9 +4963,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.27" version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -4991,7 +4992,7 @@ checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
"unicode-xid", "unicode-xid",
] ]
@ -5161,7 +5162,7 @@ checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -5382,7 +5383,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
] ]
[[package]] [[package]]
@ -5777,7 +5778,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -5811,7 +5812,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.27", "syn 2.0.29",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]

View file

@ -189,8 +189,6 @@ jobs:
fetch-depth: 256 # get a bit more of the history fetch-depth: 256 # get a bit more of the history
- name: install josh-proxy - name: install josh-proxy
run: cargo +stable install josh-proxy --git https://github.com/josh-project/josh --tag r22.12.06 run: cargo +stable install josh-proxy --git https://github.com/josh-project/josh --tag r22.12.06
- name: start josh-proxy
run: josh-proxy --local=$HOME/.cache/josh --remote=https://github.com --no-background &
- name: setup bot git name and email - name: setup bot git name and email
run: | run: |
git config --global user.name 'The Miri Conjob Bot' git config --global user.name 'The Miri Conjob Bot'

View file

@ -165,16 +165,17 @@ to `.vscode/settings.json` in your local Miri clone:
{ {
"rust-analyzer.rustc.source": "discover", "rust-analyzer.rustc.source": "discover",
"rust-analyzer.linkedProjects": [ "rust-analyzer.linkedProjects": [
"./Cargo.toml", "Cargo.toml",
"./cargo-miri/Cargo.toml" "cargo-miri/Cargo.toml",
"miri-script/Cargo.toml",
], ],
"rust-analyzer.checkOnSave.overrideCommand": [ "rust-analyzer.check.overrideCommand": [
"env", "env",
"MIRI_AUTO_OPS=no", "MIRI_AUTO_OPS=no",
"./miri", "./miri",
"cargo", "cargo",
"clippy", // make this `check` when working with a locally built rustc "clippy", // make this `check` when working with a locally built rustc
"--message-format=json" "--message-format=json",
], ],
// Contrary to what the name suggests, this also affects proc macros. // Contrary to what the name suggests, this also affects proc macros.
"rust-analyzer.cargo.buildScripts.overrideCommand": [ "rust-analyzer.cargo.buildScripts.overrideCommand": [
@ -230,25 +231,16 @@ You can also directly run Miri on a Rust source file:
## Advanced topic: Syncing with the rustc repo ## Advanced topic: Syncing with the rustc repo
We use the [`josh` proxy](https://github.com/josh-project/josh) to transmit changes between the We use the [`josh` proxy](https://github.com/josh-project/josh) to transmit changes between the
rustc and Miri repositories. rustc and Miri repositories. You can install it as follows:
```sh ```sh
cargo +stable install josh-proxy --git https://github.com/josh-project/josh --tag r22.12.06 cargo +stable install josh-proxy --git https://github.com/josh-project/josh --tag r22.12.06
josh-proxy --local=$HOME/.cache/josh --remote=https://github.com --no-background
``` ```
This uses a directory `$HOME/.cache/josh` as a cache, to speed up repeated pulling/pushing. Josh will automatically be started and stopped by `./miri`.
To make josh push via ssh instead of https, you can add the following to your `.gitconfig`:
```toml
[url "git@github.com:"]
pushInsteadOf = https://github.com/
```
### Importing changes from the rustc repo ### Importing changes from the rustc repo
Josh needs to be running, as described above.
We assume we start on an up-to-date master branch in the Miri repo. We assume we start on an up-to-date master branch in the Miri repo.
```sh ```sh
@ -267,16 +259,14 @@ needed.
### Exporting changes to the rustc repo ### Exporting changes to the rustc repo
Keep in mind that pushing is the most complicated job that josh has to do -- Keep in mind that pushing is the most complicated job that josh has to do -- pulling just filters
pulling just filters the rustc history, but pushing needs to construct a new the rustc history, but pushing needs to construct a new rustc history that would filter to the given
rustc history that would filter to the given Miri history! To avoid problems, it Miri history! To avoid problems, it is a good idea to always pull immediately before you push. If
is a good idea to always pull immediately before you push. In particular, you you are getting strange errors, chances are you are running into [this josh
should never do two josh pushes without an intermediate pull; that can lead to bug](https://github.com/josh-project/josh/issues/998). In that case, please get in touch on Zulip.
duplicated commits.
Josh needs to be running, as described above. We will use the josh proxy to push We will use the josh proxy to push to your fork of rustc. Run the following in the Miri repo,
to your fork of rustc. Run the following in the Miri repo, assuming we are on an assuming we are on an up-to-date master branch:
up-to-date master branch:
```sh ```sh
# Push the Miri changes to your rustc fork (substitute your github handle for YOUR_NAME). # Push the Miri changes to your rustc fork (substitute your github handle for YOUR_NAME).
@ -286,3 +276,11 @@ up-to-date master branch:
This will create a new branch called 'miri' in your fork, and the output should This will create a new branch called 'miri' in your fork, and the output should
include a link to create a rustc PR that will integrate those changes into the include a link to create a rustc PR that will integrate those changes into the
main repository. main repository.
If this fails due to authentication problems, it can help to make josh push via ssh instead of
https. Add the following to your `.gitconfig`:
```toml
[url "git@github.com:"]
pushInsteadOf = https://github.com/
```

View file

@ -443,6 +443,7 @@ dependencies = [
"rand", "rand",
"regex", "regex",
"rustc_version", "rustc_version",
"serde",
"smallvec", "smallvec",
"ui_test", "ui_test",
] ]
@ -528,18 +529,18 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.60" version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.26" version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -685,18 +686,18 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.162" version = "1.0.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.162" version = "1.0.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -737,9 +738,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.15" version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -41,6 +41,8 @@ rustc_version = "0.4"
# Features chosen to match those required by env_logger, to avoid rebuilds # Features chosen to match those required by env_logger, to avoid rebuilds
regex = { version = "1.5.5", default-features = false, features = ["perf", "std"] } regex = { version = "1.5.5", default-features = false, features = ["perf", "std"] }
lazy_static = "1.4.0" lazy_static = "1.4.0"
# Require a version of serde without intransparent unreproducible binary blobs.
serde = { version = "1.0.185", features = ["derive"] }
[package.metadata.rust-analyzer] [package.metadata.rust-analyzer]
# This crate uses #[feature(rustc_private)]. # This crate uses #[feature(rustc_private)].

View file

@ -458,8 +458,8 @@ Some native rustc `-Z` flags are also very relevant for Miri:
Moreover, Miri recognizes some environment variables: Moreover, Miri recognizes some environment variables:
* `MIRI_AUTO_OPS` indicates whether the automatic execution of rustfmt, clippy and toolchain setup * `MIRI_AUTO_OPS` indicates whether the automatic execution of rustfmt, clippy and toolchain setup
should be skipped. If it is set to any value, they are skipped. This is used for avoiding infinite should be skipped. If it is set to `no`, they are skipped. This is used to allow automated IDE
recursion in `./miri` and to allow automated IDE actions to avoid the auto ops. actions to avoid the auto ops.
* `MIRI_LOG`, `MIRI_BACKTRACE` control logging and backtrace printing during * `MIRI_LOG`, `MIRI_BACKTRACE` control logging and backtrace printing during
Miri executions, also [see "Testing the Miri driver" in `CONTRIBUTING.md`][testing-miri]. Miri executions, also [see "Testing the Miri driver" in `CONTRIBUTING.md`][testing-miri].
* `MIRIFLAGS` (recognized by `cargo miri` and the test suite) defines extra * `MIRIFLAGS` (recognized by `cargo miri` and the test suite) defines extra

View file

@ -178,18 +178,18 @@ checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.60" version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.26" version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -280,18 +280,18 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.162" version = "1.0.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.162" version = "1.0.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -311,9 +311,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.15" version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -22,7 +22,8 @@ rustc-build-sysroot = "0.4.1"
# Enable some feature flags that dev-dependencies need but dependencies # Enable some feature flags that dev-dependencies need but dependencies
# do not. This makes `./miri install` after `./miri build` faster. # do not. This makes `./miri install` after `./miri build` faster.
serde = { version = "*", features = ["derive"] } # Require a version of serde without intransparent unreproducible binary blobs.
serde = { version = "1.0.185", features = ["derive"] }
[build-dependencies] [build-dependencies]
rustc_tools_util = "0.3" rustc_tools_util = "0.3"

View file

@ -52,7 +52,7 @@ function run_tests {
# Also run some many-seeds tests. 64 seeds means this takes around a minute per test. # Also run some many-seeds tests. 64 seeds means this takes around a minute per test.
for FILE in tests/many-seeds/*.rs; do for FILE in tests/many-seeds/*.rs; do
MIRI_SEEDS=64 CARGO_EXTRA_FLAGS="$CARGO_EXTRA_FLAGS -q" ./miri many-seeds ./miri run "$FILE" MIRI_SEEDS=64 ./miri many-seeds ./miri run "$FILE"
done done
# Check that the benchmarks build and run, but without actually benchmarking. # Check that the benchmarks build and run, but without actually benchmarking.

View file

@ -2,5 +2,5 @@
set -e set -e
# Instead of doing just `cargo run --manifest-path .. $@`, we invoke miri-script binary directly. Invoking `cargo run` goes through # Instead of doing just `cargo run --manifest-path .. $@`, we invoke miri-script binary directly. Invoking `cargo run` goes through
# rustup (that sets it's own environmental variables), which is undesirable. # rustup (that sets it's own environmental variables), which is undesirable.
cargo build -q --manifest-path "$(dirname "$0")"/miri-script/Cargo.toml cargo build $CARGO_EXTRA_FLAGS -q --manifest-path "$(dirname "$0")"/miri-script/Cargo.toml
"$(dirname "$0")"/miri-script/target/debug/miri-script "$@" "$(dirname "$0")"/miri-script/target/debug/miri-script "$@"

View file

@ -8,6 +8,38 @@ version = "1.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "directories"
version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210"
dependencies = [
"dirs-sys",
]
[[package]]
name = "dirs-sys"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
dependencies = [
"libc",
"redox_users",
"winapi",
]
[[package]] [[package]]
name = "dunce" name = "dunce"
version = "1.0.4" version = "1.0.4"
@ -20,6 +52,17 @@ version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
[[package]]
name = "getrandom"
version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.10.5" version = "0.10.5"
@ -40,6 +83,7 @@ name = "miri-script"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"directories",
"dunce", "dunce",
"itertools", "itertools",
"path_macro", "path_macro",
@ -62,6 +106,44 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6e819bbd49d5939f682638fa54826bf1650abddcd65d000923de8ad63cc7d15" checksum = "a6e819bbd49d5939f682638fa54826bf1650abddcd65d000923de8ad63cc7d15"
[[package]]
name = "proc-macro2"
version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]]
name = "redox_users"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [
"getrandom",
"redox_syscall",
"thiserror",
]
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.4.0" version = "0.4.0"
@ -92,6 +174,43 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
[[package]]
name = "syn"
version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "thiserror"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "unicode-ident"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
[[package]] [[package]]
name = "walkdir" name = "walkdir"
version = "2.3.3" version = "2.3.3"
@ -102,6 +221,12 @@ dependencies = [
"winapi-util", "winapi-util",
] ]
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]] [[package]]
name = "which" name = "which"
version = "4.4.0" version = "4.4.0"

View file

@ -20,3 +20,4 @@ anyhow = "1.0"
xshell = "0.2" xshell = "0.2"
rustc_version = "0.4" rustc_version = "0.4"
dunce = "1.0.4" dunce = "1.0.4"
directories = "4"

View file

@ -2,6 +2,9 @@ use std::env;
use std::ffi::OsString; use std::ffi::OsString;
use std::io::Write; use std::io::Write;
use std::ops::Not; use std::ops::Not;
use std::process;
use std::thread;
use std::time;
use anyhow::{anyhow, bail, Context, Result}; use anyhow::{anyhow, bail, Context, Result};
use path_macro::path; use path_macro::path;
@ -14,6 +17,7 @@ use crate::Command;
/// Used for rustc syncs. /// Used for rustc syncs.
const JOSH_FILTER: &str = const JOSH_FILTER: &str =
":rev(75dd959a3a40eb5b4574f8d2e23aa6efbeb33573:prefix=src/tools/miri):/src/tools/miri"; ":rev(75dd959a3a40eb5b4574f8d2e23aa6efbeb33573:prefix=src/tools/miri):/src/tools/miri";
const JOSH_PORT: &str = "42042";
impl MiriEnv { impl MiriEnv {
fn build_miri_sysroot(&mut self, quiet: bool) -> Result<()> { fn build_miri_sysroot(&mut self, quiet: bool) -> Result<()> {
@ -57,6 +61,10 @@ impl MiriEnv {
impl Command { impl Command {
fn auto_actions() -> Result<()> { fn auto_actions() -> Result<()> {
if env::var_os("MIRI_AUTO_OPS").is_some_and(|x| x == "no") {
return Ok(());
}
let miri_dir = miri_dir()?; let miri_dir = miri_dir()?;
let auto_everything = path!(miri_dir / ".auto-everything").exists(); let auto_everything = path!(miri_dir / ".auto-everything").exists();
let auto_toolchain = auto_everything || path!(miri_dir / ".auto-toolchain").exists(); let auto_toolchain = auto_everything || path!(miri_dir / ".auto-toolchain").exists();
@ -77,7 +85,57 @@ impl Command {
Ok(()) Ok(())
} }
fn start_josh() -> Result<impl Drop> {
// Determine cache directory.
let local_dir = {
let user_dirs =
directories::ProjectDirs::from("org", "rust-lang", "miri-josh").unwrap();
user_dirs.cache_dir().to_owned()
};
// Start josh, silencing its output.
let mut cmd = process::Command::new("josh-proxy");
cmd.arg("--local").arg(local_dir);
cmd.arg("--remote").arg("https://github.com");
cmd.arg("--port").arg(JOSH_PORT);
cmd.arg("--no-background");
cmd.stdout(process::Stdio::null());
cmd.stderr(process::Stdio::null());
let josh = cmd.spawn().context("failed to start josh-proxy, make sure it is installed")?;
// Give it some time so hopefully the port is open. (10ms was not enough.)
thread::sleep(time::Duration::from_millis(100));
// Create a wrapper that stops it on drop.
struct Josh(process::Child);
impl Drop for Josh {
fn drop(&mut self) {
#[cfg(unix)]
{
// Try to gracefully shut it down.
process::Command::new("kill")
.args(["-s", "INT", &self.0.id().to_string()])
.output()
.expect("failed to SIGINT josh-proxy");
// Sadly there is no "wait with timeout"... so we just give it some time to finish.
thread::sleep(time::Duration::from_millis(100));
// Now hopefully it is gone.
if self.0.try_wait().expect("failed to wait for josh-proxy").is_some() {
return;
}
}
// If that didn't work (or we're not on Unix), kill it hard.
eprintln!(
"I have to kill josh-proxy the hard way, let's hope this does not break anything."
);
self.0.kill().expect("failed to SIGKILL josh-proxy");
}
}
Ok(Josh(josh))
}
pub fn exec(self) -> Result<()> { pub fn exec(self) -> Result<()> {
// First, and crucially only once, run the auto-actions -- but not for all commands.
match &self { match &self {
Command::Install { .. } Command::Install { .. }
| Command::Build { .. } | Command::Build { .. }
@ -89,10 +147,11 @@ impl Command {
| Command::Cargo { .. } => Self::auto_actions()?, | Command::Cargo { .. } => Self::auto_actions()?,
| Command::ManySeeds { .. } | Command::ManySeeds { .. }
| Command::Toolchain { .. } | Command::Toolchain { .. }
| Command::RustcPull { .. }
| Command::Bench { .. } | Command::Bench { .. }
| Command::RustcPull { .. }
| Command::RustcPush { .. } => {} | Command::RustcPush { .. } => {}
} }
// Then run the actual command.
match self { match self {
Command::Install { flags } => Self::install(flags), Command::Install { flags } => Self::install(flags),
Command::Build { flags } => Self::build(flags), Command::Build { flags } => Self::build(flags),
@ -168,6 +227,8 @@ impl Command {
if cmd!(sh, "git status --untracked-files=no --porcelain").read()?.is_empty().not() { if cmd!(sh, "git status --untracked-files=no --porcelain").read()?.is_empty().not() {
bail!("working directory must be clean before running `./miri rustc-pull`"); bail!("working directory must be clean before running `./miri rustc-pull`");
} }
// Make sure josh is running.
let josh = Self::start_josh()?;
// Update rust-version file. As a separate commit, since making it part of // Update rust-version file. As a separate commit, since making it part of
// the merge has confused the heck out of josh in the past. // the merge has confused the heck out of josh in the past.
@ -180,7 +241,7 @@ impl Command {
.context("FAILED to commit rust-version file, something went wrong")?; .context("FAILED to commit rust-version file, something went wrong")?;
// Fetch given rustc commit. // Fetch given rustc commit.
cmd!(sh, "git fetch http://localhost:8000/rust-lang/rust.git@{commit}{JOSH_FILTER}.git") cmd!(sh, "git fetch http://localhost:{JOSH_PORT}/rust-lang/rust.git@{commit}{JOSH_FILTER}.git")
.run() .run()
.map_err(|e| { .map_err(|e| {
// Try to un-do the previous `git commit`, to leave the repo in the state we found it it. // Try to un-do the previous `git commit`, to leave the repo in the state we found it it.
@ -196,6 +257,8 @@ impl Command {
cmd!(sh, "git merge FETCH_HEAD --no-verify --no-ff -m {MERGE_COMMIT_MESSAGE}") cmd!(sh, "git merge FETCH_HEAD --no-verify --no-ff -m {MERGE_COMMIT_MESSAGE}")
.run() .run()
.context("FAILED to merge new commits, something went wrong")?; .context("FAILED to merge new commits, something went wrong")?;
drop(josh);
Ok(()) Ok(())
} }
@ -207,6 +270,8 @@ impl Command {
if cmd!(sh, "git status --untracked-files=no --porcelain").read()?.is_empty().not() { if cmd!(sh, "git status --untracked-files=no --porcelain").read()?.is_empty().not() {
bail!("working directory must be clean before running `./miri rustc-push`"); bail!("working directory must be clean before running `./miri rustc-push`");
} }
// Make sure josh is running.
let josh = Self::start_josh()?;
// Find a repo we can do our preparation in. // Find a repo we can do our preparation in.
if let Ok(rustc_git) = env::var("RUSTC_GIT") { if let Ok(rustc_git) = env::var("RUSTC_GIT") {
@ -243,6 +308,8 @@ impl Command {
} }
cmd!(sh, "git fetch https://github.com/rust-lang/rust {base}").run()?; cmd!(sh, "git fetch https://github.com/rust-lang/rust {base}").run()?;
cmd!(sh, "git push https://github.com/{github_user}/rust {base}:refs/heads/{branch}") cmd!(sh, "git push https://github.com/{github_user}/rust {base}:refs/heads/{branch}")
.ignore_stdout()
.ignore_stderr() // silence the "create GitHub PR" message
.run()?; .run()?;
println!(); println!();
@ -251,7 +318,7 @@ impl Command {
println!("Pushing miri changes..."); println!("Pushing miri changes...");
cmd!( cmd!(
sh, sh,
"git push http://localhost:8000/{github_user}/rust.git{JOSH_FILTER}.git HEAD:{branch}" "git push http://localhost:{JOSH_PORT}/{github_user}/rust.git{JOSH_FILTER}.git HEAD:{branch}"
) )
.run()?; .run()?;
println!(); println!();
@ -259,7 +326,7 @@ impl Command {
// Do a round-trip check to make sure the push worked as expected. // Do a round-trip check to make sure the push worked as expected.
cmd!( cmd!(
sh, sh,
"git fetch http://localhost:8000/{github_user}/rust.git{JOSH_FILTER}.git {branch}" "git fetch http://localhost:{JOSH_PORT}/{github_user}/rust.git{JOSH_FILTER}.git {branch}"
) )
.ignore_stderr() .ignore_stderr()
.read()?; .read()?;
@ -272,6 +339,8 @@ impl Command {
"Confirmed that the push round-trips back to Miri properly. Please create a rustc PR:" "Confirmed that the push round-trips back to Miri properly. Please create a rustc PR:"
); );
println!(" https://github.com/{github_user}/rust/pull/new/{branch}"); println!(" https://github.com/{github_user}/rust/pull/new/{branch}");
drop(josh);
Ok(()) Ok(())
} }
@ -289,6 +358,7 @@ impl Command {
bail!("expected many-seeds command to be non-empty"); bail!("expected many-seeds command to be non-empty");
}; };
let sh = Shell::new()?; let sh = Shell::new()?;
sh.set_var("MIRI_AUTO_OPS", "no"); // just in case we get recursively invoked
for seed in seed_start..seed_end { for seed in seed_start..seed_end {
println!("Trying seed: {seed}"); println!("Trying seed: {seed}");
let mut miriflags = env::var_os("MIRIFLAGS").unwrap_or_default(); let mut miriflags = env::var_os("MIRIFLAGS").unwrap_or_default();
@ -313,6 +383,8 @@ impl Command {
let Some((program_name, args)) = hyperfine.split_first() else { let Some((program_name, args)) = hyperfine.split_first() else {
bail!("expected HYPERFINE environment variable to be non-empty"); bail!("expected HYPERFINE environment variable to be non-empty");
}; };
// Extra flags to pass to cargo.
let cargo_extra_flags = std::env::var("CARGO_EXTRA_FLAGS").unwrap_or_default();
// Make sure we have an up-to-date Miri installed and selected the right toolchain. // Make sure we have an up-to-date Miri installed and selected the right toolchain.
Self::install(vec![])?; Self::install(vec![])?;
@ -335,7 +407,7 @@ impl Command {
// That seems to make Windows CI happy. // That seems to make Windows CI happy.
cmd!( cmd!(
sh, sh,
"{program_name} {args...} 'cargo miri run --manifest-path \"'{current_bench}'\"'" "{program_name} {args...} 'cargo miri run '{cargo_extra_flags}' --manifest-path \"'{current_bench}'\"'"
) )
.run()?; .run()?;
} }

View file

@ -1,3 +1,5 @@
#![allow(clippy::needless_question_mark)]
mod commands; mod commands;
mod util; mod util;

View file

@ -1 +1 @@
656ee47db32e882fb02913f6204e09cc7a41a50e c40cfcf0494ff7506e753e750adb00eeea839f9c

View file

@ -68,17 +68,31 @@ mod transition {
fn foreign_read(state: PermissionPriv, protected: bool) -> Option<PermissionPriv> { fn foreign_read(state: PermissionPriv, protected: bool) -> Option<PermissionPriv> {
use Option::*; use Option::*;
Some(match state { Some(match state {
// Non-writeable states just ignore foreign reads.
non_writeable @ (Frozen | Disabled) => non_writeable,
// Writeable states are more tricky, and depend on whether things are protected.
// The inner data `ty_is_freeze` of `Reserved` is always irrelevant for Read // The inner data `ty_is_freeze` of `Reserved` is always irrelevant for Read
// accesses, since the data is not being mutated. Hence the `{ .. }` // accesses, since the data is not being mutated. Hence the `{ .. }`
res @ Reserved { .. } if !protected => res, res @ Reserved { .. } =>
Reserved { .. } => Frozen, // protected reserved if protected {
// Someone else read, make sure we won't write.
// We could make this `Disabled` but it doesn't look like we get anything out of that extra UB.
Frozen
} else {
// Before activation and without protectors, foreign reads are fine.
// That's the entire point of 2-phase borrows.
res
},
Active => Active =>
if protected { if protected {
// We wrote, someone else reads -- that's bad.
// (If this is initialized, this move-to-protected will mean insta-UB.)
Disabled Disabled
} else { } else {
// We don't want to disable here to allow read-read reordering: it is crucial
// that the foreign read does not invalidate future reads through this tag.
Frozen Frozen
}, },
non_writeable @ (Frozen | Disabled) => non_writeable,
}) })
} }

View file

@ -32,6 +32,7 @@
clippy::needless_return, clippy::needless_return,
clippy::bool_to_int_with_if, clippy::bool_to_int_with_if,
clippy::box_default, clippy::box_default,
clippy::needless_question_mark,
// We are not implementing queries here so it's fine // We are not implementing queries here so it's fine
rustc::potential_query_instability rustc::potential_query_instability
)] )]

View file

@ -44,7 +44,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
"the program aborted execution".to_owned() "the program aborted execution".to_owned()
)) ))
} }
_ => {}, _ => {}
} }
// All remaining supported intrinsics have a return place. // All remaining supported intrinsics have a return place.

View file

@ -83,27 +83,27 @@ version = "0.1.0"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.60" version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.23" version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.152" version = "1.0.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -119,9 +119,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.107" version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -20,7 +20,8 @@ issue_rust_86261 = { path = "issue-rust-86261" }
[dev-dependencies] [dev-dependencies]
byteorder_2 = { package = "byteorder", version = "0.5" } # to test dev-dependencies behave as expected, with renaming byteorder_2 = { package = "byteorder", version = "0.5" } # to test dev-dependencies behave as expected, with renaming
serde_derive = "1.0" # not actually used, but exercises some unique code path (`--extern` .so file) # Not actually used, but exercises some unique code path (`--extern` .so file).
serde_derive = "1.0.185"
[build-dependencies] [build-dependencies]
autocfg = "1" autocfg = "1"

View file

@ -15,12 +15,14 @@ CGREEN = '\33[32m'
CBOLD = '\33[1m' CBOLD = '\33[1m'
CEND = '\33[0m' CEND = '\33[0m'
CARGO_EXTRA_FLAGS = os.environ.get("CARGO_EXTRA_FLAGS", "").split()
def fail(msg): def fail(msg):
print("\nTEST FAIL: {}".format(msg)) print("\nTEST FAIL: {}".format(msg))
sys.exit(1) sys.exit(1)
def cargo_miri(cmd, quiet = True): def cargo_miri(cmd, quiet = True):
args = ["cargo", "miri", cmd] args = ["cargo", "miri", cmd] + CARGO_EXTRA_FLAGS
if quiet: if quiet:
args += ["-q"] args += ["-q"]
if 'MIRI_TEST_TARGET' in os.environ: if 'MIRI_TEST_TARGET' in os.environ:

View file

@ -16,6 +16,11 @@ fn get_host() -> String {
.host .host
} }
pub fn flagsplit(flags: &str) -> Vec<String> {
// This code is taken from `RUSTFLAGS` handling in cargo.
flags.split(' ').map(str::trim).filter(|s| !s.is_empty()).map(str::to_string).collect()
}
// Build the shared object file for testing external C function calls. // Build the shared object file for testing external C function calls.
fn build_so_for_c_ffi_tests() -> PathBuf { fn build_so_for_c_ffi_tests() -> PathBuf {
let cc = option_env!("CC").unwrap_or("cc"); let cc = option_env!("CC").unwrap_or("cc");
@ -100,14 +105,16 @@ fn test_config(target: &str, path: &str, mode: Mode, with_dependencies: bool) ->
if with_dependencies && use_std { if with_dependencies && use_std {
config.dependencies_crate_manifest_path = config.dependencies_crate_manifest_path =
Some(Path::new("test_dependencies").join("Cargo.toml")); Some(Path::new("test_dependencies").join("Cargo.toml"));
config.dependency_builder.args = vec![ let mut builder_args = vec!["run".into()];
"run".into(), builder_args.extend(flagsplit(&env::var("CARGO_EXTRA_FLAGS").unwrap_or_default()));
builder_args.extend([
"--manifest-path".into(), "--manifest-path".into(),
"cargo-miri/Cargo.toml".into(), "cargo-miri/Cargo.toml".into(),
"--".into(), "--".into(),
"miri".into(), "miri".into(),
"run".into(), // There is no `cargo miri build` so we just use `cargo miri run`. "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`.
]; ]);
config.dependency_builder.args = builder_args.into_iter().map(Into::into).collect();
} }
config config
} }