Rollup merge of #88983 - willcrichton:allow-single-polonius-call, r=ecstatic-morse
Allow calling `get_body_with_borrowck_facts` without `-Z polonius` For my [static analysis tool](https://github.com/willcrichton/flowistry), I need to access the set of outlives-constraints. Recently, #86977 merged a way to access these facts via Polonius. However, the merged implementation requires `-Z polonius` to be provided to use this feature. This uses Polonius for borrow checking on the entire crate, which as described [here](https://rust-lang.zulipchat.com/#narrow/stream/186049-t-compiler.2Fwg-polonius/topic/Polonius.20performance.20in.20a.20rustc.20plugin/near/251301631), is very slow. This PR allows `get_body_with_borrowck_facts` to be called without `-Z polonius`. This is essential for my tool to run in a sensible length of time. This is a temporary patch as the Polonius-related APIs develop -- I can update my code as future changes happen. Additionally, this PR also makes public two APIs that were previously public but then became private after `rustc_mir` got broken up: `rustc_mir_dataflow::framework::graphviz` and `rustc_mir_transform::MirPass`. I need both of these for my analysis tool. (I can break this change into a separate PR if necessary.)
This commit is contained in:
commit
4601a71a4b
@ -14,7 +14,9 @@
|
||||
};
|
||||
|
||||
/// This function computes Polonius facts for the given body. It makes a copy of
|
||||
/// the body because it needs to regenerate the region identifiers.
|
||||
/// the body because it needs to regenerate the region identifiers. This function
|
||||
/// should never be invoked during a typical compilation session due to performance
|
||||
/// issues with Polonius.
|
||||
///
|
||||
/// Note:
|
||||
/// * This function will panic if the required body was already stolen. This
|
||||
@ -22,8 +24,6 @@
|
||||
/// because they are evaluated during typechecking. The panic can be avoided
|
||||
/// by overriding the `mir_borrowck` query. You can find a complete example
|
||||
/// that shows how to do this at `src/test/run-make/obtain-borrowck/`.
|
||||
/// * This function will also panic if computation of Polonius facts
|
||||
/// (`-Zpolonius` flag) is not enabled.
|
||||
///
|
||||
/// * Polonius is highly unstable, so expect regular changes in its signature or other details.
|
||||
pub fn get_body_with_borrowck_facts<'tcx>(
|
||||
|
@ -154,11 +154,6 @@ fn do_mir_borrowck<'a, 'tcx>(
|
||||
|
||||
debug!("do_mir_borrowck(def = {:?})", def);
|
||||
|
||||
assert!(
|
||||
!return_body_with_facts || infcx.tcx.sess.opts.debugging_opts.polonius,
|
||||
"borrowck facts can be requested only when Polonius is enabled"
|
||||
);
|
||||
|
||||
let tcx = infcx.tcx;
|
||||
let param_env = tcx.param_env(def.did);
|
||||
let id = tcx.hir().local_def_id_to_hir_id(def.did);
|
||||
@ -235,6 +230,8 @@ fn do_mir_borrowck<'a, 'tcx>(
|
||||
let borrow_set =
|
||||
Rc::new(BorrowSet::build(tcx, body, locals_are_invalidated_at_exit, &mdpe.move_data));
|
||||
|
||||
let use_polonius = return_body_with_facts || infcx.tcx.sess.opts.debugging_opts.polonius;
|
||||
|
||||
// Compute non-lexical lifetimes.
|
||||
let nll::NllOutput {
|
||||
regioncx,
|
||||
@ -254,6 +251,7 @@ fn do_mir_borrowck<'a, 'tcx>(
|
||||
&mdpe.move_data,
|
||||
&borrow_set,
|
||||
&upvars,
|
||||
use_polonius,
|
||||
);
|
||||
|
||||
// Dump MIR results into a file, if that is enabled. This let us
|
||||
|
@ -164,8 +164,10 @@ pub(crate) fn compute_regions<'cx, 'tcx>(
|
||||
move_data: &MoveData<'tcx>,
|
||||
borrow_set: &BorrowSet<'tcx>,
|
||||
upvars: &[Upvar<'tcx>],
|
||||
use_polonius: bool,
|
||||
) -> NllOutput<'tcx> {
|
||||
let mut all_facts = AllFacts::enabled(infcx.tcx).then_some(AllFacts::default());
|
||||
let mut all_facts =
|
||||
(use_polonius || AllFacts::enabled(infcx.tcx)).then_some(AllFacts::default());
|
||||
|
||||
let universal_regions = Rc::new(universal_regions);
|
||||
|
||||
@ -281,7 +283,7 @@ pub(crate) fn compute_regions<'cx, 'tcx>(
|
||||
all_facts.write_to_dir(dir_path, location_table).unwrap();
|
||||
}
|
||||
|
||||
if infcx.tcx.sess.opts.debugging_opts.polonius {
|
||||
if use_polonius {
|
||||
let algorithm =
|
||||
env::var("POLONIUS_ALGORITHM").unwrap_or_else(|_| String::from("Hybrid"));
|
||||
let algorithm = Algorithm::from_str(&algorithm).unwrap();
|
||||
|
@ -28,8 +28,8 @@
|
||||
on_lookup_result_bits,
|
||||
};
|
||||
pub use self::framework::{
|
||||
fmt, lattice, visit_results, Analysis, AnalysisDomain, Backward, Direction, Engine, Forward,
|
||||
GenKill, GenKillAnalysis, JoinSemiLattice, Results, ResultsCursor, ResultsRefCursor,
|
||||
fmt, graphviz, lattice, visit_results, Analysis, AnalysisDomain, Backward, Direction, Engine,
|
||||
Forward, GenKill, GenKillAnalysis, JoinSemiLattice, Results, ResultsCursor, ResultsRefCursor,
|
||||
ResultsVisitable, ResultsVisitor,
|
||||
};
|
||||
|
||||
|
@ -76,7 +76,7 @@
|
||||
use rustc_const_eval::transform::check_consts;
|
||||
use rustc_const_eval::transform::promote_consts;
|
||||
use rustc_const_eval::transform::validate;
|
||||
use rustc_const_eval::transform::MirPass;
|
||||
pub use rustc_const_eval::transform::MirPass;
|
||||
use rustc_mir_dataflow::rustc_peek;
|
||||
|
||||
pub fn provide(providers: &mut Providers) {
|
||||
|
Loading…
Reference in New Issue
Block a user