Start cutting down rustc_query_system#152160
Start cutting down rustc_query_system#152160nnethercote wants to merge 4 commits intorust-lang:mainfrom
rustc_query_system#152160Conversation
|
I'd prefer to apply the |
|
You can't move the entire file. Some parts of it are used by |
|
Not enough moved for git to pick up a rename? It could be moved to a |
|
Adding a few hundred more lines to I'm not sure whether this will work out in practice, but here's a potential approach:
That would produce an end result similar to the current state of this PR, but with the migrated code still in its own separate file, and preserving as much line history as possible. |
This comment has been minimized.
This comment has been minimized.
Why? The same few hundred lines are removed from
It would also result in an odd module structure that reflects historical evolution rather than what makes sense today. |
This comment has been minimized.
This comment has been minimized.
|
I tried prototyping my proposal, and while I still like it on paper, I came away with the distinct impression that it's probably not better enough to justify the extra fiddling and delay, compared to just moving forward with this PR. Ultimately, what's most important is unlocking the sorts of simplification and improvement that are impossible with the current module split. |
That's the only place it's used, so it no longer needs to be `pub`.
Instead of writing it by hand.
…umbing`. We are in the process of eliminating `rustc_query_system`. Chunks of it are unused by `rustc_middle`, and so can be moved into `rustc_query_info`. This commit does some of that. Mostly it's just moving code from one file to another. There are a couple of non-trivial changes. - `QueryState` and `ActiveKeyStatus` must remain in `rustc_query_system` because they are used by `rustc_middle`. But their inherent methods are not used by `rustc_middle`. So these methods are moved and converted to free functions. - The visibility of some things must increase. This includes `DepGraphData` and some of its methods, which are now used in `rustc_query_impl`. This is a bit annoying but seems hard to avoid. What little is left behind in `compiler/rustc_query_system/src/query/plumbing.rs` will be able to moved into `rustc_query_impl` or `rustc_middle` in the future.
The previous commit moved some code from `rustc_query_system`, which doesn't have access to `TyCtxt` and `QueryCtxt`, to `rustc_query_impl`, which does. We can now remove quite a bit of indirection. - Three methods in `trait QueryContext` are no longer needed (`next_job_id`, `current_query_job`, `start_query`). As a result, `QueryCtxt`'s trait impls of these methods are changed to inherent methods. - `qcx: Q::Qcx` parameters are simplified to `qcx: QueryCtxt<'tcx>`. - `*qcx.dep_context()` occurrences are simplified to `qcx.tcx`, and things like `qcx.dep_context().profiler()` become `qcx.tcx.prof`. - `DepGraphData<<Q::Qcx as HasDepContext>::Deps>` becomes `DepGraphData<DepsType>`. In short, various layers of indirection and abstraction are cut away. The resulting code is simpler, more concrete, and easier to understand. It's a good demonstration of the benefits of eliminating `rustc_query_system`, and there will be more to come.
I do want to push back on this a bit. Taking ~500 lines of code from system/plumbing and shoving it in impl/pluming is useful in the sense that it unlocks within-crate simplifications, but it's most certainly not a good module structure. One of the first things I'd want to do is take big chunks of that code and extract it into one or more separate modules, so that it isn't making the impl/plumbing macros significantly harder to deal with. And because the code has been isolated in a separate crate up to this point, it does represent a fairly “natural” boundary for the code that currently exists. IIRC, the main point of interaction between impl/plumbing and system/plumbing is through the (For comparison, look at middle/plumbing, where I made a point of taking some functions that exist to be called by macro-generated functions, and moved them out to a separate So my main motivation for wanting to move the code over in a separate file is not to preserve history (though that's nice if we can get it), but because I think it's genuinely a better module structure for the current state of the code. |
4f0dd45 to
d6218b6
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
|
My motivation is to get rid of all the different layers of indirection. I personally find that kind of thing much more of a barrier to understanding than module structure. I've added a new commit that starts to remove the indirection. It's nice! |
|
The cleanups are nice, and it will be nice to unlock even more, so let’s try to get this into the next big rollup when the tree reopens. @bors r+ |
|
I'd like to do a perf run before merging, just to be cautious. @bors r- |
|
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
…stem, r=<try> Start cutting down `rustc_query_system`
|
The job Click to see the possible cause of the failure (guessed by this bot) |
This comment has been minimized.
This comment has been minimized.
|
Finished benchmarking commit (c175e8a): comparison URL. Overall result: no relevant changes - no action neededBenchmarking this pull request means it may be perf-sensitive – we'll automatically label it not fit for rolling up. You can override this, but we strongly advise not to, due to possible changes in compiler perf. @bors rollup=never Instruction countThis benchmark run did not return any relevant results for this metric. Max RSS (memory usage)Results (primary -1.0%, secondary -3.1%)A less reliable metric. May be of interest, but not used to determine the overall result above.
CyclesResults (secondary -2.9%)A less reliable metric. May be of interest, but not used to determine the overall result above.
Binary sizeResults (primary 0.0%, secondary 0.1%)A less reliable metric. May be of interest, but not used to determine the overall result above.
Bootstrap: 472.84s -> 474.801s (0.41%) |
|
I tried doing some work on a local branch on top of this one, and it was significantly harder, to the point that I was forced to pull the migrated code out into a separate module before I could try to get anything done. It's so much harder to find anything or remain oriented in the file. Shoving 500 lines of code into the bottom of |
|
I'm getting mixed messages. You complained, then gave r+, and now are complaining again. I'm honestly surprised by what you're saying. Perhaps I'm insensitive to module structure. I find the presence/absence of modules within a crate to be a minor concern when it comes to understanding things. I find layers of abstraction and indirection like traits and generics much more of an impediment to understanding, especially when they cross crate boundaries. If you give me some clear suggestions I can try to work with them. FWIW I have an unpublished follow-up that successfully removes the |
|
Sorry for the back-and-forth. I had talked myself into approving the PR, despite my misgivings, because I had thought it was prudent to compromise and move forward, and because I didn’t want to ask you to redo a bunch of fiddly migration work. Afterwards I tried working on top of this branch, excited to improve things further. But I quickly ran into serious navigation problems that were jarring enough to change my mind. Despite its size, Adding a large chunk of code at the bottom removes all the spatial landmarks I was using to find things in the big macro. And since it’s a macro, I have no other way to navigate it. I spent far too long trying to just find the macro portion in the larger file, as if it had vanished entirely. I find it noticeably more difficult to work effectively in files of more than a few hundred lines, especially if I have to keep jumping back and forth between confusingly-named functions in different parts of the same file. That’s why I find it so helpful to split off coherent parts of large modules into separate files. And while the code being moved from |
|
Concretely, the main things I care about are:
(I would prefer to preserve as much line history as reasonably possible, because it makes a big practical difference in trying to understand the under-documented parts of the code. But I don’t know whether I can convince you of that, and I’d prefer to focus my energy on making the code nice enough for that to not matter so much in the long run.) |
|
Ok, I'll redo it to put the moved code in its own module. I'll try to cajole git into preserving history. When it comes to module/file size, 2,000 lines is when I start to feel uncomfortable. Clearly a matter of taste and personal preference! :) |
That's now at #152215. It is rough quality and includes the commits from this PR. There are so many generics and trait bounds that it took quite some effort to get it to compile. |
The query system is implemented in
rustc_query_system,rustc_middle, andrustc_query_impl.rustc_query_systemis hamstrung by not having access toTyCtxt, and there seems to be consensus to eliminate it. It's contents can be moved into the other two crates. Moving as much stuff as possible torustc_query_implis preferred, becauserustc_middleis already so big.This PR starts this process. It moves one small function to
rustc_middleand a good chunk of code torustc_query_impl.Once
rustc_query_systemis gone (or at least shrunk down a lot more) some of the traits likeDepContext,QueryContext, andQueryDispatcherwill be removable.r? @Zalathar