-
Notifications
You must be signed in to change notification settings - Fork 12.7k
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
generalize search graph to enable fuzzing #127627
Conversation
There was a problem hiding this 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
809acd2
to
208d709
Compare
@bors r=compiler-errors rollup |
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; |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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`.
208d709
to
15f770b
Compare
I've fixed the imports. Ideally we'd enforce via lint at least that 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+ |
…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`
…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
…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
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``
…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
…lint, r=<try> Add internal lint for detecting non-glob imports of `rustc_type_ir::inherent` rust-lang#127627 (comment) r? compiler-errors
…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
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
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>
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 allI: Interner
ProofTreeBuilder
: implemented bystruct ProofTreeBuilder<D>
for allD: SolverDelegate
Delegate
: implemented for a newstruct SearchGraphDelegate<D>
for allD: SolverDelegate
It also moves the evaluation cache implementation into
rustc_type_ir
, requiringInterner
to provide methods to create and access arbitraryWithDepNode<T>
and to provide mutable access to a givenGlobalCache
. 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