Fix `rustc_mir` related links (#1228)
Co-authored-by: Yuki Okushi <jtitor@2k36.org> Co-authored-by: nhamovitz <18648574+nhamovitz@users.noreply.github.com>
This commit is contained in:
parent
68dbb4501d
commit
ddaebd85aa
|
|
@ -269,13 +269,13 @@ to the author and reviewers.
|
|||
[attrs-flags]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/middle/codegen_fn_attrs/struct.CodegenFnAttrFlags.html#associatedconstant.TRACK_CALLER
|
||||
[`ReifyShim`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.InstanceDef.html#variant.ReifyShim
|
||||
[`Location`]: https://doc.rust-lang.org/core/panic/struct.Location.html
|
||||
[const-find-closest]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.InterpCx.html#method.find_closest_untracked_caller_location
|
||||
[const-find-closest]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/struct.InterpCx.html#method.find_closest_untracked_caller_location
|
||||
[requires-location]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.InstanceDef.html#method.requires_caller_location
|
||||
[alloc-location]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.InterpCx.html#method.alloc_caller_location
|
||||
[alloc-location]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/struct.InterpCx.html#method.alloc_caller_location
|
||||
[fcx-location]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/struct.FunctionCx.html#structfield.caller_location
|
||||
[const-location-query]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html#method.const_caller_location
|
||||
[location-memory-kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/enum.MemoryKind.html#variant.CallerLocation
|
||||
[const-frame]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.Frame.html
|
||||
[const-stack]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.InterpCx.html#structfield.stack
|
||||
[location-memory-kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/enum.MemoryKind.html#variant.CallerLocation
|
||||
[const-frame]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/struct.Frame.html
|
||||
[const-stack]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/struct.InterpCx.html#structfield.stack
|
||||
[fcx-get]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/struct.FunctionCx.html#method.get_caller_location
|
||||
[frame-instance]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.Frame.html#structfield.instance
|
||||
[frame-instance]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/struct.Frame.html#structfield.instance
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ for them. Collector will also add things like statics to that list.
|
|||
|
||||
See [the collector rustdocs][collect] for more info.
|
||||
|
||||
[collect]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/monomorphize/collector/index.html
|
||||
[collect]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/collector/index.html
|
||||
|
||||
The monomorphization collector is run just before MIR lowering and codegen.
|
||||
[`rustc_codegen_ssa::base::codegen_crate`][codegen1] calls the
|
||||
|
|
@ -76,9 +76,9 @@ or more modules in Crate B.
|
|||
|
||||
For more details about the partitioner read the module level [documentation].
|
||||
|
||||
[mono]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/monomorphize/partitioning/fn.collect_and_partition_mono_items.html
|
||||
[mono]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/fn.collect_and_partition_mono_items.html
|
||||
[codegen1]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_crate.html
|
||||
[documentation]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/monomorphize/partitioning/index.html
|
||||
[documentation]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/index.html
|
||||
|
||||
## Polymorphization
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ In addition to MIR optimizations, rustc attempts to determine when fewer
|
|||
copies of functions are necessary and avoid making those copies - known
|
||||
as "polymorphization". When a function-like item is found during
|
||||
monomorphization collection, the
|
||||
[`rustc_mir::monomorphize::polymorphize::unused_generic_params`][polymorph]
|
||||
[`rustc_mir_monomorphize::polymorphize::unused_generic_params`][polymorph]
|
||||
query is invoked, which traverses the MIR of the item to determine on which
|
||||
generic parameters the item might not need duplicated.
|
||||
|
||||
|
|
@ -149,7 +149,7 @@ More details on polymorphization are available in the
|
|||
implementation.
|
||||
|
||||
[miropt]: ../mir/optimizations.md
|
||||
[polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/monomorphize/polymorphize/fn.unused_generic_params.html
|
||||
[polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/polymorphize/fn.unused_generic_params.html
|
||||
[inst]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html
|
||||
[inst_polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html#method.polymorphize
|
||||
[thesis]: https://davidtw.co/media/masters_dissertation.pdf
|
||||
|
|
|
|||
|
|
@ -27,11 +27,11 @@ HIR. Doing borrow checking on MIR has several advantages:
|
|||
### Major phases of the borrow checker
|
||||
|
||||
The borrow checker source is found in
|
||||
[the `rustc_mir::borrow_check` module][b_c]. The main entry point is
|
||||
[the `rustc_borrow_ck` crate][b_c]. The main entry point is
|
||||
the [`mir_borrowck`] query.
|
||||
|
||||
[b_c]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/index.html
|
||||
[`mir_borrowck`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/fn.mir_borrowck.html
|
||||
[b_c]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/index.html
|
||||
[`mir_borrowck`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/fn.mir_borrowck.html
|
||||
|
||||
- We first create a **local copy** of the MIR. In the coming steps,
|
||||
we will modify this copy in place to modify the types and things to
|
||||
|
|
@ -56,4 +56,4 @@ the [`mir_borrowck`] query.
|
|||
require an error to be reported. Doing this check requires the results of all
|
||||
the previous analyses.
|
||||
|
||||
[`replace_regions_in_mir`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/fn.replace_regions_in_mir.html
|
||||
[`replace_regions_in_mir`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/nll/fn.replace_regions_in_mir.html
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ paths roughly correspond to the concept of a [`Place`] from MIR, but
|
|||
they are indexed in ways that enable us to do move analysis more
|
||||
efficiently.
|
||||
|
||||
[`MovePath`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePath.html
|
||||
[`MovePath`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MovePath.html
|
||||
[`Place`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Place.html
|
||||
|
||||
## Move path indices
|
||||
|
|
@ -45,9 +45,9 @@ access the [`MovePath::place`] field like so:
|
|||
move_data.move_paths[mpi].place
|
||||
```
|
||||
|
||||
[move_paths]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MoveData.html#structfield.move_paths
|
||||
[`MovePath::place`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePath.html#structfield.place
|
||||
[`MovePathIndex`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePathIndex.html
|
||||
[move_paths]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MoveData.html#structfield.move_paths
|
||||
[`MovePath::place`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MovePath.html#structfield.place
|
||||
[`MovePathIndex`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MovePathIndex.html
|
||||
|
||||
## Building move paths
|
||||
|
||||
|
|
@ -60,8 +60,8 @@ corresponding [`MovePathIndex`]. It also records when/where that
|
|||
particular move path is moved/initialized, but we'll get to that in a
|
||||
later section.
|
||||
|
||||
[`Gatherer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/builder/struct.Gatherer.html
|
||||
[`MoveData::gather_moves`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MoveData.html#method.gather_moves
|
||||
[`Gatherer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/builder/struct.Gatherer.html
|
||||
[`MoveData::gather_moves`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MoveData.html#method.gather_moves
|
||||
|
||||
### Illegal move paths
|
||||
|
||||
|
|
@ -82,7 +82,7 @@ those just discussed, the function returns an `Err`. This in turn
|
|||
means we don't have to bother tracking whether those places are
|
||||
initialized (which lowers overhead).
|
||||
|
||||
[`move_path_for`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/builder/struct.Gatherer.html#method.move_path_for
|
||||
[`move_path_for`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/builder/struct.Gatherer.html#method.move_path_for
|
||||
|
||||
## Looking up a move-path
|
||||
|
||||
|
|
@ -90,9 +90,9 @@ If you have a [`Place`] and you would like to convert it to a [`MovePathIndex`],
|
|||
can do that using the [`MovePathLookup`] structure found in the [`rev_lookup`] field
|
||||
of [`MoveData`]. There are two different methods:
|
||||
|
||||
[`MoveData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MoveData.html
|
||||
[`MovePathLookup`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePathLookup.html
|
||||
[`rev_lookup`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MoveData.html#structfield.rev_lookup
|
||||
[`MoveData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MoveData.html
|
||||
[`MovePathLookup`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MovePathLookup.html
|
||||
[`rev_lookup`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MoveData.html#structfield.rev_lookup
|
||||
|
||||
- [`find_local`], which takes a [`mir::Local`] representing a local
|
||||
variable. This is the easier method, because we **always** create a
|
||||
|
|
@ -105,10 +105,10 @@ of [`MoveData`]. There are two different methods:
|
|||
that exists (e.g., for `foo[1]`, it might return just the path for
|
||||
`foo`).
|
||||
|
||||
[`find`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePathLookup.html#method.find
|
||||
[`find_local`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePathLookup.html#method.find_local
|
||||
[`find`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MovePathLookup.html#method.find
|
||||
[`find_local`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MovePathLookup.html#method.find_local
|
||||
[`mir::Local`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Local.html
|
||||
[`LookupResult`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/enum.LookupResult.html
|
||||
[`LookupResult`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/enum.LookupResult.html
|
||||
|
||||
## Cross-references
|
||||
|
||||
|
|
@ -126,4 +126,4 @@ whether a move-path (e.g., `a.b`) or any child of that move-path
|
|||
(e.g.,`a.b.c`) matches a given predicate.
|
||||
|
||||
[`Place`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Place.html
|
||||
[`find_in_move_path_or_its_descendants`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MoveData.html#method.find_in_move_path_or_its_descendants
|
||||
[`find_in_move_path_or_its_descendants`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/move_paths/struct.MoveData.html#method.find_in_move_path_or_its_descendants
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ on one at a time (each of them is fairly independent from the others):
|
|||
- outlives constraints (`R1: R2`), which arise from subtyping;
|
||||
- [member constraints][m_c] (`member R_m of [R_c...]`), which arise from impl Trait.
|
||||
|
||||
[`propagate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.propagate_constraints
|
||||
[`propagate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#method.propagate_constraints
|
||||
[m_c]: ./member_constraints.md
|
||||
|
||||
In this chapter, we'll explain the "heart" of constraint propagation,
|
||||
|
|
@ -70,8 +70,8 @@ though; instead, we store a (sparse) bitset per region variable (of
|
|||
type [`LivenessValues`]). This way we only need a single bit for each
|
||||
liveness constraint.
|
||||
|
||||
[`liveness_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.liveness_constraints
|
||||
[`LivenessValues`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/values/struct.LivenessValues.html
|
||||
[`liveness_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#structfield.liveness_constraints
|
||||
[`LivenessValues`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/region_infer/values/struct.LivenessValues.html
|
||||
|
||||
One thing that is worth mentioning: All lifetime parameters are always
|
||||
considered to be live over the entire function body. This is because
|
||||
|
|
@ -114,9 +114,9 @@ induces an edge `'a -> 'b`. This conversion happens in the
|
|||
[`RegionInferenceContext::new`] function that creates the inference
|
||||
context.
|
||||
|
||||
[`OutlivesConstraintSet`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/constraints/struct.OutlivesConstraintSet.html
|
||||
[graph-fn]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/constraints/struct.OutlivesConstraintSet.html#method.graph
|
||||
[`RegionInferenceContext::new`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.new
|
||||
[`OutlivesConstraintSet`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/constraints/struct.OutlivesConstraintSet.html
|
||||
[graph-fn]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/constraints/struct.OutlivesConstraintSet.html#method.graph
|
||||
[`RegionInferenceContext::new`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#method.new
|
||||
|
||||
When using a graph representation, we can detect regions that must be equal
|
||||
by looking for cycles. That is, if you have a constraint like
|
||||
|
|
@ -148,8 +148,8 @@ of fields are defined in terms of SCCs. For example, the
|
|||
of a specific region `'a` then, we first figure out the SCC that the
|
||||
region is a part of, and then find the value of that SCC.
|
||||
|
||||
[`constraint_sccs`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.constraint_sccs
|
||||
[`scc_values`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.scc_values
|
||||
[`constraint_sccs`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#structfield.constraint_sccs
|
||||
[`scc_values`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#structfield.scc_values
|
||||
|
||||
When we compute SCCs, we not only figure out which regions are a
|
||||
member of each SCC, we also figure out the edges between them. So for example
|
||||
|
|
|
|||
|
|
@ -31,9 +31,9 @@ relationships to one another. So if you have e.g. `where 'a: 'b`, then
|
|||
the [`UniversalRegionRelations`] struct would track that `'a: 'b` is
|
||||
known to hold (which could be tested with the [`outlives`] function.
|
||||
|
||||
[`UniversalRegions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/universal_regions/struct.UniversalRegions.html
|
||||
[`UniversalRegionRelations`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/type_check/free_region_relations/struct.UniversalRegionRelations.html
|
||||
[`outlives`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/type_check/free_region_relations/struct.UniversalRegionRelations.html#method.outlives
|
||||
[`UniversalRegions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_borrowck/universal_regions/struct.UniversalRegions.html
|
||||
[`UniversalRegionRelations`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_borrowck/type_check/free_region_relations/struct.UniversalRegionRelations.html
|
||||
[`outlives`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_borrowck/type_check/free_region_relations/struct.UniversalRegionRelations.html#method.outlives
|
||||
|
||||
## Everything is a region variable
|
||||
|
||||
|
|
@ -58,7 +58,7 @@ type). These subdivisions are not important for the topics discussed
|
|||
here, but become important when we consider [closure constraint
|
||||
propagation](./closure_constraints.html), so we discuss them there.
|
||||
|
||||
[`RegionClassification`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/universal_regions/enum.RegionClassification.html#variant.Local
|
||||
[`RegionClassification`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_borrowck/universal_regions/enum.RegionClassification.html#variant.Local
|
||||
|
||||
## Universal lifetimes as the elements of a region's value
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ liveness constraint (i.e., `'a` must extend until the end of
|
|||
itself). In the code, these liveness constraints are setup in
|
||||
[`init_free_and_bound_regions`].
|
||||
|
||||
[`init_free_and_bound_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.init_free_and_bound_regions
|
||||
[`init_free_and_bound_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_borrowck/region_infer/struct.RegionInferenceContext.html#method.init_free_and_bound_regions
|
||||
|
||||
## Propagating outlives constraints for universal regions
|
||||
|
||||
|
|
@ -124,4 +124,4 @@ not, as in our example, that is an error. This check is done in the
|
|||
universal regions, inspects their final value, and tests against the
|
||||
declared [`UniversalRegionRelations`].
|
||||
|
||||
[`check_universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.check_universal_regions
|
||||
[`check_universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_borrowck/region_infer/struct.RegionInferenceContext.html#method.check_universal_regions
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# The MIR type-check
|
||||
|
||||
A key component of the borrow check is the
|
||||
[MIR type-check](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/type_check/index.html).
|
||||
[MIR type-check](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/type_check/index.html).
|
||||
This check walks the MIR and does a complete "type check" -- the same
|
||||
kind you might find in any other language. In the process of doing
|
||||
this type-check, we also uncover the region constraints that apply to
|
||||
|
|
|
|||
|
|
@ -35,11 +35,11 @@ Other constants get represented as [`ConstValue::Scalar`]
|
|||
or [`ConstValue::Slice`] if possible. This means that the `const_eval_*`
|
||||
functions cannot be used to create miri-pointers to the evaluated constant.
|
||||
If you need the value of a constant inside Miri, you need to directly work with
|
||||
[`eval_const_to_op`].
|
||||
[`const_to_op`].
|
||||
|
||||
[`GlobalId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/struct.GlobalId.html
|
||||
[`ConstValue::Scalar`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/value/enum.ConstValue.html#variant.Scalar
|
||||
[`ConstValue::Slice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/value/enum.ConstValue.html#variant.Slice
|
||||
[`ConstValue::ByRef`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/value/enum.ConstValue.html#variant.ByRef
|
||||
[`EvalToConstValueResult`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/error/type.EvalToConstValueResult.html
|
||||
[`eval_const_to_op`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.InterpCx.html#method.eval_const_to_op
|
||||
[`const_to_op`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/struct.InterpCx.html#method.const_to_op
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ The `InstrumentCoverage` MIR pass is documented in
|
|||
[more detail below][instrument-coverage-pass-details].
|
||||
|
||||
[mir-passes]: mir/passes.md
|
||||
[mir-instrument-coverage]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_mir/src/transform/coverage
|
||||
[mir-instrument-coverage]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_mir_transform/src/coverage
|
||||
[code-region]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/coverage/struct.CodeRegion.html
|
||||
[counter-coverage-kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/coverage/enum.CoverageKind.html#variant.Counter
|
||||
[expression-coverage-kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/coverage/enum.CoverageKind.html#variant.Expression
|
||||
|
|
@ -358,13 +358,13 @@ example, `A + (B - C)` might represent an `Expression` count computed from three
|
|||
other counters, `A`, `B`, and `C`, but computing that value requires an
|
||||
intermediate expression for `B - C`.
|
||||
|
||||
[instrumentor]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html
|
||||
[coverage-graph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.CoverageGraph.html
|
||||
[inject-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html#method.inject_counters
|
||||
[bcb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.BasicCoverageBlock.html
|
||||
[debug]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/debug
|
||||
[generate-coverage-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpans.html#method.generate_coverage_spans
|
||||
[make-bcb-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/counters/struct.BcbCounters.html#method.make_bcb_counters
|
||||
[instrumentor]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/struct.Instrumentor.html
|
||||
[coverage-graph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/graph/struct.CoverageGraph.html
|
||||
[inject-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/struct.Instrumentor.html#method.inject_counters
|
||||
[bcb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/graph/struct.BasicCoverageBlock.html
|
||||
[debug]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/debug
|
||||
[generate-coverage-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/spans/struct.CoverageSpans.html#method.generate_coverage_spans
|
||||
[make-bcb-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/counters/struct.BcbCounters.html#method.make_bcb_counters
|
||||
|
||||
### The `CoverageGraph`
|
||||
|
||||
|
|
@ -472,11 +472,11 @@ function--[`bcb_from_bb()`][bcb-from-bb]--to look up a `BasicCoverageBlock` from
|
|||
[directed-graph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_data_structures/graph/trait.DirectedGraph.html
|
||||
[graph-traits]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_data_structures/graph/index.html#traits
|
||||
[mir-dev-guide]: mir/index.md
|
||||
[compute-basic-coverage-blocks]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.CoverageGraph.html#method.compute_basic_coverage_blocks
|
||||
[simplify-cfg]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/simplify/struct.SimplifyCfg.html
|
||||
[compute-basic-coverage-blocks]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/graph/struct.CoverageGraph.html#method.compute_basic_coverage_blocks
|
||||
[simplify-cfg]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/simplify/struct.SimplifyCfg.html
|
||||
[rust-lang/rust#78544]: https://github.com/rust-lang/rust/issues/78544
|
||||
[mir-debugging]: mir/debugging.md
|
||||
[bcb-from-bb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.CoverageGraph.html#method.bcb_from_bb
|
||||
[bcb-from-bb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/graph/struct.CoverageGraph.html#method.bcb_from_bb
|
||||
|
||||
### `CoverageSpans`
|
||||
|
||||
|
|
@ -521,9 +521,9 @@ MIR `Statement`s and `Terminator`s contributing to the `CoverageSpan`, and
|
|||
their individual `Span`s (which should be encapsulated within the code region
|
||||
of the refined `CoverageSpan`)
|
||||
|
||||
[coverage-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpans.html
|
||||
[coverage-span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpan.html
|
||||
[to-refined-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpans.html#method.to_refined_spans
|
||||
[coverage-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/spans/struct.CoverageSpans.html
|
||||
[coverage-span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/spans/struct.CoverageSpan.html
|
||||
[to-refined-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/spans/struct.CoverageSpans.html#method.to_refined_spans
|
||||
|
||||
### `make_bcb_counters()`
|
||||
|
||||
|
|
@ -586,8 +586,8 @@ of `Counter` vs. `Expression` also depends on the order of counter
|
|||
assignments, and whether a BCB or incoming edge counter already has
|
||||
its `Counter` or `Expression`.
|
||||
|
||||
[bcb-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/counters/struct.BcbCounters.html
|
||||
[traverse-coverage-graph-with-loops]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.TraverseCoverageGraphWithLoops.html
|
||||
[bcb-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/counters/struct.BcbCounters.html
|
||||
[traverse-coverage-graph-with-loops]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/graph/struct.TraverseCoverageGraphWithLoops.html
|
||||
|
||||
### Injecting counters into a MIR `BasicBlock`
|
||||
|
||||
|
|
@ -616,9 +616,9 @@ still must be injected because they contribute to other `Expression`s.
|
|||
Finally, edge's with a `CoverageKind::Counter` require a new `BasicBlock`,
|
||||
so the counter is only incremented when traversing the branch edge.
|
||||
|
||||
[inject-coverage-span-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html#method.inject_coverage_span_counters
|
||||
[inject-indirect-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html#method.inject_indirect_counters
|
||||
[inject-intermediate-expression]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/fn.inject_intermediate_expression.html
|
||||
[inject-coverage-span-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/struct.Instrumentor.html#method.inject_coverage_span_counters
|
||||
[inject-indirect-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/struct.Instrumentor.html#method.inject_indirect_counters
|
||||
[inject-intermediate-expression]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/fn.inject_intermediate_expression.html
|
||||
|
||||
### Additional Debugging Support
|
||||
|
||||
|
|
@ -627,4 +627,4 @@ See the
|
|||
for a detailed description of the debug output, logging, and configuration options
|
||||
available to developers working on the `InstrumentCoverage` pass.
|
||||
|
||||
[coverage-debugging]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/debug/index.html
|
||||
[coverage-debugging]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/coverage/debug/index.html
|
||||
|
|
|
|||
|
|
@ -218,17 +218,17 @@ the example below:
|
|||
["gen-kill" problems]: https://en.wikipedia.org/wiki/Data-flow_analysis#Bit_vector_problems
|
||||
[*Static Program Analysis*]: https://cs.au.dk/~amoeller/spa/
|
||||
[Debugging MIR]: ./debugging.html
|
||||
[`AnalysisDomain`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.AnalysisDomain.html
|
||||
[`Analysis`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.Analysis.html
|
||||
[`Engine`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/struct.Engine.html
|
||||
[`GenKillAnalysis`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.GenKillAnalysis.html
|
||||
[`JoinSemiLattice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/lattice/trait.JoinSemiLattice.html
|
||||
[`NAME`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.AnalysisDomain.html#associatedconstant.NAME
|
||||
[`ResultsCursor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/struct.ResultsCursor.html
|
||||
[`ResultsVisitor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.ResultsVisitor.html
|
||||
[`apply_call_return_effect`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.Analysis.html#tymethod.apply_call_return_effect
|
||||
[`into_engine`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.Analysis.html#method.into_engine
|
||||
[`lattice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/lattice/index.html
|
||||
[`AnalysisDomain`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/trait.AnalysisDomain.html
|
||||
[`Analysis`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/trait.Analysis.html
|
||||
[`Engine`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/struct.Engine.html
|
||||
[`GenKillAnalysis`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/trait.GenKillAnalysis.html
|
||||
[`JoinSemiLattice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/lattice/trait.JoinSemiLattice.html
|
||||
[`NAME`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/trait.AnalysisDomain.html#associatedconstant.NAME
|
||||
[`ResultsCursor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/struct.ResultsCursor.html
|
||||
[`ResultsVisitor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/trait.ResultsVisitor.html
|
||||
[`apply_call_return_effect`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/trait.Analysis.html#tymethod.apply_call_return_effect
|
||||
[`into_engine`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/trait.Analysis.html#method.into_engine
|
||||
[`lattice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/lattice/index.html
|
||||
[goethe]: https://www.youtube.com/watch?v=NVBQSR_HdL0&list=PL_sGR8T76Y58l3Gck3ZwIIHLWEmXrOLV_&index=2
|
||||
[lattice]: https://en.wikipedia.org/wiki/Lattice_(order)
|
||||
[wiki]: https://en.wikipedia.org/wiki/Data-flow_analysis#Basic_principles
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ will select for things that reference *both* `main` and the pass
|
|||
> ls mir_dump
|
||||
rustc.main.000-000.CleanEndRegions.after.mir rustc.main.000-000.CleanEndRegions.before.mir
|
||||
```
|
||||
|
||||
<!--- TODO: Change NoLandingPads. [#1232](https://github.com/rust-lang/rustc-dev-guide/issues/1232) -->
|
||||
Filters can also have `|` parts to combine multiple sets of
|
||||
`&`-filters. For example `main & CleanEndRegions | main &
|
||||
NoLandingPads` will select *either* `main` and `CleanEndRegions` *or*
|
||||
|
|
|
|||
|
|
@ -18,7 +18,9 @@ graphs and desugaring), you may enjoy the
|
|||
## Introduction to MIR
|
||||
|
||||
MIR is defined in the [`compiler/rustc_middle/src/mir/`][mir] module, but much of the code
|
||||
that manipulates it is found in [`compiler/rustc_mir`][mirmanip].
|
||||
that manipulates it is found in [`compiler/rustc_mir_build`][mirmanip_build],
|
||||
[`compiler/rustc_mir_transform`][mirmanip_transform], and
|
||||
[`compiler/rustc_mir_dataflow`][mirmanip_dataflow].
|
||||
|
||||
[RFC 1211]: https://rust-lang.github.io/rfcs/1211-mir.html
|
||||
|
||||
|
|
@ -258,7 +260,9 @@ See the const-eval WG's [docs on promotion](https://github.com/rust-lang/const-e
|
|||
|
||||
|
||||
[mir]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/index.html
|
||||
[mirmanip]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/index.html
|
||||
[mirmanip_build]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/index.html
|
||||
[mirmanip_transform]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/index.html
|
||||
[mirmanip_dataflow]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/index.html
|
||||
[`Body`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html
|
||||
[newtype'd]: ../appendix/glossary.html#newtype
|
||||
[basicblocks]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#structfield.basic_blocks
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ for a given [`DefId`][defid]. This query makes sure that the borrow checker has
|
|||
run and that some validation has occurred. Then, it [steals][steal] the MIR,
|
||||
optimizes it, and returns the improved MIR.
|
||||
|
||||
[optmir]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.optimized_mir.html
|
||||
[optmir]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/fn.optimized_mir.html
|
||||
[query]: https://rustc-dev-guide.rust-lang.org/query.html
|
||||
[defid]: https://rustc-dev-guide.rust-lang.org/appendix/glossary.html#def-id
|
||||
[steal]: https://rustc-dev-guide.rust-lang.org/mir/passes.html?highlight=steal#stealing
|
||||
|
|
@ -42,7 +42,7 @@ optimizes it, and returns the improved MIR.
|
|||
test output before you implement the optimization is so that you (and your
|
||||
reviewers) can see a before/after diff of what the optimization changed.
|
||||
|
||||
4. Implement a new optimization in [`compiler/rustc_mir/src/transform`].
|
||||
4. Implement a new optimization in [`compiler/rustc_mir_transform/src`].
|
||||
The fastest and easiest way to do this is to
|
||||
|
||||
1. pick a small optimization (such as [`no_landing_pads`]) and copy it
|
||||
|
|
@ -71,9 +71,10 @@ If you have any questions along the way, feel free to ask in
|
|||
`#t-compiler/wg-mir-opt` on Zulip.
|
||||
|
||||
[mir-opt-test-readme]: https://github.com/rust-lang/rust/blob/master/src/test/mir-opt/README.md
|
||||
[`compiler/rustc_mir/src/transform`]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_mir/src/transform
|
||||
[`no_landing_pads`]: https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir/src/transform/no_landing_pads.rs
|
||||
[`run_optimization_passes()`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.run_optimization_passes.html
|
||||
[`compiler/rustc_mir_transform/src`]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_mir_transform/src
|
||||
<!--- TODO: Change NoLandingPads. [#1232](https://github.com/rust-lang/rustc-dev-guide/issues/1232) -->
|
||||
[`no_landing_pads`]: https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir_transform/src/no_landing_pads.rs
|
||||
[`run_optimization_passes()`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/fn.run_optimization_passes.html
|
||||
|
||||
## Defining optimization passes
|
||||
|
||||
|
|
@ -81,11 +82,11 @@ The list of passes run and the order in which they are run is defined by the
|
|||
[`run_optimization_passes`][rop] function. It contains an array of passes to
|
||||
run. Each pass in the array is a struct that implements the [`MirPass`] trait.
|
||||
The array is an array of `&dyn MirPass` trait objects. Typically, a pass is
|
||||
implemented in its own submodule of the [`rustc_mir::transform`][trans] module.
|
||||
implemented in its own module of the [`rustc_mir_transform`][trans] crate.
|
||||
|
||||
[rop]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.run_optimization_passes.html
|
||||
[`MirPass`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/trait.MirPass.html
|
||||
[trans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/index.html
|
||||
[rop]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/fn.run_optimization_passes.html
|
||||
[`MirPass`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/trait.MirPass.html
|
||||
[trans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/index.html
|
||||
|
||||
Some examples of passes are:
|
||||
- `CleanupNonCodegenStatements`: remove some of the info that is only needed for
|
||||
|
|
@ -94,7 +95,7 @@ Some examples of passes are:
|
|||
|
||||
You can see the ["Implementors" section of the `MirPass` rustdocs][impl] for more examples.
|
||||
|
||||
[impl]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/trait.MirPass.html#implementors
|
||||
[impl]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/trait.MirPass.html#implementors
|
||||
[constprop]: https://en.wikipedia.org/wiki/Constant_folding#Constant_propagation
|
||||
|
||||
## MIR optimization levels
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ where we want to access the MIR for type checking or other purposes:
|
|||
A `MirPass` is some bit of code that processes the MIR, typically –
|
||||
but not always – transforming it along the way somehow. For example,
|
||||
it might perform an optimization. The `MirPass` trait itself is found
|
||||
in [the `rustc_mir::transform` module][mirtransform], and it
|
||||
in [the `rustc_mir_transform` crate][mirtransform], and it
|
||||
basically consists of one method, `run_pass`, that simply gets an
|
||||
`&mut Mir` (along with the tcx and some information about where it
|
||||
came from). The MIR is therefore modified in place (which helps to
|
||||
|
|
@ -96,6 +96,7 @@ This mechanism is a bit dodgy. There is a discussion of more elegant
|
|||
alternatives in [rust-lang/rust#41710].
|
||||
|
||||
[rust-lang/rust#41710]: https://github.com/rust-lang/rust/issues/41710
|
||||
[mirtransform]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/
|
||||
[`NoLandingPads`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/no_landing_pads/struct.NoLandingPads.html
|
||||
[mirtransform]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/
|
||||
<!--- TODO: Change NoLandingPads. [#1232](https://github.com/rust-lang/rustc-dev-guide/issues/1232) -->
|
||||
[`NoLandingPads`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/no_landing_pads/struct.NoLandingPads.html
|
||||
[MIR visitor]: ./visitor.html
|
||||
|
|
|
|||
|
|
@ -41,7 +41,8 @@ A very simple example of a visitor can be found in [`NoLandingPads`].
|
|||
That visitor doesn't even require any state: it just visits all
|
||||
terminators and removes their `unwind` successors.
|
||||
|
||||
[`NoLandingPads`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/no_landing_pads/struct.NoLandingPads.html
|
||||
<!--- TODO: Change NoLandingPads. [#1232](https://github.com/rust-lang/rustc-dev-guide/issues/1232) -->
|
||||
[`NoLandingPads`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/no_landing_pads/struct.NoLandingPads.html
|
||||
|
||||
## Traversal
|
||||
|
||||
|
|
|
|||
14
src/miri.md
14
src/miri.md
|
|
@ -100,11 +100,11 @@ further queries need to be executed in order to get at something as simple as a
|
|||
Future evaluations of the same constants will not actually invoke
|
||||
Miri, but just use the cached result.
|
||||
|
||||
[`Operand`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/enum.Operand.html
|
||||
[`Immediate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/enum.Immediate.html
|
||||
[`Operand`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/enum.Operand.html
|
||||
[`Immediate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/enum.Immediate.html
|
||||
[`ConstValue`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/enum.ConstValue.html
|
||||
[`Scalar`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/enum.Scalar.html
|
||||
[`op_to_const`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/const_eval/eval_queries/fn.op_to_const.html
|
||||
[`op_to_const`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/const_eval/eval_queries/fn.op_to_const.html
|
||||
|
||||
## Datastructures
|
||||
|
||||
|
|
@ -183,7 +183,7 @@ needed to support circular statics, where we need to have a `Pointer` to a
|
|||
`static` for which we cannot yet have an `Allocation` as we do not know the
|
||||
bytes of its value.
|
||||
|
||||
[`Memory`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.Memory.html
|
||||
[`Memory`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/struct.Memory.html
|
||||
[`Allocation`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/struct.Allocation.html
|
||||
[`Pointer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/struct.Pointer.html
|
||||
[`GlobalAlloc`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/enum.GlobalAlloc.html
|
||||
|
|
@ -209,7 +209,7 @@ values.
|
|||
|
||||
Although the main entry point to constant evaluation is the `tcx.const_eval_*`
|
||||
functions, there are additional functions in
|
||||
[rustc_mir/src/const_eval.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/const_eval/index.html)
|
||||
[rustc_const_eval/src/const_eval](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/index.html)
|
||||
that allow accessing the fields of a `ConstValue` (`ByRef` or otherwise). You should
|
||||
never have to access an `Allocation` directly except for translating it to the
|
||||
compilation target (at the moment just LLVM).
|
||||
|
|
@ -220,7 +220,7 @@ function with no arguments, except that constants do not allow local (named)
|
|||
variables at the time of writing this guide.
|
||||
|
||||
A stack frame is defined by the `Frame` type in
|
||||
[rustc_mir/src/interpret/eval_context.rs](https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir/src/interpret/eval_context.rs)
|
||||
[rustc_const_eval/src/interpret/eval_context.rs](https://github.com/rust-lang/rust/blob/master/compiler/rustc_const_eval/src/interpret/eval_context.rs)
|
||||
and contains all the local
|
||||
variables memory (`None` at the start of evaluation). Each frame refers to the
|
||||
evaluation of either the root constant or subsequent calls to `const fn`. The
|
||||
|
|
@ -232,7 +232,7 @@ The frames are just a `Vec<Frame>`, there's no way to actually refer to a
|
|||
memory that can be referred to are `Allocation`s.
|
||||
|
||||
Miri now calls the `step` method (in
|
||||
[rustc_mir/src/interpret/step.rs](https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir/src/interpret/step.rs)
|
||||
[rustc_const_eval/src/interpret/step.rs](https://github.com/rust-lang/rust/blob/master/compiler/rustc_const_eval/src/interpret/step.rs)
|
||||
) until it either returns an error or has no further statements to execute. Each
|
||||
statement will now initialize or modify the locals or the virtual memory
|
||||
referred to by a local. This might require evaluating other constants or
|
||||
|
|
|
|||
|
|
@ -373,15 +373,15 @@ For more details on bootstrapping, see
|
|||
- The Mid Level Intermediate Representation (MIR)
|
||||
- Guide: [The MIR (Mid level IR)](https://rustc-dev-guide.rust-lang.org/mir/index.html)
|
||||
- Definition: [`rustc_middle/src/mir`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/index.html)
|
||||
- Definition of source that manipulates the MIR: [`rustc_mir`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/index.html)
|
||||
- Definition of sources that manipulates the MIR: [`rustc_mir_build`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/index.html), [`rustc_mir_dataflow`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_dataflow/index.html), [`rustc_mir_transform`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/index.html)
|
||||
- The Borrow Checker
|
||||
- Guide: [MIR Borrow Check](https://rustc-dev-guide.rust-lang.org/borrow_check.html)
|
||||
- Definition: [`rustc_mir/borrow_check`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/index.html)
|
||||
- Main entry point: [`mir_borrowck` query](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/fn.mir_borrowck.html)
|
||||
- Definition: [`rustc_borrowck`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/index.html)
|
||||
- Main entry point: [`mir_borrowck` query](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/fn.mir_borrowck.html)
|
||||
- MIR Optimizations
|
||||
- Guide: [MIR Optimizations](https://rustc-dev-guide.rust-lang.org/mir/optimizations.html)
|
||||
- Definition: [`rustc_mir/transform`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/index.html)
|
||||
- Main entry point: [`optimized_mir` query](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.optimized_mir.html)
|
||||
- Definition: [`rustc_mir_transform`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/index.html)
|
||||
- Main entry point: [`optimized_mir` query](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_transform/fn.optimized_mir.html)
|
||||
- Code Generation
|
||||
- Guide: [Code Generation](https://rustc-dev-guide.rust-lang.org/backend/codegen.html)
|
||||
- Generating Machine Code from LLVM IR with LLVM - **TODO: reference?**
|
||||
|
|
|
|||
|
|
@ -268,14 +268,14 @@ Percentage : 43%
|
|||
|
||||
Tree
|
||||
| matched `{do_mir_borrowck}` (43% total, 0% self)
|
||||
: | rustc_mir::borrow_check::nll::compute_regions (20% total, 0% self)
|
||||
: : | rustc_mir::borrow_check::nll::type_check::type_check_internal (13% total, 0% self)
|
||||
: | rustc_borrowck::nll::compute_regions (20% total, 0% self)
|
||||
: : | rustc_borrowck::nll::type_check::type_check_internal (13% total, 0% self)
|
||||
: : : | core::ops::function::FnOnce::call_once (5% total, 0% self)
|
||||
: : : : | rustc_mir::borrow_check::nll::type_check::liveness::generate (5% total, 3% self)
|
||||
: : : | <rustc_mir::borrow_check::nll::type_check::TypeVerifier<'a, 'b, 'tcx> as rustc::mir::visit::Visitor<'tcx>>::visit_mir (3% total, 0% self)
|
||||
: : : : | rustc_borrowck::nll::type_check::liveness::generate (5% total, 3% self)
|
||||
: : : | <rustc_borrowck::nll::type_check::TypeVerifier<'a, 'b, 'tcx> as rustc::mir::visit::Visitor<'tcx>>::visit_mir (3% total, 0% self)
|
||||
: | rustc::mir::visit::Visitor::visit_mir (8% total, 6% self)
|
||||
: | <rustc_mir::borrow_check::MirBorrowckCtxt<'cx, 'tcx> as rustc_mir::dataflow::DataflowResultsConsumer<'cx, 'tcx>>::visit_statement_entry (5% total, 0% self)
|
||||
: | rustc_mir::dataflow::do_dataflow (3% total, 0% self)
|
||||
: | <rustc_borrowck::MirBorrowckCtxt<'cx, 'tcx> as rustc_mir_dataflow::DataflowResultsConsumer<'cx, 'tcx>>::visit_statement_entry (5% total, 0% self)
|
||||
: | rustc_mir_dataflow::do_dataflow (3% total, 0% self)
|
||||
```
|
||||
|
||||
What happens with `--tree-callees` is that
|
||||
|
|
@ -319,10 +319,10 @@ Percentage : 100%
|
|||
|
||||
Tree
|
||||
| matched `{do_mir_borrowck}` (100% total, 0% self)
|
||||
: | rustc_mir::borrow_check::nll::compute_regions (47% total, 0% self) [...]
|
||||
: | rustc_borrowck::nll::compute_regions (47% total, 0% self) [...]
|
||||
: | rustc::mir::visit::Visitor::visit_mir (19% total, 15% self) [...]
|
||||
: | <rustc_mir::borrow_check::MirBorrowckCtxt<'cx, 'tcx> as rustc_mir::dataflow::DataflowResultsConsumer<'cx, 'tcx>>::visit_statement_entry (13% total, 0% self) [...]
|
||||
: | rustc_mir::dataflow::do_dataflow (8% total, 1% self) [...]
|
||||
: | <rustc_borrowck::MirBorrowckCtxt<'cx, 'tcx> as rustc_mir_dataflow::DataflowResultsConsumer<'cx, 'tcx>>::visit_statement_entry (13% total, 0% self) [...]
|
||||
: | rustc_mir_dataflow::do_dataflow (8% total, 1% self) [...]
|
||||
```
|
||||
|
||||
Here you see that `compute_regions` came up as "47% total" — that
|
||||
|
|
|
|||
Loading…
Reference in New Issue