@@ -14,9 +14,9 @@ contact us (`oli-obk` and `RalfJ`) on the [Rust Zulip].
14
14
15
15
## Preparing the build environment
16
16
17
- Miri heavily relies on internal rustc interfaces to execute MIR. Still, some
18
- things (like adding support for a new intrinsic or a shim for an external
19
- function being called) can be done by working just on the Miri side .
17
+ Miri heavily relies on internal and unstable rustc interfaces to execute MIR,
18
+ which means it is important that you install a version of rustc that Miri
19
+ actually works with .
20
20
21
21
The ` rust-version ` file contains the commit hash of rustc that Miri is currently
22
22
tested against. Other versions will likely not work. After installing
@@ -25,13 +25,15 @@ install that exact version of rustc as a toolchain:
25
25
```
26
26
./rustup-toolchain
27
27
```
28
+ This will set up a rustup toolchain called ` miri ` and set it as an override for
29
+ the current directory.
28
30
29
31
[ `rustup-toolchain-install-master` ] : https://github.com/kennytm/rustup-toolchain-install-master
30
32
31
33
## Building and testing Miri
32
34
33
35
Invoking Miri requires getting a bunch of flags right and setting up a custom
34
- sysroot with xargo. The ` miri ` script takes care of that for you. With the
36
+ sysroot with xargo. The ` miri ` script takes care of that for you. With the
35
37
build environment prepared, compiling Miri is just one command away:
36
38
37
39
```
@@ -76,7 +78,7 @@ MIRI_LOG=info ./miri run tests/run-pass/vecs.rs
76
78
```
77
79
78
80
Setting ` MIRI_LOG ` like this will configure logging for Miri itself as well as
79
- the ` rustc_middle::mir::interpret ` and ` rustc_mir::interpret ` modules in rustc. You
81
+ the ` rustc_middle::mir::interpret ` and ` rustc_mir::interpret ` modules in rustc. You
80
82
can also do more targeted configuration, e.g. the following helps debug the
81
83
stacked borrows implementation:
82
84
@@ -90,8 +92,8 @@ evaluation error was originally raised.
90
92
### Testing ` cargo miri `
91
93
92
94
Working with the driver directly gives you full control, but you also lose all
93
- the convenience provided by cargo. Once your test case depends on a crate, it
94
- is probably easier to test it with the cargo wrapper. You can install your
95
+ the convenience provided by cargo. Once your test case depends on a crate, it
96
+ is probably easier to test it with the cargo wrapper. You can install your
95
97
development version of Miri using
96
98
97
99
```
@@ -105,27 +107,33 @@ There's a test for the cargo wrapper in the `test-cargo-miri` directory; run
105
107
` ./run-test.py ` in there to execute it. Like ` ./miri test ` , this respects the
106
108
` MIRI_TEST_TARGET ` environment variable to execute the test for another target.
107
109
108
- ### Fixing Miri when rustc changes
110
+ ## Advanced topic: other build environments
109
111
110
- Miri is heavily tied to rustc internals, so it is very common that rustc changes
111
- break Miri. Usually, Miri will require changes similar to the other consumers
112
- of the changed rustc API, so reading the rustc PR diff is a good way to get an
113
- idea for what is needed.
112
+ We described above the simplest way to get a working build environment for Miri,
113
+ which is to use the version of rustc indicated by ` rustc-version ` . But
114
+ sometimes, that is not enough.
115
+
116
+ ### Updating ` rustc-version `
117
+
118
+ The ` rustc-version ` file is regularly updated to keep Miri close to the latest
119
+ version of rustc. Usually, new contributors do not have to worry about this. But
120
+ sometimes a newer rustc is needed for a patch, and sometimes Miri needs fixing
121
+ for changes in rustc. In both cases, ` rustc-version ` needs updating.
114
122
115
123
To update the ` rustc-version ` file and install the latest rustc, you can run:
116
124
```
117
125
./rustup-toolchain HEAD
118
126
```
119
127
120
- Now try ` ./miri test ` , and submit a PR once that works again. Even if you choose
121
- not to use ` ./rustup-toolchain ` , it is important that the ` rustc-version ` file
122
- is updated, as our CI makes sure that Miri works well with that particular
123
- version of rustc .
128
+ Now edit Miri until ` ./miri test ` passes , and submit a PR. Generally, it is
129
+ preferred to separate updating ` rustc-version ` and doing what it takes to get
130
+ Miri working again, from implementing new features that rely on the updated
131
+ rustc. This avoids blocking all Miri development on landing a big PR .
124
132
125
- ## Advanced topic: Building Miri with a locally built rustc
133
+ ### Building Miri with a locally built rustc
126
134
127
135
A big part of the Miri driver lives in rustc, so working on Miri will sometimes
128
- require using a locally built rustc. The bug you want to fix may actually be on
136
+ require using a locally built rustc. The bug you want to fix may actually be on
129
137
the rustc side, or you just need to get more detailed trace of the execution
130
138
than what is possible with release builds -- in both cases, you should develop
131
139
miri against a rustc you compiled yourself, with debug assertions (and hence
0 commit comments