mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-06 20:28:33 +00:00
Rollup merge of #93603 - connorff:compute-polonius-liveness-facts-flag, r=ecstatic-morse
Populate liveness facts when calling `get_body_with_borrowck_facts` without `-Z polonius`
For a new feature of [Flowistry](https://github.com/willcrichton/flowistry), a static-analysis tool, we need to obtain a `mir::Body`'s liveness facts using `get_body_with_borrowck_facts` (added in #86977). We'd like to do this without passing `-Z polonius` as a compiler arg to avoid borrow checking the entire crate.
Support for doing this was added in #88983, but the Polonius input facts used for liveness analysis are empty. This happens because the liveness input facts are populated in `liveness::generate` depending only on the value of `AllFacts::enabled` (which is toggled via compiler args).
This PR propagates the [`use_polonius`](8b09ba6a5d/compiler/rustc_borrowck/src/nll.rs (L168)
) flag to `liveness::generate` to support populating liveness facts without requiring the `-Z polonius` flag.
This fix is somewhat patchy - if it'd be better to add more widely-accessible state (like `AllFacts::enabled`) I'd be open to ideas!
This commit is contained in:
commit
3b276cbe04
@ -188,6 +188,7 @@ pub(crate) fn compute_regions<'cx, 'tcx>(
|
|||||||
move_data,
|
move_data,
|
||||||
elements,
|
elements,
|
||||||
upvars,
|
upvars,
|
||||||
|
use_polonius,
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some(all_facts) = &mut all_facts {
|
if let Some(all_facts) = &mut all_facts {
|
||||||
|
@ -37,6 +37,7 @@ pub(super) fn generate<'mir, 'tcx>(
|
|||||||
flow_inits: &mut ResultsCursor<'mir, 'tcx, MaybeInitializedPlaces<'mir, 'tcx>>,
|
flow_inits: &mut ResultsCursor<'mir, 'tcx, MaybeInitializedPlaces<'mir, 'tcx>>,
|
||||||
move_data: &MoveData<'tcx>,
|
move_data: &MoveData<'tcx>,
|
||||||
location_table: &LocationTable,
|
location_table: &LocationTable,
|
||||||
|
use_polonius: bool,
|
||||||
) {
|
) {
|
||||||
debug!("liveness::generate");
|
debug!("liveness::generate");
|
||||||
|
|
||||||
@ -46,7 +47,7 @@ pub(super) fn generate<'mir, 'tcx>(
|
|||||||
&typeck.borrowck_context.constraints.outlives_constraints,
|
&typeck.borrowck_context.constraints.outlives_constraints,
|
||||||
);
|
);
|
||||||
let live_locals = compute_live_locals(typeck.tcx(), &free_regions, &body);
|
let live_locals = compute_live_locals(typeck.tcx(), &free_regions, &body);
|
||||||
let facts_enabled = AllFacts::enabled(typeck.tcx());
|
let facts_enabled = use_polonius || AllFacts::enabled(typeck.tcx());
|
||||||
|
|
||||||
let polonius_drop_used = if facts_enabled {
|
let polonius_drop_used = if facts_enabled {
|
||||||
let mut drop_used = Vec::new();
|
let mut drop_used = Vec::new();
|
||||||
|
@ -136,6 +136,7 @@ pub(crate) fn type_check<'mir, 'tcx>(
|
|||||||
move_data: &MoveData<'tcx>,
|
move_data: &MoveData<'tcx>,
|
||||||
elements: &Rc<RegionValueElements>,
|
elements: &Rc<RegionValueElements>,
|
||||||
upvars: &[Upvar<'tcx>],
|
upvars: &[Upvar<'tcx>],
|
||||||
|
use_polonius: bool,
|
||||||
) -> MirTypeckResults<'tcx> {
|
) -> MirTypeckResults<'tcx> {
|
||||||
let implicit_region_bound = infcx.tcx.mk_region(ty::ReVar(universal_regions.fr_fn_body));
|
let implicit_region_bound = infcx.tcx.mk_region(ty::ReVar(universal_regions.fr_fn_body));
|
||||||
let mut universe_causes = FxHashMap::default();
|
let mut universe_causes = FxHashMap::default();
|
||||||
@ -187,7 +188,15 @@ pub(crate) fn type_check<'mir, 'tcx>(
|
|||||||
&mut borrowck_context,
|
&mut borrowck_context,
|
||||||
|mut cx| {
|
|mut cx| {
|
||||||
cx.equate_inputs_and_outputs(&body, universal_regions, &normalized_inputs_and_output);
|
cx.equate_inputs_and_outputs(&body, universal_regions, &normalized_inputs_and_output);
|
||||||
liveness::generate(&mut cx, body, elements, flow_inits, move_data, location_table);
|
liveness::generate(
|
||||||
|
&mut cx,
|
||||||
|
body,
|
||||||
|
elements,
|
||||||
|
flow_inits,
|
||||||
|
move_data,
|
||||||
|
location_table,
|
||||||
|
use_polonius,
|
||||||
|
);
|
||||||
|
|
||||||
translate_outlives_facts(&mut cx);
|
translate_outlives_facts(&mut cx);
|
||||||
let opaque_type_values = mem::take(&mut infcx.inner.borrow_mut().opaque_types);
|
let opaque_type_values = mem::take(&mut infcx.inner.borrow_mut().opaque_types);
|
||||||
|
Loading…
Reference in New Issue
Block a user