2021-01-05 18:53:07 +00:00
|
|
|
#![feature(associated_type_defaults)]
|
|
|
|
#![feature(box_patterns)]
|
|
|
|
#![feature(exact_size_is_empty)]
|
2023-01-21 22:28:54 +00:00
|
|
|
#![feature(let_chains)]
|
2021-01-05 18:53:07 +00:00
|
|
|
#![feature(min_specialization)]
|
|
|
|
#![feature(stmt_expr_attributes)]
|
|
|
|
#![feature(trusted_step)]
|
2021-09-01 19:05:35 +00:00
|
|
|
#![recursion_limit = "256"]
|
2022-08-19 09:21:14 +00:00
|
|
|
#![deny(rustc::untranslatable_diagnostic)]
|
|
|
|
#![deny(rustc::diagnostic_outside_of_impl)]
|
2021-01-05 18:53:07 +00:00
|
|
|
|
|
|
|
#[macro_use]
|
|
|
|
extern crate tracing;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate rustc_middle;
|
|
|
|
|
2022-05-02 07:31:56 +00:00
|
|
|
use rustc_ast::MetaItem;
|
2022-10-13 09:13:02 +00:00
|
|
|
use rustc_errors::{DiagnosticMessage, SubdiagnosticMessage};
|
2023-04-16 12:33:00 +00:00
|
|
|
use rustc_fluent_macro::fluent_messages;
|
2022-05-02 07:31:56 +00:00
|
|
|
use rustc_hir::def_id::DefId;
|
|
|
|
use rustc_middle::ty::{self, TyCtxt};
|
2020-03-11 11:49:08 +00:00
|
|
|
use rustc_span::symbol::{sym, Symbol};
|
Revised mir-dataflow.
Incorporates many fixes contributed by arielb1.
----
revise borrowck::mir::dataflow code to allow varying domain for bitvectors.
This particular code implements the `BitDenotation` trait for three
analyses:
* `MovingOutStatements`, which, like `borrowck::move_data`, maps each
bit-index to a move instruction, and a 1 means "the effect of this
move reaches this point" (and the assigned l-value, if a scoped
declaration, is still in scope).
* `MaybeInitializedLvals`, which maps each bit-index to an l-value.
A 1 means "there exists a control flow path to this point that
initializes the associated l-value."
* `MaybeUninitializedLvals`, which maps each bit-index to an l-value
A 1 means "there exists a control flow path to this point that
de-initializes the associated l-value."
----
Revised `graphviz` dataflow-rendering support in `borrowck::mir`.
One big difference is that this code is now parameterized over the
`BitDenotation`, so that it can be used to render dataflow results
independent of how the dataflow bitvectors are interpreted; see where
reference to `MoveOut` is replaced by the type parameter `D`.
----
Factor out routine to query subattributes in `#[rustc_mir(..)]`.
(Later commits build upon this for some unit testing and instrumentation.)
----
thread through a tcx so that I can query types of lvalues as part of analysis.
----
Revised `BitDenotation::Ctxt`, allowing variation beyond `MoveData`.
The main motivation is to ease threading through a `TyCtxt`.
(In hindsight it might have been better to instead attach the `TyCtxt`
to each of the different dataflow implementations, but that would
require e.g. switching away from having a `Default` impl, so I am
leaving that experiment for another time.)
2016-05-02 13:50:27 +00:00
|
|
|
|
2021-01-01 00:53:25 +00:00
|
|
|
pub use self::drop_flag_effects::{
|
|
|
|
drop_flag_effects_for_function_entry, drop_flag_effects_for_location,
|
|
|
|
move_path_children_matching, on_all_children_bits, on_all_drop_children_bits,
|
|
|
|
on_lookup_result_bits,
|
|
|
|
};
|
2020-02-29 05:55:41 +00:00
|
|
|
pub use self::framework::{
|
2023-06-27 09:35:32 +00:00
|
|
|
fmt, graphviz, lattice, visit_results, Analysis, AnalysisDomain, AnalysisResults, Backward,
|
2023-05-07 10:20:43 +00:00
|
|
|
CloneAnalysis, Direction, Engine, Forward, GenKill, GenKillAnalysis, JoinSemiLattice,
|
|
|
|
MaybeUnreachable, Results, ResultsCloned, ResultsClonedCursor, ResultsCursor, ResultsRefCursor,
|
|
|
|
ResultsVisitable, ResultsVisitor, SwitchIntEdgeEffects,
|
2020-02-29 05:55:41 +00:00
|
|
|
};
|
2017-06-26 12:57:26 +00:00
|
|
|
|
2017-07-04 10:38:48 +00:00
|
|
|
use self::move_paths::MoveData;
|
|
|
|
|
2018-08-30 21:54:32 +00:00
|
|
|
pub mod drop_flag_effects;
|
2021-01-05 18:53:07 +00:00
|
|
|
pub mod elaborate_drops;
|
2022-08-19 09:21:14 +00:00
|
|
|
mod errors;
|
2020-03-02 17:43:18 +00:00
|
|
|
mod framework;
|
2020-05-04 19:50:36 +00:00
|
|
|
pub mod impls;
|
2017-06-26 12:57:26 +00:00
|
|
|
pub mod move_paths;
|
2021-01-05 18:53:07 +00:00
|
|
|
pub mod rustc_peek;
|
|
|
|
pub mod storage;
|
2023-07-04 07:39:30 +00:00
|
|
|
pub mod un_derefer;
|
2022-08-25 16:43:46 +00:00
|
|
|
pub mod value_analysis;
|
2017-06-26 12:57:26 +00:00
|
|
|
|
2023-03-02 23:18:38 +00:00
|
|
|
fluent_messages! { "../messages.ftl" }
|
2022-10-13 09:13:02 +00:00
|
|
|
|
2019-04-01 18:38:00 +00:00
|
|
|
pub(crate) mod indexes {
|
2020-12-30 17:48:40 +00:00
|
|
|
pub(crate) use super::move_paths::MovePathIndex;
|
2019-04-01 18:38:00 +00:00
|
|
|
}
|
2017-06-26 12:57:26 +00:00
|
|
|
|
2020-02-29 05:47:36 +00:00
|
|
|
pub struct MoveDataParamEnv<'tcx> {
|
2020-12-30 17:48:40 +00:00
|
|
|
pub move_data: MoveData<'tcx>,
|
|
|
|
pub param_env: ty::ParamEnv<'tcx>,
|
2020-02-29 05:47:36 +00:00
|
|
|
}
|
|
|
|
|
2022-05-02 07:31:56 +00:00
|
|
|
pub fn has_rustc_mir_with(tcx: TyCtxt<'_>, def_id: DefId, name: Symbol) -> Option<MetaItem> {
|
|
|
|
for attr in tcx.get_attrs(def_id, sym::rustc_mir) {
|
|
|
|
let items = attr.meta_item_list();
|
|
|
|
for item in items.iter().flat_map(|l| l.iter()) {
|
|
|
|
match item.meta_item() {
|
|
|
|
Some(mi) if mi.has_name(name) => return Some(mi.clone()),
|
|
|
|
_ => continue,
|
2017-07-04 10:38:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-03-20 14:03:11 +00:00
|
|
|
None
|
2017-07-04 10:38:48 +00:00
|
|
|
}
|