Skip to content

Commit

Permalink
Move backend-agnostic dump_mir_items into kani_middle (model-checking…
Browse files Browse the repository at this point in the history
  • Loading branch information
zhassan-aws authored Jun 5, 2023
1 parent faa4086 commit f990744
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 39 deletions.
39 changes: 2 additions & 37 deletions kani-compiler/src/codegen_cprover_gotoc/compiler_interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
use crate::codegen_cprover_gotoc::GotocCtx;
use crate::kani_middle::analysis;
use crate::kani_middle::attributes::is_test_harness_description;
use crate::kani_middle::check_crate_items;
use crate::kani_middle::check_reachable_items;
use crate::kani_middle::metadata::gen_test_metadata;
use crate::kani_middle::provide;
use crate::kani_middle::reachability::{
collect_reachable_items, filter_const_crate_items, filter_crate_items,
};
use crate::kani_middle::{check_crate_items, check_reachable_items, dump_mir_items};
use crate::kani_queries::{QueryDb, ReachabilityType};
use cbmc::goto_program::Location;
use cbmc::irep::goto_binary_serde::write_goto_binary_file;
Expand All @@ -37,14 +36,12 @@ use rustc_metadata::fs::{emit_wrapper_file, METADATA_FILENAME};
use rustc_metadata::EncodedMetadata;
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
use rustc_middle::mir::mono::MonoItem;
use rustc_middle::mir::write_mir_pretty;
use rustc_middle::ty::query::Providers;
use rustc_middle::ty::{self, InstanceDef, TyCtxt};
use rustc_middle::ty::{self, TyCtxt};
use rustc_session::config::{CrateType, OutputFilenames, OutputType};
use rustc_session::cstore::MetadataLoaderDyn;
use rustc_session::output::out_filename;
use rustc_session::Session;
use rustc_span::def_id::DefId;
use rustc_target::abi::Endian;
use rustc_target::spec::PanicStrategy;
use std::any::Any;
Expand All @@ -54,7 +51,6 @@ use std::ffi::OsString;
use std::fmt::Write;
use std::fs::File;
use std::io::BufWriter;
use std::io::Write as IoWrite;
use std::iter::FromIterator;
use std::path::{Path, PathBuf};
use std::process::Command;
Expand Down Expand Up @@ -493,37 +489,6 @@ fn symbol_table_to_gotoc(tcx: &TyCtxt, base_path: &Path) -> PathBuf {
output_filename
}

/// Print MIR for the reachable items if the `--emit mir` option was provided to rustc.
fn dump_mir_items(tcx: TyCtxt, items: &[MonoItem]) {
/// Convert MonoItem into a DefId.
/// Skip stuff that we cannot generate the MIR items.
fn visible_item<'tcx>(item: &MonoItem<'tcx>) -> Option<(MonoItem<'tcx>, DefId)> {
match item {
// Exclude FnShims and others that cannot be dumped.
MonoItem::Fn(instance) if matches!(instance.def, InstanceDef::Item(..)) => {
Some((*item, instance.def_id()))
}
MonoItem::Fn(..) => None,
MonoItem::Static(def_id) => Some((*item, *def_id)),
MonoItem::GlobalAsm(_) => None,
}
}

if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) {
// Create output buffer.
let outputs = tcx.output_filenames(());
let path = outputs.output_path(OutputType::Mir).with_extension("kani.mir");
let out_file = File::create(&path).unwrap();
let mut writer = BufWriter::new(out_file);

// For each def_id, dump their MIR
for (item, def_id) in items.iter().filter_map(visible_item) {
writeln!(writer, "// Item: {item:?}").unwrap();
write_mir_pretty(tcx, Some(def_id), &mut writer).unwrap();
}
}
}

pub fn write_file<T>(base_path: &Path, file_type: ArtifactType, source: &T, pretty: bool)
where
T: serde::Serialize,
Expand Down
40 changes: 38 additions & 2 deletions kani-compiler/src/kani_middle/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,23 @@
use std::collections::HashSet;

use crate::kani_queries::QueryDb;
use rustc_hir::{def::DefKind, def_id::LOCAL_CRATE};
use rustc_hir::{def::DefKind, def_id::DefId, def_id::LOCAL_CRATE};
use rustc_middle::mir::mono::MonoItem;
use rustc_middle::mir::write_mir_pretty;
use rustc_middle::span_bug;
use rustc_middle::ty::layout::{
FnAbiError, FnAbiOf, FnAbiOfHelpers, FnAbiRequest, HasParamEnv, HasTyCtxt, LayoutError,
LayoutOfHelpers, TyAndLayout,
};
use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
use rustc_middle::ty::{self, Instance, InstanceDef, Ty, TyCtxt};
use rustc_session::config::OutputType;
use rustc_span::source_map::respan;
use rustc_span::Span;
use rustc_target::abi::call::FnAbi;
use rustc_target::abi::{HasDataLayout, TargetDataLayout};
use std::fs::File;
use std::io::BufWriter;
use std::io::Write;

use self::attributes::{check_attributes, check_unstable_features};

Expand Down Expand Up @@ -73,6 +78,37 @@ pub fn check_reachable_items(tcx: TyCtxt, queries: &QueryDb, items: &[MonoItem])
tcx.sess.abort_if_errors();
}

/// Print MIR for the reachable items if the `--emit mir` option was provided to rustc.
pub fn dump_mir_items(tcx: TyCtxt, items: &[MonoItem]) {
/// Convert MonoItem into a DefId.
/// Skip stuff that we cannot generate the MIR items.
fn visible_item<'tcx>(item: &MonoItem<'tcx>) -> Option<(MonoItem<'tcx>, DefId)> {
match item {
// Exclude FnShims and others that cannot be dumped.
MonoItem::Fn(instance) if matches!(instance.def, InstanceDef::Item(..)) => {
Some((*item, instance.def_id()))
}
MonoItem::Fn(..) => None,
MonoItem::Static(def_id) => Some((*item, *def_id)),
MonoItem::GlobalAsm(_) => None,
}
}

if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) {
// Create output buffer.
let outputs = tcx.output_filenames(());
let path = outputs.output_path(OutputType::Mir).with_extension("kani.mir");
let out_file = File::create(&path).unwrap();
let mut writer = BufWriter::new(out_file);

// For each def_id, dump their MIR
for (item, def_id) in items.iter().filter_map(visible_item) {
writeln!(writer, "// Item: {item:?}").unwrap();
write_mir_pretty(tcx, Some(def_id), &mut writer).unwrap();
}
}
}

/// Structure that represents the source location of a definition.
/// TODO: Use `InternedString` once we move it out of the cprover_bindings.
/// <https://github.com/model-checking/kani/issues/2435>
Expand Down

0 comments on commit f990744

Please sign in to comment.