diff --git a/crates/aquascope/src/analysis/ir_mapper/body_graph.rs b/crates/aquascope/src/analysis/ir_mapper/body_graph.rs index bd1c0ae36..1465c5796 100644 --- a/crates/aquascope/src/analysis/ir_mapper/body_graph.rs +++ b/crates/aquascope/src/analysis/ir_mapper/body_graph.rs @@ -76,7 +76,7 @@ impl<'tcx> CleanedBody<'tcx> { } fn keep_block(bb: &BasicBlockData) -> bool { - !bb.is_cleanup && !bb.is_empty_unreachable() + !bb.is_cleanup && !bb.is_unreachable() } fn is_imaginary_target( @@ -133,6 +133,16 @@ impl<'tcx> Predecessors for CleanedBody<'tcx> { } } +trait BasicBlockDataExt { + fn is_unreachable(&self) -> bool; +} + +impl BasicBlockDataExt for BasicBlockData<'_> { + fn is_unreachable(&self) -> bool { + matches!(self.terminator().kind, TerminatorKind::Unreachable) + } +} + #[cfg(test)] mod test { use rustc_utils::BodyExt; diff --git a/crates/aquascope/src/analysis/permissions/utils.rs b/crates/aquascope/src/analysis/permissions/utils.rs index 32492249a..bf142829c 100644 --- a/crates/aquascope/src/analysis/permissions/utils.rs +++ b/crates/aquascope/src/analysis/permissions/utils.rs @@ -2,15 +2,10 @@ use std::collections::hash_map::Entry; -use rustc_data_structures::fx::FxHashMap as HashMap; -use rustc_middle::mir::{ - pretty::PrettyPrintMirOptions, Location, TerminatorEdges, -}; -use rustc_mir_dataflow::{fmt::DebugWithContext, Analysis, JoinSemiLattice}; +use rustc_middle::mir::pretty::PrettyPrintMirOptions; +use rustc_mir_dataflow::{fmt::DebugWithContext, JoinSemiLattice}; -use super::{ - context::PermissionsCtxt, Permissions, PermissionsData, PermissionsDomain, -}; +use super::{context::PermissionsCtxt, Permissions, PermissionsDomain}; pub(crate) fn dump_mir_debug(ctxt: &PermissionsCtxt) { let tcx = ctxt.tcx; @@ -180,91 +175,3 @@ impl DebugWithContext for PermissionsDomain<'_> { Ok(()) } } - -// -------------------------------------------------- -// Analysis - -pub(crate) struct PAnalysis<'a, 'tcx> { - ctxt: &'a PermissionsCtxt<'tcx>, -} - -impl<'a, 'tcx> PAnalysis<'a, 'tcx> { - fn check_location( - &self, - state: &mut PermissionsDomain<'tcx>, - location: Location, - ) { - let point = self.ctxt.location_to_point(location); - let dmn = self.ctxt.permissions_domain_at_point(point); - for (place, perms) in state.iter_mut() { - let new_perms = dmn.get(place).unwrap(); - *perms = *new_perms; - } - } -} - -impl<'tcx> Analysis<'tcx> for PAnalysis<'_, 'tcx> { - type Domain = PermissionsDomain<'tcx>; - const NAME: &'static str = "PermissionsAnalysisDatalog"; - - fn bottom_value( - &self, - _body: &rustc_middle::mir::Body<'tcx>, - ) -> Self::Domain { - self - .ctxt - .domain_places() - .into_iter() - .map(|place| { - // NOTE: I'm currently just ignoring the permissions data - // for this utility just so we can see the permissions changes. - (place, PermissionsData { - is_live: false, - type_droppable: false, - type_writeable: false, - type_copyable: false, - path_moved: None, - path_uninitialized: false, - loan_read_refined: None, - loan_write_refined: None, - loan_drop_refined: None, - }) - }) - .collect::>() - .into() - } - - fn initialize_start_block( - &self, - _body: &rustc_middle::mir::Body<'tcx>, - _state: &mut Self::Domain, - ) { - } - - fn apply_primary_statement_effect( - &mut self, - state: &mut Self::Domain, - _statement: &rustc_middle::mir::Statement<'tcx>, - location: rustc_middle::mir::Location, - ) { - self.check_location(state, location); - } - - fn apply_primary_terminator_effect<'mir>( - &mut self, - state: &mut Self::Domain, - terminator: &'mir rustc_middle::mir::Terminator<'tcx>, - location: rustc_middle::mir::Location, - ) -> TerminatorEdges<'mir, 'tcx> { - self.check_location(state, location); - terminator.edges() - } - - fn apply_call_return_effect( - &mut self, - _state: &mut Self::Domain, - _block: rustc_middle::mir::BasicBlock, - _return_places: rustc_middle::mir::CallReturnPlaces<'_, 'tcx>, - ) { - } -} diff --git a/crates/aquascope/src/analysis/stepper/mod.rs b/crates/aquascope/src/analysis/stepper/mod.rs index ae540db81..f29a5501d 100644 --- a/crates/aquascope/src/analysis/stepper/mod.rs +++ b/crates/aquascope/src/analysis/stepper/mod.rs @@ -319,6 +319,7 @@ impl MirSegment { pub fn span(&self, ctxt: &PermissionsCtxt) -> Span { let lo = ctxt.location_to_span(self.from); let hi = ctxt.location_to_span(self.to); + log::debug!("Span for segment {self:?}: {:?} -> {:?}", lo, hi); lo.with_hi(hi.hi()) } diff --git a/crates/aquascope/src/analysis/stepper/table_builder.rs b/crates/aquascope/src/analysis/stepper/table_builder.rs index 00a885501..b88b4c781 100644 --- a/crates/aquascope/src/analysis/stepper/table_builder.rs +++ b/crates/aquascope/src/analysis/stepper/table_builder.rs @@ -145,7 +145,6 @@ impl<'a, 'tcx: 'a> TableBuilder<'a, 'tcx> { let BranchData { reach, splits, - // joins, nested, .. } = self.mir.get_branch(bid); @@ -160,8 +159,6 @@ impl<'a, 'tcx: 'a> TableBuilder<'a, 'tcx> { ); let mut temp_middle = Tables::default(); - // let mut temp_joins = Tables::default(); - for &sid in splits.iter() { self.insert_segment(&mut temp_middle, sid); } @@ -170,10 +167,6 @@ impl<'a, 'tcx: 'a> TableBuilder<'a, 'tcx> { self.insert_collection(&mut temp_middle, cid); } - // for &sid in joins.iter() { - // self.insert_segment(&mut temp_joins, sid); - // } - // Find the locals which were filtered from all scopes. In theory, // `all_scopes` should contains the same scope, copied over, // but the SegmentedMir doesn't enforce this and there's no diff --git a/crates/aquascope/src/errors/mod.rs b/crates/aquascope/src/errors/mod.rs index 0656e7cf8..22c473701 100644 --- a/crates/aquascope/src/errors/mod.rs +++ b/crates/aquascope/src/errors/mod.rs @@ -1,4 +1,4 @@ -pub(crate) mod silent_emitter; +pub mod silent; use std::cell::RefCell; diff --git a/crates/aquascope/src/errors/silent.rs b/crates/aquascope/src/errors/silent.rs new file mode 100644 index 000000000..0467b91dc --- /dev/null +++ b/crates/aquascope/src/errors/silent.rs @@ -0,0 +1,11 @@ +use rustc_driver::DEFAULT_LOCALE_RESOURCES; +use rustc_errors::fallback_fluent_bundle; +use rustc_session::parse::ParseSess; + +pub fn silent_session() -> Box { + Box::new(|sess| { + let fallback_bundle = + fallback_fluent_bundle(DEFAULT_LOCALE_RESOURCES.to_vec(), false); + sess.dcx().make_silent(fallback_bundle, None, false); + }) +} diff --git a/crates/aquascope/src/errors/silent_emitter.rs b/crates/aquascope/src/errors/silent_emitter.rs deleted file mode 100644 index 0d8ec311d..000000000 --- a/crates/aquascope/src/errors/silent_emitter.rs +++ /dev/null @@ -1,46 +0,0 @@ -//! Silent diagnostics emitter. -//! -//! See: -//! https://doc.rust-lang.org/nightly/nightly-rustc/rustfmt_nightly/parse/session/struct.SilentEmitter.html#impl-Translate-for-SilentEmitter - -use rustc_driver::DEFAULT_LOCALE_RESOURCES; -use rustc_errors::{ - emitter::Emitter, translation::Translate, DiagInner, FluentBundle, - LazyFallbackBundle, -}; -use rustc_span::source_map::SourceMap; - -/// Emitter which discards every error. -pub(crate) struct SilentEmitter(LazyFallbackBundle); - -impl SilentEmitter { - pub fn new() -> Self { - Self(rustc_errors::fallback_fluent_bundle( - DEFAULT_LOCALE_RESOURCES.to_vec(), - false, - )) - } -} - -impl Translate for SilentEmitter { - fn fluent_bundle(&self) -> Option<&FluentBundle> { - None - } - - fn fallback_fluent_bundle(&self) -> &FluentBundle { - &self.0 - } -} - -impl Emitter for SilentEmitter { - fn source_map(&self) -> Option<&SourceMap> { - None - } - - fn emit_diagnostic( - &mut self, - _db: DiagInner, - _registry: &rustc_errors::registry::Registry, - ) { - } -} diff --git a/crates/aquascope/src/test_utils.rs b/crates/aquascope/src/test_utils.rs index f25f5a3b0..2af64fc14 100644 --- a/crates/aquascope/src/test_utils.rs +++ b/crates/aquascope/src/test_utils.rs @@ -7,7 +7,6 @@ use anyhow::{bail, Context, Result}; use fluid_let::fluid_set; use itertools::Itertools; use rustc_borrowck::consumers::BodyWithBorrowckFacts; -use rustc_errors::DiagCtxt; use rustc_hir::BodyId; use rustc_middle::{ mir::{Rvalue, StatementKind}, @@ -35,7 +34,7 @@ use crate::{ }, AquascopeAnalysis, }, - errors::{self, silent_emitter::SilentEmitter}, + errors::{self, silent::silent_session}, interpreter::{self, MTrace}, }; @@ -525,14 +524,7 @@ where Cb: FnOnce(TyCtxt<'_>), { fn config(&mut self, config: &mut rustc_interface::Config) { - config.psess_created = Some(Box::new(|sess| { - // Create a new emitter writer which consumes *silently* all - // errors. There most certainly is a *better* way to do this, - // if you, the reader, know what that is, please open an issue :) - let dcx = DiagCtxt::new(Box::new(SilentEmitter::new())); - sess.set_dcx(dcx); - })); - + config.psess_created = Some(silent_session()); config.override_queries = Some(if self.is_interpreter { crate::interpreter::override_queries } else { diff --git a/crates/aquascope_front/src/plugin.rs b/crates/aquascope_front/src/plugin.rs index df0aecddd..6830b5678 100644 --- a/crates/aquascope_front/src/plugin.rs +++ b/crates/aquascope_front/src/plugin.rs @@ -12,7 +12,9 @@ use aquascope::{ stepper::{PermIncludeMode, INCLUDE_MODE}, AquascopeError, AquascopeResult, }, - errors::{initialize_error_tracking, track_body_diagnostics}, + errors::{ + initialize_error_tracking, silent::silent_session, track_body_diagnostics, + }, }; use clap::{Parser, Subcommand}; use fluid_let::fluid_set; @@ -218,6 +220,7 @@ struct AquascopeCallbacks { impl rustc_driver::Callbacks for AquascopeCallbacks { fn config(&mut self, config: &mut rustc_interface::Config) { + config.psess_created = Some(silent_session()); config.override_queries = Some(borrowck_facts::override_queries); }