Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

optimized_mir unstable fingerprint when compiling rustc #85197

Closed
Aaron1011 opened this issue May 11, 2021 · 0 comments · Fixed by #85211
Closed

optimized_mir unstable fingerprint when compiling rustc #85197

Aaron1011 opened this issue May 11, 2021 · 0 comments · Fixed by #85211
Assignees
Labels
A-incr-comp Area: Incremental compilation C-bug Category: This is a bug.

Comments

@Aaron1011
Copy link
Member

Aaron1011 commented May 11, 2021

See #84970 (comment) and #84960 for other instances of this happening

I've managed to reliably reproduce an optimized_mir 'unstable fingerprint' issue when building rustc. Reproduction steps:

  1. Clone https://github.com/Aaron1011/rust/ and checkout https://github.com/Aaron1011/rust/tree/optimized-mir-fingerprint
  2. Run ./x.py clean followed by ./x.py build --stage 1 library/std
  3. Run:
touch compiler/rustc_middle/src/lib.rs
  1. Run ./x.py build --stage 1 library/std

You should observe the following error (my config.toml is included in the gist)

https://gist.github.com/Aaron1011/7eec8b2c584f8c9d2195f521c13d4f01

@Aaron1011 Aaron1011 added C-bug Category: This is a bug. A-incr-comp Area: Incremental compilation labels May 11, 2021
@Aaron1011 Aaron1011 self-assigned this May 11, 2021
bors added a commit to rust-lang-ci/rust that referenced this issue May 14, 2021
…chaelwoerister

Preserve `SyntaxContext` for invalid/dummy spans in crate metadata

Fixes rust-lang#85197

We already preserved the `SyntaxContext` for invalid/dummy spans in the
incremental cache, but we weren't doing the same for crate metadata.
If an invalid (lo/hi from different files) span is written to the
incremental cache, we will decode it with a 'dummy' location, but keep
the original `SyntaxContext`. Since the crate metadata encoder was only
checking for `DUMMY_SP` (dummy location + root `SyntaxContext`),
the metadata encoder would treat it as a normal span, encoding the
`SyntaxContext`. As a result, the final span encoded to the metadata
would change across sessions, even if the crate itself was unchanged.

This could lead to an 'unstable fingerprint' ICE under the following conditions:
1. We compile a crate with an invalid span using incremental compilation. The metadata encoder discards the `SyntaxContext` since the span is invalid, while the incremental cache encoder preserves the `SyntaxContext`
2. From another crate, we execute a foreign query, decoding the invalid span from the metadata as `DUMMY_SP` (e.g. with `SyntaxContext::root()`). This span gets hashed into the query fingerprint. So far, this has always happened through the `optimized_mir` query.
3. We recompile the first crate using our populated incremental cache, without changing anything. We load the (previously) invalid span from our incremental cache - it gets converted to a span with a dummy (but valid) location, along with the original `SyntaxContext`. This span gets written out to the crate metadata - since it now has a valid location, we preserve its `SyntaxContext`.
4. We recompile the second crate, again using a populated incremental cache. We now re-run the foreign query `optimized_mir` - the foreign crate hash is unchanged, but we end up decoding a different span (it now ha a non-root `SyntaxContext`). This results in the fingerprint changing, resulting in an ICE.

This PR updates our encoding of spans in the crate metadata to mirror
the encoding of spans into the incremental cache. We now always encode a
`SyntaxContext`, and encode location information for spans with a
non-dummy location.
@bors bors closed this as completed in cdca3c8 May 14, 2021
Mark-Simulacrum pushed a commit to Mark-Simulacrum/rust that referenced this issue Jun 11, 2021
Fixes rust-lang#85197

We already preserved the `SyntaxContext` for invalid/dummy spans in the
incremental cache, but we weren't doing the same for crate metadata.
If an invalid (lo/hi from different files) span is written to the
incremental cache, we will decode it with a 'dummy' location, but keep
the original `SyntaxContext`. Since the crate metadata encoder was only
checking for `DUMMY_SP` (dummy location + root `SyntaxContext`),
the metadata encoder would treat it as a normal span, encoding the
`SyntaxContext`. As a result, the final span encoded to the metadata
would change across sessions, even if the crate itself was unchanged.

This PR updates our encoding of spans in the crate metadata to mirror
the encoding of spans into the incremental cache. We now always encode a
`SyntaxContext`, and encode location information for spans with a
non-dummy location.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-incr-comp Area: Incremental compilation C-bug Category: This is a bug.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant