Skip to content

generalize search graph to enable fuzzing #127627

New issue

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

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

Already on GitHub? # to your account

Merged
merged 2 commits into from
Jul 12, 2024
Merged

Conversation

lcnr
Copy link
Contributor

@lcnr lcnr commented Jul 11, 2024

I do not believe it to be feasible to correctly implement the search graph without fuzzing. This PR enables this by requiring a fuzzer to only implement three new traits:

  • Cx: implemented by all I: Interner
  • ProofTreeBuilder: implemented by struct ProofTreeBuilder<D> for all D: SolverDelegate
  • Delegate: implemented for a new struct SearchGraphDelegate<D> for all D: SolverDelegate

It also moves the evaluation cache implementation into rustc_type_ir, requiring Interner to provide methods to create and access arbitrary WithDepNode<T> and to provide mutable access to a given GlobalCache. It otherwise does not change the API surface for users of the shared library.

This change should not impact behavior in any way.

r? @compiler-errors

@rustbot rustbot added A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Jul 11, 2024
@lcnr lcnr force-pushed the rustc_search_graph branch from 174c513 to b9cf0ab Compare July 11, 2024 21:24
@lcnr lcnr force-pushed the rustc_search_graph branch from b9cf0ab to cc8ce8d Compare July 11, 2024 21:49
Copy link
Member

@compiler-errors compiler-errors left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

r=me after nits and comments

@lcnr lcnr force-pushed the rustc_search_graph branch 2 times, most recently from 809acd2 to 208d709 Compare July 12, 2024 10:04
@lcnr
Copy link
Contributor Author

lcnr commented Jul 12, 2024

@bors r=compiler-errors rollup

@bors
Copy link
Collaborator

bors commented Jul 12, 2024

📌 Commit 208d709 has been approved by compiler-errors

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 12, 2024
Comment on lines 1 to 6
use crate::delegate::SolverDelegate;
use crate::solve::inspect::{self, ProofTreeBuilder};
use crate::solve::{
CacheData, CanonicalInput, Certainty, QueryResult, SolverMode, FIXPOINT_STEP_LIMIT,
};

#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub struct SolverLimit(usize);

rustc_index::newtype_index! {
#[orderable]
#[gate_rustc_only]
pub struct StackDepth {}
}

bitflags::bitflags! {
/// Whether and how this goal has been used as the root of a
/// cycle. We track the kind of cycle as we're otherwise forced
/// to always rerun at least once.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct HasBeenUsed: u8 {
const INDUCTIVE_CYCLE = 1 << 0;
const COINDUCTIVE_CYCLE = 1 << 1;
}
}

#[derive(derivative::Derivative)]
#[derivative(Debug(bound = ""))]
struct StackEntry<I: Interner> {
input: CanonicalInput<I>,

available_depth: SolverLimit,

/// The maximum depth reached by this stack entry, only up-to date
/// for the top of the stack and lazily updated for the rest.
reached_depth: StackDepth,

/// Whether this entry is a non-root cycle participant.
///
/// We must not move the result of non-root cycle participants to the
/// global cache. We store the highest stack depth of a head of a cycle
/// this goal is involved in. This necessary to soundly cache its
/// provisional result.
non_root_cycle_participant: Option<StackDepth>,

encountered_overflow: bool,

has_been_used: HasBeenUsed,

/// We put only the root goal of a coinductive cycle into the global cache.
///
/// If we were to use that result when later trying to prove another cycle
/// participant, we can end up with unstable query results.
///
/// See tests/ui/next-solver/coinduction/incompleteness-unstable-result.rs for
/// an example of where this is needed.
///
/// There can be multiple roots on the same stack, so we need to track
/// cycle participants per root:
/// ```plain
/// A :- B
/// B :- A, C
/// C :- D
/// D :- C
/// ```
nested_goals: HashSet<CanonicalInput<I>>,
/// Starts out as `None` and gets set when rerunning this
/// goal in case we encounter a cycle.
provisional_result: Option<QueryResult<I>>,
}

/// The provisional result for a goal which is not on the stack.
#[derive(Debug)]
struct DetachedEntry<I: Interner> {
/// The head of the smallest non-trivial cycle involving this entry.
///
/// Given the following rules, when proving `A` the head for
/// the provisional entry of `C` would be `B`.
/// ```plain
/// A :- B
/// B :- C
/// C :- A + B + C
/// ```
head: StackDepth,
result: QueryResult<I>,
}
use rustc_type_ir::inherent::Predicate;
use rustc_type_ir::search_graph::{self, CycleKind, UsageKind};
use rustc_type_ir::solve::{CanonicalInput, Certainty, QueryResult};
use rustc_type_ir::Interner;
use std::marker::PhantomData;
Copy link
Member

@compiler-errors compiler-errors Jul 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Imports are still not cleaned up :(

head: StackDepth,
result: QueryResult<I>,
}
use rustc_type_ir::inherent::Predicate;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should always just glob-import inherent::* as a convention.

fully move it into `rustc_type_ir` and make it
independent of `Interner`.
@compiler-errors
Copy link
Member

compiler-errors commented Jul 12, 2024

I've fixed the imports.

Ideally we'd enforce via lint at least that inherent::* is preferred over manually importing traits from that module, since almost certainly never want to import specific trait names from there, but that seems like a lot of effort. Seems easy to mess up with rust-analyzer's auto-imports unfortunately :(

Would prefer if we try to keep these imports clean in general 🤔 I've tried very hard to clean them up in the process of uplifting and I think it does a lot to help the code maintainability.

@bors r+

@bors
Copy link
Collaborator

bors commented Jul 12, 2024

📌 Commit 15f770b has been approved by compiler-errors

It is now in the queue for this repository.

matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Jul 12, 2024
…r-errors

generalize search graph to enable fuzzing

I do not believe it to be feasible to correctly implement the search graph without fuzzing. This PR enables this by requiring a fuzzer to only implement three new traits:
- `Cx`: implemented by all `I: Interner`
- `ProofTreeBuilder`: implemented by `struct ProofTreeBuilder<D>` for all `D: SolverDelegate`
- `Delegate`: implemented for a new `struct SearchGraphDelegate<D>` for all `D: SolverDelegate`

It also moves the evaluation cache implementation into `rustc_type_ir`, requiring `Interner` to provide methods to create and access arbitrary `WithDepNode<T>` and to provide mutable access to a given `GlobalCache`. It otherwise does not change the API surface for users of the shared library.

This change should not impact behavior in any way.

r? `@compiler-errors`
bors added a commit to rust-lang-ci/rust that referenced this pull request Jul 12, 2024
…iaskrgr

Rollup of 9 pull requests

Successful merges:

 - rust-lang#124980 (Generalize `fn allocator` for Rc/Arc.)
 - rust-lang#126639 (Add AMX target-features and `x86_amx_intrinsics` feature flag)
 - rust-lang#126827 (Use pidfd_spawn for faster process spawning when a PidFd is requested)
 - rust-lang#127153 (Initial implementation of anonymous_pipe API)
 - rust-lang#127433 (Stabilize const_cstr_from_ptr (CStr::from_ptr, CStr::count_bytes))
 - rust-lang#127552 (remove unnecessary `git` usages)
 - rust-lang#127613 (Update dist-riscv64-linux to binutils 2.40)
 - rust-lang#127627 (generalize search graph to enable fuzzing)
 - rust-lang#127648 (Lower timeout of CI jobs to 4 hours)

r? `@ghost`
`@rustbot` modify labels: rollup
bors added a commit to rust-lang-ci/rust that referenced this pull request Jul 12, 2024
…iaskrgr

Rollup of 8 pull requests

Successful merges:

 - rust-lang#124980 (Generalize `fn allocator` for Rc/Arc.)
 - rust-lang#126639 (Add AMX target-features and `x86_amx_intrinsics` feature flag)
 - rust-lang#126827 (Use pidfd_spawn for faster process spawning when a PidFd is requested)
 - rust-lang#127433 (Stabilize const_cstr_from_ptr (CStr::from_ptr, CStr::count_bytes))
 - rust-lang#127552 (remove unnecessary `git` usages)
 - rust-lang#127613 (Update dist-riscv64-linux to binutils 2.40)
 - rust-lang#127627 (generalize search graph to enable fuzzing)
 - rust-lang#127648 (Lower timeout of CI jobs to 4 hours)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 526da23 into rust-lang:master Jul 12, 2024
6 checks passed
@rustbot rustbot added this to the 1.81.0 milestone Jul 12, 2024
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Jul 12, 2024
Rollup merge of rust-lang#127627 - lcnr:rustc_search_graph, r=compiler-errors

generalize search graph to enable fuzzing

I do not believe it to be feasible to correctly implement the search graph without fuzzing. This PR enables this by requiring a fuzzer to only implement three new traits:
- `Cx`: implemented by all `I: Interner`
- `ProofTreeBuilder`: implemented by `struct ProofTreeBuilder<D>` for all `D: SolverDelegate`
- `Delegate`: implemented for a new `struct SearchGraphDelegate<D>` for all `D: SolverDelegate`

It also moves the evaluation cache implementation into `rustc_type_ir`, requiring `Interner` to provide methods to create and access arbitrary `WithDepNode<T>` and to provide mutable access to a given `GlobalCache`. It otherwise does not change the API surface for users of the shared library.

This change should not impact behavior in any way.

r? ``@compiler-errors``
@lcnr lcnr deleted the rustc_search_graph branch July 15, 2024 07:59
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Jul 17, 2024
…t-lint, r=compiler-errors

Add internal lint for detecting non-glob imports of `rustc_type_ir::inherent`

rust-lang#127627 (comment)

r? compiler-errors
bors added a commit to rust-lang-ci/rust that referenced this pull request Jul 18, 2024
…lint, r=<try>

Add internal lint for detecting non-glob imports of `rustc_type_ir::inherent`

rust-lang#127627 (comment)

r? compiler-errors
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Jul 18, 2024
…t-lint, r=compiler-errors

Add internal lint for detecting non-glob imports of `rustc_type_ir::inherent`

rust-lang#127627 (comment)

r? compiler-errors
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Jul 18, 2024
Rollup merge of rust-lang#127854 - fmease:glob-import-type_ir_inherent-lint, r=compiler-errors

Add internal lint for detecting non-glob imports of `rustc_type_ir::inherent`

rust-lang#127627 (comment)

r? compiler-errors
jaisnan pushed a commit to jaisnan/rust-dev that referenced this pull request Jul 29, 2024
Update Rust toolchain from nightly-2024-07-12 to nightly-2024-07-13
without any other source changes.
This is an automatically generated pull request. If any of the CI checks
fail, manual intervention is required. In such a case, review the
changes at https://github.com/rust-lang/rust from
rust-lang@5315cbe
up to
rust-lang@c6727fc.
The log for this commit range is:
rust-lang@c6727fc9b5 Auto merge of
rust-lang#123351 - beetrees:x86-ret-snan-rust, r=nikic,workingjubilee
rust-lang@62c068feea Auto merge of
rust-lang#127636 - nnethercote:fix-Parser-look_ahead, r=oli-obk
rust-lang@5d76a13bbe Auto merge of
rust-lang#127653 - matthiaskrgr:rollup-72bqgvp, r=matthiaskrgr
rust-lang@f11c2c8e95 Rollup merge of
rust-lang#127648 - Kobzol:ci-lower-timeout, r=pietroalbini
rust-lang@526da2366a Rollup merge of
rust-lang#127627 - lcnr:rustc_search_graph, r=compiler-errors
rust-lang@f5fa6fb602 Rollup merge of
rust-lang#127613 - nikic:riscv-update, r=cuviper
rust-lang@b4f002d2e5 Rollup merge of
rust-lang#127552 - onur-ozkan:unnecessary-git-usage, r=Kobzol
rust-lang@8ceb4e49ff Rollup merge of
rust-lang#127433 - dtolnay:conststrlen, r=workingjubilee
rust-lang@f9b3e8b387 Rollup merge of
rust-lang#126827 - the8472:pidfd-spawn, r=workingjubilee
rust-lang@18152d72a4 Rollup merge of
rust-lang#126639 - sayantn:amx, r=Amanieu
rust-lang@65ea92d4a1 Rollup merge of
rust-lang#124980 - zachs18:rc-allocator, r=Amanieu
rust-lang@05eac57ef6 Auto merge of
rust-lang#127479 - Urgau:rustc-stable-hash, r=michaelwoerister
rust-lang@15f770b143 enable fuzzing of
`SearchGraph`
rust-lang@cae9d480bf Adjust tests for x86
"Rust" ABI changes
rust-lang@3f4b9dd463 Lower timeout of CI
jobs to 4 hours
rust-lang@7f1518bddd Add instability
attribute on private const_strlen function
rust-lang@b286722878 Auto merge of
rust-lang#127635 - matthiaskrgr:rollup-foopajr, r=matthiaskrgr
rust-lang@100f3fd133 Add a new special
case to `Parser::look_ahead`.
rust-lang@ebe1305b1e Remove the bogus
special case from `Parser::look_ahead`.
rust-lang@dad95578b0 Add unit tests for
`Parser::look_ahead`.
rust-lang@ec05c4ea3f Add the feature gate
and target-features
rust-lang@c2b7842555 Rollup merge of
rust-lang#127625 - SkiFire13:revert-comment-deletion, r=workingjubilee
rust-lang@ca576eae4e Rollup merge of
rust-lang#127622 - compiler-errors:builtin-internal, r=lqd
rust-lang@fe564c10ab Rollup merge of
rust-lang#127607 - Zalathar:normalize-hint, r=wesleywiser
rust-lang@83d1a1b252 Rollup merge of
rust-lang#127596 - tesuji:help-unwrap-or, r=compiler-errors
rust-lang@1e7ad4c3ed Rollup merge of
rust-lang#127422 - greaka:master, r=workingjubilee
rust-lang@58fe37f2c3 Rollup merge of
rust-lang#127164 - Nadrieril:clean-lowering-loop, r=matthewjasper
rust-lang@4a31a6c32a Auto merge of
rust-lang#127382 - estebank:const-let, r=compiler-errors
rust-lang@5e311f933d Auto merge of
rust-lang#127614 - matthiaskrgr:rollup-8geziwi, r=matthiaskrgr
rust-lang@a776e5f922 Add doc for
deconstruct_option_or_result
rust-lang@872d7b82e1 Add suggestion for
`Option<&Vec<T>> -> Option<&[T]`
rust-lang@d9170dc666 Add regression test
for issue 127545
rust-lang@4df75140dd Fix aarch64 test
rust-lang@cbe75486f7 Account for `let foo
= expr`; to suggest `const foo: Ty = expr;`
rust-lang@b56dc8ee90 Use verbose style
when suggesting changing `const` with `let`
rust-lang@d9021791eb Revert accidental
comment deletion
rust-lang@b77d3ef7c4 Mark builtin syntax
as internal
rust-lang@fa3ce50f0b Rollup merge of
rust-lang#127605 - nikic:remove-extern-wasm, r=oli-obk
rust-lang@d433f176ef Rollup merge of
rust-lang#127601 - trevyn:issue-127600, r=compiler-errors
rust-lang@47ab86653e Rollup merge of
rust-lang#127599 - tgross35:lazy_cell_consume-rename, r=workingjubilee
rust-lang@a10b4d1463 Rollup merge of
rust-lang#127598 - weiznich:diagnostic_do_not_recommend_also_skips_help,
r=compiler-errors
rust-lang@73c500b3a7 Rollup merge of
rust-lang#127591 - compiler-errors:label-after-primary, r=lcnr
rust-lang@380c78741e Rollup merge of
rust-lang#127588 - uweigand:s390x-f16-doctests, r=tgross35
rust-lang@6fd955549a Rollup merge of
rust-lang#127572 - tbu-:pr_debug_event_nonpacked, r=jhpratt
rust-lang@8de487fdbd Rollup merge of
rust-lang#124599 - estebank:issue-41708, r=wesleywiser
rust-lang@55256c5a18 Update
dist-riscv64-linux to binutils 2.40
rust-lang@977439d9b8 Use uplifted
`rustc-stable-hash` crate in `rustc_data_structures`
rust-lang@f56b2074c6 solve -> solve/mod
rust-lang@08a2992d6b compiletest: Better
error message for bad `normalize-*` headers
rust-lang@8a50bcbdce Remove extern "wasm"
ABI
rust-lang@a01f49e7f3 check is_ident
before parse_ident
rust-lang@ab56fe2053 Rename
`lazy_cell_consume` to `lazy_cell_into_inner`
rust-lang@27d5db166e Allows
`#[diagnostic::do_not_recommend]` to supress trait impls in suggestions
as well
rust-lang@12ae282987 Fix diagnostic and
add a test for it
rust-lang@df72e478b0 Make sure that
labels are defined after the primary span in diagnostics
rust-lang@0065763950 core: Limit
remaining f16 doctests to x86_64 linux
rust-lang@45ad522e87 Don't mark
`DEBUG_EVENT` struct as `repr(packed)`
rust-lang@0134bd2e67 remove unnecessary
`git` usages
rust-lang@42772e98e0 Address review
comments
rust-lang@3e030b38ef Return the
`otherwise_block` instead of passing it as argument
rust-lang@fc40247c6b Factor out the
"process remaining candidates" cases
rust-lang@8a222ffd6b Don't try to save an
extra block
rust-lang@c5062f7318 Move or-pattern
expansion inside the main part of the algorithm
rust-lang@bff4d213fa Factor out the
special handling of or-patterns
rust-lang@5bf50e66f9 Move a function
rust-lang@53d3e6217b Stabilize
const_cstr_from_ptr (CStr::from_ptr, CStr::count_bytes)
rust-lang@585ca16e0b as_simd: fix comment
to be in line with 507583a (rust-lang#121201)
rust-lang@0f643c449a Ensure tests don't
fail on i586 in CI
rust-lang@ec0c755704 Check that we get
somewhat sane PIDs when spawning with pidfds
rust-lang@3e4e31b7bf more fine-grained
feature-detection for pidfd spawning
rust-lang@0ce361938e document safety
properties of the internal Process::new constructor
rust-lang@6687a3f7da use pidfd_spawn for
faster process creation when pidfds are requested
rust-lang@5c46acac04 document the cvt
methods
rust-lang@0e1c832dbd Update
`platform-support.md` to reflect improvements in returning floats on
32-bit x86
rust-lang@952becc0bd Ensure floats are
returned losslessly by the Rust ABI on 32-bit x86
rust-lang@a1ad6346d6 Add fn allocator
method to rc/sync::Weak. Relax Rc<T>/Arc<T>::allocator to allow unsized
T.
rust-lang@2df4f7dd8c Suggest borrowing on
fn argument that is `impl AsRef`

Co-authored-by: celinval <35149715+celinval@users.noreply.github.com>
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants