Skip to content

Commit

Permalink
Ugly commit 30.20
Browse files Browse the repository at this point in the history
  • Loading branch information
vakaras committed Feb 19, 2024
1 parent 4e8c5b6 commit 26bc973
Show file tree
Hide file tree
Showing 4 changed files with 184 additions and 29 deletions.
4 changes: 2 additions & 2 deletions prusti-viper/src/encoder/middle/core_proof/svirpti/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ impl Verifier {
);
for procedure in program.procedures {
let mut procedure_executor =
ProcedureExecutor::new(self, source_filename, &mut program_context, &procedure)?;
ProcedureExecutor::new(self, source_filename, &mut program_context)?;
procedure_executor.load_domains(&program.domains)?;
procedure_executor.execute_procedure()?;
procedure_executor.execute_procedure(&procedure)?;
}
unimplemented!();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ use vir_crate::{
};

mod stack;
mod statements;

pub(super) struct ProcedureExecutor<'a, 'c, EC: EncoderContext> {
verifier: &'a mut Verifier,
source_filename: &'a str,
program_context: &'a mut ProgramContext<'c, EC>,
procedure: &'a vir_low::ProcedureDecl,
stack: Vec<StackFrame>,
smt_solver: SmtSolver,
}
Expand All @@ -50,72 +50,70 @@ impl<'a, 'c, EC: EncoderContext> ProcedureExecutor<'a, 'c, EC> {
verifier: &'a mut Verifier,
source_filename: &'a str,
program_context: &'a mut ProgramContext<'c, EC>,
procedure: &'a vir_low::ProcedureDecl,
) -> SpannedEncodingResult<Self> {
let smt_solver = SmtSolver::default().unwrap();
Ok(Self {
verifier,
source_filename,
program_context,
procedure,
stack: Vec::new(),
smt_solver,
})
}

pub(super) fn execute_procedure(mut self) -> SpannedEncodingResult<VerificationResult> {
info!("Executing procedure: {}", self.procedure.name);
pub(super) fn execute_procedure(
mut self,
procedure: &'a vir_low::ProcedureDecl,
) -> SpannedEncodingResult<VerificationResult> {
info!("Executing procedure: {}", procedure.name);
self.smt_solver.push().unwrap(); // FIXME: Handle errors
self.smt_solver
.comment(&format!("Executing procedure: {}", self.procedure.name))
.comment(&format!("Executing procedure: {}", procedure.name))
.unwrap(); // FIXME: Handle errors
self.stack_push(None, self.procedure.entry.clone())?;
self.stack_push(None, procedure.entry.clone())?;
while !self.stack.is_empty() {
self.mark_current_frame_as_being_executed()?;
self.log_current_stack_status()?;
self.execute_block()?;
let block = procedure
.basic_blocks
.get(&self.current_frame().label())
.unwrap();
self.execute_block(block)?;
// Executing the terminator changes the stack, so we need to mark
// the frame as executed now.
self.mark_current_frame_as_executed()?;
self.execute_terminator()?;
self.execute_terminator(block)?;
self.pop_executed_frames()?;
}
info!("Finished executing procedure: {}", self.procedure.name);
info!("Finished executing procedure: {}", procedure.name);
self.smt_solver
.comment(&format!(
"Finished executing procedure: {}",
self.procedure.name
))
.comment(&format!("Finished executing procedure: {}", procedure.name))
.unwrap(); // FIXME: Handle errors
self.smt_solver.pop().unwrap(); // FIXME: Handle errors
unimplemented!();
}

fn current_block(&self) -> &vir_low::BasicBlock {
self.procedure
.basic_blocks
.get(&self.current_frame().label())
.unwrap()
}

fn execute_block(&mut self) -> SpannedEncodingResult<()> {
fn execute_block(&mut self, block: &vir_low::BasicBlock) -> SpannedEncodingResult<()> {
info!("Executing block: {}", self.current_frame().label());
let frame = self.current_frame_mut();
for statement in &block.statements {
self.execute_statement(statement)?;
}
Ok(())
}

fn execute_terminator(&mut self) -> SpannedEncodingResult<()> {
fn execute_terminator(&mut self, block: &vir_low::BasicBlock) -> SpannedEncodingResult<()> {
let current_label = self.current_frame().label().clone();
match self.current_block().successor.clone() {
match &block.successor {
vir_low::Successor::Return => {
info!("Executing return terminator");
self.stack_pop()?;
}
vir_low::Successor::Goto(ref label) => {
vir_low::Successor::Goto(label) => {
info!("Executing goto terminator");
self.stack_push(Some(current_label), label.clone())?;
}
vir_low::Successor::GotoSwitch(ref cases) => {
vir_low::Successor::GotoSwitch(cases) => {
info!("Executing switch terminator");
for (_, label) in cases.iter().rev() {
self.stack_push(Some(current_label.clone()), label.clone())?;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
use super::{
super::{
super::transformations::{
encoder_context::EncoderContext, symbolic_execution_new::ProgramContext,
},
smt::{SmtSolver, Sort2SmtWrap},
VerificationResult, Verifier,
},
ProcedureExecutor,
};
use crate::encoder::errors::SpannedEncodingResult;
use vir_crate::{
common::expression::BinaryOperationHelpers,
low::{self as vir_low},
};

impl<'a, 'c, EC: EncoderContext> ProcedureExecutor<'a, 'c, EC> {
pub(super) fn execute_statement(
&mut self,
statement: &vir_low::Statement,
) -> SpannedEncodingResult<()> {
match statement {
vir_low::Statement::Label(statement) => {
self.execute_statement_label(statement)?;
}
vir_low::Statement::Assign(statement) => {
self.execute_statement_assign(statement)?;
}
vir_low::Statement::Assume(statement) => {
self.execute_statement_assume(statement)?;
}
vir_low::Statement::Assert(statement) => {
self.execute_statement_assert(statement)?;
}
vir_low::Statement::Inhale(statement) => {
self.execute_statement_inhale(statement)?;
}
vir_low::Statement::Exhale(statement) => {
self.execute_statement_exhale(statement)?;
}
vir_low::Statement::Comment(statement) => {
self.smt_solver.comment(&statement.to_string()).unwrap(); // TODO: handle error
}
vir_low::Statement::LogEvent(statement) => {
self.smt_solver.comment(&statement.to_string()).unwrap(); // TODO: handle error
}
vir_low::Statement::Fold(_)
| vir_low::Statement::Unfold(_)
| vir_low::Statement::ApplyMagicWand(_)
| vir_low::Statement::MethodCall(_)
| vir_low::Statement::Conditional(_) => {
unreachable!();
}
vir_low::Statement::MaterializePredicate(statement) => {
self.execute_materialize_predicate(statement)?;
}
vir_low::Statement::CaseSplit(statement) => {
self.execute_case_split(statement)?;
}
}
Ok(())
}

fn execute_statement_label(
&mut self,
statement: &vir_low::ast::statement::Label,
) -> SpannedEncodingResult<()> {
unimplemented!();
// self.save_state(statement.label.clone())?;
// self.add_statement(vir_low::Statement::Label(statement.clone()))?;
Ok(())
}

fn execute_statement_assign(
&mut self,
statement: &vir_low::ast::statement::Assign,
) -> SpannedEncodingResult<()> {
assert!(statement.value.is_constant());
unimplemented!();
// let target_variable = self.create_new_bool_variable_version(&statement.target.name)?;
// let expression =
// vir_low::Expression::equals(target_variable.into(), statement.value.clone());
// self.try_assume_heap_independent_conjuncts(&expression)?;
// self.add_assume(expression, statement.position)?;
Ok(())
}

fn execute_statement_assume(
&mut self,
statement: &vir_low::ast::statement::Assume,
) -> SpannedEncodingResult<()> {
unimplemented!();
// let expression = self.simplify_expression(&statement.expression, statement.position)?;
// self.try_assume_heap_independent_conjuncts(&expression)?;
// self.add_statement(vir_low::Statement::assume(expression, statement.position))?;
Ok(())
}

fn execute_statement_assert(
&mut self,
statement: &vir_low::ast::statement::Assert,
) -> SpannedEncodingResult<()> {
unimplemented!();
// let expression = self.simplify_expression(&statement.expression, statement.position)?;
// self.try_assume_heap_independent_conjuncts(&expression)?;
// self.add_statement(vir_low::Statement::assert(expression, statement.position))?;
Ok(())
}

fn execute_statement_inhale(
&mut self,
statement: &vir_low::ast::statement::Inhale,
) -> SpannedEncodingResult<()> {
unimplemented!();
// self.execute_inhale(&statement.expression, statement.position)?;
// self.current_builder_mut().set_materialization_point()?;
Ok(())
}

fn execute_statement_exhale(
&mut self,
statement: &vir_low::ast::statement::Exhale,
) -> SpannedEncodingResult<()> {
unimplemented!();
// let exhale_label = format!("exhale_label${}", self.exhale_label_generator_counter);
// self.exhale_label_generator_counter += 1;
// self.register_label(vir_low::Label::new(exhale_label.clone()))?;
// let label = vir_low::ast::statement::Label::new(exhale_label.clone());
// self.execute_statement_label(&label)?;
// self.execute_exhale(&statement.expression, statement.position, &exhale_label)?;
Ok(())
}

fn execute_materialize_predicate(
&mut self,
statement: &vir_low::ast::statement::MaterializePredicate,
) -> SpannedEncodingResult<()> {
unimplemented!();
// let vir_low::Expression::PredicateAccessPredicate(predicate) = self.simplify_expression(&statement.predicate, statement.position)? else {
// unreachable!();
// };
// self.materialize_predicate(predicate, statement.check_that_exists, statement.position)?;
Ok(())
}

fn execute_case_split(
&mut self,
statement: &vir_low::ast::statement::CaseSplit,
) -> SpannedEncodingResult<()> {
unimplemented!();
// let expression = self.simplify_expression(&statement.expression, statement.position)?;
// self.add_statement(vir_low::Statement::case_split(
// expression,
// statement.position,
// ))?;
Ok(())
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use super::{super::super::encoder_context::EncoderContext, ProcedureExecutor};
use crate::encoder::errors::SpannedEncodingResult;

use vir_crate::{
common::expression::BinaryOperationHelpers,
low::{self as vir_low},
Expand Down

0 comments on commit 26bc973

Please sign in to comment.