1#ifndef ROSE_BinaryAnalysis_ModelChecker_SemanticCallbacks_H 
    2#define ROSE_BinaryAnalysis_ModelChecker_SemanticCallbacks_H 
    3#include <featureTests.h> 
    4#ifdef ROSE_ENABLE_MODEL_CHECKER 
    6#include <Rose/BinaryAnalysis/ModelChecker/BasicTypes.h> 
    8#include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/BasicTypes.h> 
    9#include <Rose/BinaryAnalysis/SmtSolver.h> 
   12#ifdef ROSE_HAVE_YAMLCPP 
   13#include <yaml-cpp/yaml.h> 
   17namespace BinaryAnalysis {
 
   18namespace ModelChecker {
 
   25class SemanticCallbacks {
 
   28    using Ptr = SemanticCallbacksPtr;
 
   31    const SettingsPtr mcSettings_;                      
 
   34    SemanticCallbacks() = 
delete;
 
   35    explicit SemanticCallbacks(
const SettingsPtr&);
 
   37    virtual ~SemanticCallbacks();
 
   50    virtual void reset() {}
 
   57    SettingsPtr mcSettings() 
const;
 
   68    virtual InstructionSemantics::BaseSemantics::SValuePtr protoval();
 
   76    virtual InstructionSemantics::BaseSemantics::RegisterStatePtr createInitialRegisters() = 0;
 
   84    virtual InstructionSemantics::BaseSemantics::MemoryStatePtr createInitialMemory() = 0;
 
   93    virtual InstructionSemantics::BaseSemantics::StatePtr createInitialState();
 
  112    virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr createRiscOperators() = 0;
 
  123    virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr
 
  124    configureRiscOperators(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
 
  150    virtual void attachModelCheckerSolver(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&,
 
  151                                          const SmtSolverPtr&) {}
 
  161    virtual void initializeState(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
 
  169    virtual InstructionSemantics::BaseSemantics::DispatcherPtr
 
  170    createDispatcher(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
 
  182    virtual InstructionSemantics::BaseSemantics::SValuePtr
 
  183    instructionPointer(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
 
  188    struct CodeAddresses {
 
  189        InstructionSemantics::BaseSemantics::SValuePtr ip; 
 
  190        std::set<Address> addresses;                       
 
  191        bool isComplete = 
true;                            
 
  200    virtual CodeAddresses nextCodeAddresses(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
 
  224    virtual std::pair<bool, const char*> skipExecution(
const PathPtr&);
 
  236    virtual std::vector<TagPtr> preExecute(
const PathNodePtr&, 
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
 
  248    virtual std::vector<TagPtr> postExecute(
const PathNodePtr&, 
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
 
  252        ExecutionUnitPtr unit;                          
 
  253        SymbolicExpression::Ptr assertion;              
 
  254        SmtSolver::Evidence evidence;                   
 
  272    virtual std::vector<NextUnit>
 
  273    nextUnits(
const PathPtr&, 
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&, 
const SmtSolverPtr&) = 0;
 
  289#ifdef ROSE_HAVE_YAMLCPP 
  290    virtual std::list<ExecutionUnitPtr>
 
  291    parsePath(
const YAML::Node&, 
const std::string &sourceName) = 0;
 
  293    virtual std::list<ExecutionUnitPtr>
 
  294    parsePath(
const Yaml::Node&, 
const std::string &sourceName) = 0;
 
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
 
std::shared_ptr< SmtSolver > SmtSolverPtr
Reference counting pointer.