Module rustc_middle::mir
source · Expand description
MIR datatypes and passes. See the rustc dev guide for more info.
Re-exports
pub use self::graphviz::write_mir_graphviz;
pub use self::pretty::create_dump_file;
pub use self::pretty::display_allocation;
pub use self::pretty::dump_enabled;
pub use self::pretty::dump_mir;
pub use self::pretty::write_mir_pretty;
pub use self::pretty::PassWhere;
pub use terminator::*;
Modules
Metadata from source code coverage analysis and instrumentation.
An interpreter for MIR used in CTFE and by miri.
Lazily compute the reverse control-flow graph for the MIR.
query 🔒
Values computed by queries that use MIR.
Lazily compute the inverse of each
SwitchInt
’s switch targets. Modeled after
Predecessors
/PredecessorCache
.syntax 🔒
This defines the syntax of MIR, i.e., the set of available MIR operations, and other definitions
closely related to MIR semantics.
This is in a dedicated file so that changes to this file can be reviewed more carefully.
The intention is that this file only contains datatype declarations, no code.
Methods for the various MIR types. These are intended for use after
building is complete.
TypeFoldable
implementations for MIR typesTypeVisitable
implementations for MIR typesThe MIR Visitor
Structs
A node in the MIR control-flow graph.
Data for a basic block, including a list of its statements.
BlockTailInfo
is attached to the LocalDecl
for temporaries
created during evaluation of expressions in a block tail
expression; that is, a block like { STMT_1; STMT_2; EXPR }
.The lowered representation of a single function.
Indicates an outlives-constraint between a type or between two
free regions declared on the closure.
After we borrow check a closure, we are left with various
requirements that we have inferred between the free regions that
appear in the closure’s signature or on its field types. These
requirements are then verified and proved by the closure’s
creating function. This struct encodes those requirements.
The result of the
mir_const_qualif
query.Constants
Coverage information summarized from a MIR if instrumented for source code coverage (see
compiler option
-Cinstrument-coverage
). This information is generated by the
InstrumentCoverage
MIR pass and can be retrieved via the coverageinfo
query.The constituent parts of a mir constant of kind ADT or array.
A newtype’d index type in the MIR control-flow graph
The layout of generator state.
A MIR local.
Location
represents the position of the start of the statement; or, if
statement_index
equals the number of statements, then the start of the
terminator.Where a specific
mir::Body
comes from.Places roughly correspond to a “location in memory.” Places in MIR are the same mathematical
object as places in Rust. This of course means that what exactly they are is undecided and part
of the Rust memory model. However, they will likely contain at least the following pieces of
information in some form:
Grouped information about the source code origin of a MIR entity.
Intended to be inspected by diagnostics and debuginfo.
Most passes can work with it as a whole, within a single function.
A statement in a basic block, including information about its source code.
An unevaluated (potentially generic) constant used in MIR.
Encodes the effect of a user-supplied type annotation on the
subcomponents of a pattern. The effect is determined by applying the
given list of projections to some underlying base type. Often,
the projection element list
projs
is empty, in which case this
directly encodes a type in base
. But in the case of complex patterns with
subpatterns and bindings, we want to apply only a part of the type to a variable,
in which case the projs
vector is used.A collection of projections into user types.
Debug information pertaining to a user variable.
Enums
Information about an assertion failure.
The subject of a
ClosureOutlivesRequirement
– that is, the thing
that must outlive some region.Outlives-constraints can be categorized to determine whether and why they
are interesting (for error reporting). Order of variants indicates sort
order of the category, thereby influencing diagnostic output.
The
FakeReadCause
describes the type of pattern why a FakeRead statement exists.Extra information about a some locals that’s used for diagnostics and for
classifying variables into local variables, statics, etc, which is needed e.g.
for unsafety checking.
Classifies locals into categories. See
Body::local_kind
.Represents the “flavors” of MIR.
An operand in MIR represents a “value” in Rust, the definition of which is undecided and part of
the memory model. One proposal for a definition of values can be found on UCG.
The different kinds of projections that can be used in the projection of a
Place
.Describes what kind of retag is to be performed.
The various kinds of rvalues that can appear in MIR.
The various kinds of statements that can appear in MIR.
The various kinds of terminators, representing ways of exiting from a basic block.
Constants
Traits
A streamlined trait that you can implement to create a pass; the
pass will be named after the type, and it will consist of a main
loop that goes over each available MIR and applies
run_pass
.Functions
Type Definitions
Type for MIR
Assert
terminator error messages.Types for locals
Alias for projections as they appear in places, where the base is a place
and the index is a local.
Alias for projections as they appear in
UserTypeProjection
, where we
need neither the V
parameter for Index
nor the T
for Field
.Alias for projections that appear in
PlaceBuilder::Upvar
, for which
we cannot provide any field types.