1#ifndef ROSE_BinaryAnalysis_InstructionSemantics_BaseSemantics_RiscOperators_H 
    2#define ROSE_BinaryAnalysis_InstructionSemantics_BaseSemantics_RiscOperators_H 
    3#include <featureTests.h> 
    4#ifdef ROSE_ENABLE_BINARY_ANALYSIS 
    6#include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/BasicTypes.h> 
    7#include <Rose/BinaryAnalysis/InstructionSemantics/Utility.h> 
    8#include <Rose/BinaryAnalysis/HotPatch.h> 
    9#include <Rose/BinaryAnalysis/SmtSolver.h> 
   10#include <Combinatorics.h> 
   12#include <boost/enable_shared_from_this.hpp> 
   14#ifdef ROSE_ENABLE_BOOST_SERIALIZATION 
   15#include <boost/serialization/access.hpp> 
   16#include <boost/serialization/export.hpp> 
   17#include <boost/serialization/nvp.hpp> 
   18#include <boost/serialization/shared_ptr.hpp> 
   19#include <boost/serialization/version.hpp> 
   23namespace BinaryAnalysis {
 
   24namespace InstructionSemantics {
 
   52class RiscOperators: 
public boost::enable_shared_from_this<RiscOperators> {
 
   66    bool isNoopRead_ = 
false;                           
 
   70#ifdef ROSE_ENABLE_BOOST_SERIALIZATION 
   72    friend class boost::serialization::access;
 
   75    void serialize(S &s, 
const unsigned version) {
 
   76        s & BOOST_SERIALIZATION_NVP(protoval_);
 
   77        s & BOOST_SERIALIZATION_NVP(currentState_);
 
   78        s & BOOST_SERIALIZATION_NVP(initialState_);
 
   79        s & BOOST_SERIALIZATION_NVP(solver_);
 
   80        s & BOOST_SERIALIZATION_NVP(currentInsn_);
 
   81        s & BOOST_SERIALIZATION_NVP(nInsns_);
 
   82        s & BOOST_SERIALIZATION_NVP(name_);
 
   84            s & BOOST_SERIALIZATION_NVP(hotPatch_);
 
   86            s & BOOST_SERIALIZATION_NVP(isNoopRead_);
 
  220    virtual const std::string& 
name()
 const { 
return name_; }
 
  221    virtual void name(
const std::string &s) { name_ = s; }
 
  231    void print(std::ostream &stream, 
const std::string prefix=
"") 
const;
 
  241        void print(std::ostream &stream)
 const { obj->print(stream, fmt); }
 
 
  269    virtual size_t nInsns()
 const { 
return nInsns_; }
 
  270    virtual void nInsns(
size_t n) { nInsns_ = n; }
 
  409        return concat(lowBits, highBits);
 
 
  412        return concat(lowBits, highBits);
 
 
  645    virtual void interrupt(
int majorNumber, 
int minorNumber);
 
 
  876std::ostream& operator<<(std::ostream&, 
const RiscOperators&);
 
  884#ifdef ROSE_ENABLE_BOOST_SERIALIZATION 
Describes how to modify machine state after each instruction.
 
Base class for most instruction semantics RISC operators.
 
virtual SValuePtr extract(const SValuePtr &a, size_t begin_bit, size_t end_bit)=0
Extracts bits from a value.
 
virtual SValuePtr readRegister(RegisterDescriptor reg, const SValuePtr &dflt)
Reads a value from a register.
 
virtual SValuePtr subtract(const SValuePtr &minuend, const SValuePtr &subtrahend)
Subtract one value from another.
 
virtual SValuePtr isUnsignedLessThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
 
virtual SValuePtr unsignedModulo(const SValuePtr &a, const SValuePtr &b)=0
Calculates modulo with unsigned values.
 
virtual SValuePtr shiftLeft(const SValuePtr &a, const SValuePtr &nbits)=0
Returns arg shifted left.
 
virtual void comment(const std::string &)
Inject a line comment into debugging streams.
 
virtual SValuePtr negate(const SValuePtr &a)=0
Two's complement.
 
WithFormatter operator+(const std::string &linePrefix)
Used for printing RISC operators with formatting.
 
virtual void cpuid()
Invoked for the x86 CPUID instruction.
 
virtual SValuePtr countLeadingZeros(const SValuePtr &a)
Count leading zero bits.
 
virtual RiscOperatorsPtr create(const StatePtr &state, const SmtSolverPtr &solver=SmtSolverPtr()) const =0
Virtual allocating constructor.
 
virtual SValuePtr reinterpret(const SValuePtr &a, SgAsmType *retType)
Reinterpret an expression as a different type.
 
virtual void writeMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &data, const SValuePtr &cond)=0
Writes a value to memory.
 
virtual SValuePtr signedDivide(const SValuePtr ÷nd, const SValuePtr &divisor)=0
Divides two signed values.
 
virtual SValuePtr bottom_(size_t nbits)
Returns a data-flow bottom value.
 
virtual SValuePtr subtractCarry(const SValuePtr &minuend, const SValuePtr &subtrahend, SValuePtr &carryOut, SValuePtr &overflowed)
Subtract one value from another and carry.
 
virtual SValuePtr shiftRightArithmetic(const SValuePtr &a, const SValuePtr &nbits)=0
Returns arg shifted right arithmetically (with sign bit).
 
virtual SValuePtr fpToInteger(const SValuePtr &fpValue, SgAsmFloatType *fpType, const SValuePtr &dflt)
Construct an integer value from a floating-point value.
 
virtual SValuePtr isUnsignedLessThan(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
 
virtual StatePtr initialState() const
Property: Optional lazily updated initial state.
 
virtual SValuePtr boolean_(bool value)
Returns a Boolean value.
 
virtual SValuePtr invert(const SValuePtr &a)=0
One's complement.
 
virtual SValuePtr fpIsDenormalized(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is denormalized.
 
virtual SValuePtr fpIsInfinity(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is infinity.
 
WithFormatter with_format(Formatter &fmt)
Used for printing RISC operators with formatting.
 
virtual size_t nInsns() const
Property: Number of instructions processed.
 
void hotPatch(const HotPatch &hp)
Property: Post-instruction hot patches.
 
virtual SValuePtr fpDivide(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Divide one floating-point value by another.
 
virtual SValuePtr fpRoundTowardZero(const SValuePtr &a, SgAsmFloatType *fpType)
Round toward zero.
 
virtual SValuePtr add(const SValuePtr &a, const SValuePtr &b)=0
Adds two integers of equal size.
 
virtual SValuePtr fpIsNan(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is a special not-a-number bit pattern.
 
virtual SValuePtr fpSign(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Sign of floating-point value.
 
virtual SValuePtr isSignedLessThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
 
virtual void interrupt(int majorNumber, int minorNumber)
Unconditionally raise an interrupt.
 
virtual SValuePtr and_(const SValuePtr &a, const SValuePtr &b)=0
Computes bit-wise AND of two values.
 
virtual SValuePtr fpConvert(const SValuePtr &a, SgAsmFloatType *aType, SgAsmFloatType *retType)
Convert from one floating-point type to another.
 
virtual SValuePtr addWithCarries(const SValuePtr &a, const SValuePtr &b, const SValuePtr &c, SValuePtr &carry_out)=0
Add two values of equal size and a carry bit.
 
void print(std::ostream &stream, const std::string prefix="") const
Print multi-line output for this object.
 
virtual SValuePtr unsignedExtend(const SValuePtr &a, size_t new_width)
Extend (or shrink) operand a so it is nbits wide by adding or removing high-order bits.
 
virtual SValuePtr number_(size_t nbits, uint64_t value)
Returns a number of the specified bit width.
 
virtual SValuePtr unspecified_(size_t nbits)
Returns a new undefined value.
 
virtual SValuePtr undefined_(size_t nbits)
Returns a new undefined value.
 
virtual SValuePtr signExtend(const SValuePtr &a, size_t new_width)=0
Sign extends a value.
 
virtual SValuePtr isSignedLessThan(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
 
virtual SValuePtr concat(const SValuePtr &lowBits, const SValuePtr &highBits)=0
Concatenates the bits of two values.
 
virtual SValuePtr iteWithStatus(const SValuePtr &cond, const SValuePtr &a, const SValuePtr &b, IteStatus &status)=0
If-then-else with status.
 
virtual SValuePtr reverseElmts(const SValuePtr &a, size_t elmtNBits)
Reverse parts of a value.
 
virtual SValuePtr leastSignificantSetBit(const SValuePtr &a)=0
Returns position of least significant set bit; zero when no bits are set.
 
virtual void finishInstruction(SgAsmInstruction *insn)
Called at the end of every instruction.
 
virtual SValuePtr isSignedGreaterThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
 
virtual void isNoopRead(bool b)
Property: No-op read.
 
virtual SValuePtr filterCallTarget(const SValuePtr &a)
Invoked to filter call targets.
 
virtual SmtSolverPtr solver() const
Property: Satisfiability module theory (SMT) solver.
 
virtual void currentInstruction(SgAsmInstruction *insn)
Property: Current instruction.
 
virtual SValuePtr ite(const SValuePtr &cond, const SValuePtr &a, const SValuePtr &b) final
If-then-else.
 
virtual void interrupt(const SValuePtr &majr, const SValuePtr &minr, const SValuePtr &raise)
Invoked for instructions that cause an interrupt.
 
virtual SValuePtr protoval() const
Property: Prototypical semantic value.
 
virtual SValuePtr mostSignificantSetBit(const SValuePtr &a)=0
Returns position of most significant set bit; zero when no bits are set.
 
virtual SValuePtr unsignedMultiply(const SValuePtr &a, const SValuePtr &b)=0
Multiply two unsigned values.
 
virtual SValuePtr addCarry(const SValuePtr &a, const SValuePtr &b, SValuePtr &carryOut, SValuePtr &overflowed)
Adds two integers of equal size and carry.
 
virtual SValuePtr concatLoHi(const SValuePtr &lowBits, const SValuePtr &highBits)
Aliases for concatenation.
 
virtual SValuePtr filterReturnTarget(const SValuePtr &a)
Invoked to filter return targets.
 
virtual void hash(Combinatorics::Hasher &)
Compute hash of current state.
 
virtual SValuePtr shiftRight(const SValuePtr &a, const SValuePtr &nbits)=0
Returns arg shifted right logically (no sign bit).
 
virtual SValuePtr signedModulo(const SValuePtr &a, const SValuePtr &b)=0
Calculates modulo with signed values.
 
virtual void print(std::ostream &stream, Formatter &fmt) const
Print multi-line output for this object.
 
virtual SgAsmInstruction * currentInstruction() const
Property: Current instruction.
 
virtual void startInstruction(SgAsmInstruction *insn)
Called at the beginning of every instruction.
 
RiscOperatorsPtr Ptr
Shared-ownership pointer.
 
virtual SValuePtr rdtsc()
Invoked for the x86 RDTSC instruction.
 
virtual const std::string & name() const
Property: Name used for debugging.
 
virtual SValuePtr isSignedGreaterThan(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
 
virtual SValuePtr equalToZero(const SValuePtr &a)=0
Determines whether a value is equal to zero.
 
virtual SValuePtr fpAdd(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Add two floating-point values.
 
virtual void writeRegister(RegisterDescriptor reg, const SValuePtr &a)
Writes a value to a register.
 
virtual SValuePtr or_(const SValuePtr &a, const SValuePtr &b)=0
Computes bit-wise OR of two values.
 
virtual SValuePtr readMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &dflt, const SValuePtr &cond)=0
Reads a value from memory.
 
virtual SValuePtr xor_(const SValuePtr &a, const SValuePtr &b)=0
Computes bit-wise XOR of two values.
 
virtual SValuePtr convert(const SValuePtr &a, SgAsmType *srcType, SgAsmType *dstType)
Convert value from one type to another.
 
virtual RiscOperatorsPtr create(const SValuePtr &protoval, const SmtSolverPtr &solver=SmtSolverPtr()) const =0
Virtual allocating constructor.
 
virtual void nInsns(size_t n)
Property: Number of instructions processed.
 
virtual SValuePtr unsignedDivide(const SValuePtr ÷nd, const SValuePtr &divisor)=0
Divides two unsigned values.
 
virtual SValuePtr fpFromInteger(const SValuePtr &intValue, SgAsmFloatType *fpType)
Construct a floating-point value from an integer value.
 
virtual SValuePtr fpMultiply(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Multiply two floating-point values.
 
virtual SValuePtr fpSubtract(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Subtract one floating-point value from another.
 
virtual void currentState(const StatePtr &s)
Property: Current semantic state.
 
virtual StatePtr currentState() const
Property: Current semantic state.
 
virtual SValuePtr isEqual(const SValuePtr &a, const SValuePtr &b)
Equality comparison.
 
virtual void raiseInterrupt(unsigned majorNumber, unsigned minorNumber, const SValuePtr &raise)
Conditionally raise an interrupt.
 
virtual void hlt()
Invoked for the x86 HLT instruction.
 
const HotPatch & hotPatch() const
Property: Post-instruction hot patches.
 
WithFormatter operator+(Formatter &fmt)
Used for printing RISC operators with formatting.
 
IteStatus
Status for iteWithStatus operation.
 
@ BOTH
Return value is formed from both A and B.
 
@ A
Return value is formed from A since condition was true.
 
@ B
Return value is formed from B since condition was false.
 
@ NEITHER
Return value is formed from neither A nor B.
 
virtual SValuePtr rotateRight(const SValuePtr &a, const SValuePtr &nbits)=0
Rotate bits to the right.
 
virtual std::pair< SValuePtr, SValuePtr > split(const SValuePtr &a, size_t splitPoint)
Split a value into two narrower values.
 
virtual SValuePtr peekRegister(RegisterDescriptor, const SValuePtr &dflt)
Obtain a register value without side effects.
 
virtual SValuePtr concatHiLo(const SValuePtr &highBits, const SValuePtr &lowBits)
Aliases for concatenation.
 
virtual SValuePtr rotateLeft(const SValuePtr &a, const SValuePtr &nbits)=0
Rotate bits to the left.
 
HotPatch & hotPatch()
Property: Post-instruction hot patches.
 
virtual void solver(const SmtSolverPtr &s)
Property: Satisfiability module theory (SMT) solver.
 
virtual SValuePtr isUnsignedGreaterThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
 
virtual SValuePtr isUnsignedGreaterThan(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
 
virtual SValuePtr isNotEqual(const SValuePtr &a, const SValuePtr &b)
Equality comparison.
 
virtual SValuePtr fpEffectiveExponent(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Exponent of floating-point value.
 
virtual void name(const std::string &s)
Property: Name used for debugging.
 
virtual SValuePtr fpSquareRoot(const SValuePtr &a, SgAsmFloatType *fpType)
Square root.
 
virtual SValuePtr fpIsZero(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is equal to zero.
 
virtual bool isNoopRead() const
Property: No-op read.
 
SValuePtr peekRegister(RegisterDescriptor reg)
Obtain a register value without side effects.
 
virtual SValuePtr readRegister(RegisterDescriptor reg)
Reads a value from a register.
 
virtual SValuePtr peekMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &dflt)=0
Read memory without side effects.
 
virtual SValuePtr countLeadingOnes(const SValuePtr &a)
Count leading one bits.
 
virtual void initialState(const StatePtr &s)
Property: Optional lazily updated initial state.
 
virtual SValuePtr signedMultiply(const SValuePtr &a, const SValuePtr &b)=0
Multiplies two signed values.
 
virtual SValuePtr filterIndirectJumpTarget(const SValuePtr &a)
Invoked to filter indirect jumps.
 
Describes (part of) a physical CPU register.
 
size_t nBits() const
Property: Size in bits.
 
Base class for machine instructions.
 
Base class for binary types.
 
Base classes for instruction semantics.
 
boost::shared_ptr< RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to a RISC operators object.
 
boost::shared_ptr< State > StatePtr
Shared-ownership pointer to a semantic state.
 
std::shared_ptr< SmtSolver > SmtSolverPtr
Reference counting pointer.