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>
13#include <boost/serialization/access.hpp>
14#include <boost/serialization/export.hpp>
15#include <boost/serialization/nvp.hpp>
16#include <boost/serialization/shared_ptr.hpp>
17#include <boost/serialization/version.hpp>
20namespace BinaryAnalysis {
21namespace InstructionSemantics {
49class RiscOperators:
public boost::enable_shared_from_this<RiscOperators> {
63 bool isNoopRead_ =
false;
67#ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
69 friend class boost::serialization::access;
72 void serialize(S &s,
const unsigned version) {
73 s & BOOST_SERIALIZATION_NVP(protoval_);
74 s & BOOST_SERIALIZATION_NVP(currentState_);
75 s & BOOST_SERIALIZATION_NVP(initialState_);
76 s & BOOST_SERIALIZATION_NVP(solver_);
77 s & BOOST_SERIALIZATION_NVP(currentInsn_);
78 s & BOOST_SERIALIZATION_NVP(nInsns_);
79 s & BOOST_SERIALIZATION_NVP(name_);
81 s & BOOST_SERIALIZATION_NVP(hotPatch_);
83 s & BOOST_SERIALIZATION_NVP(isNoopRead_);
217 virtual const std::string&
name()
const {
return name_; }
218 virtual void name(
const std::string &s) { name_ = s; }
228 void print(std::ostream &stream,
const std::string prefix=
"")
const;
238 void print(std::ostream &stream)
const { obj->print(stream, fmt); }
266 virtual size_t nInsns()
const {
return nInsns_; }
267 virtual void nInsns(
size_t n) { nInsns_ = n; }
406 return concat(lowBits, highBits);
409 return concat(lowBits, highBits);
642 virtual void interrupt(
int majorNumber,
int minorNumber);
873std::ostream& operator<<(std::ostream&,
const RiscOperators&);
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.