ROSE  0.11.83.2
RiscOperators.h
1 #ifndef ROSE_BinaryAnalysis_InstructionSemantics2_BaseSemantics_RiscOperators_H
2 #define ROSE_BinaryAnalysis_InstructionSemantics2_BaseSemantics_RiscOperators_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
5 
6 #include <Rose/BinaryAnalysis/InstructionSemantics2/BaseSemantics/Types.h>
7 #include <Rose/BinaryAnalysis/InstructionSemantics2/Util.h>
8 #include <Rose/BinaryAnalysis/HotPatch.h>
9 #include <Rose/BinaryAnalysis/SmtSolver.h>
10 #include <Combinatorics.h>
11 
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>
18 
19 namespace Rose {
20 namespace BinaryAnalysis {
21 namespace InstructionSemantics2 {
22 namespace BaseSemantics {
23 
25 // RISC Operators
27 
48 class RiscOperators: public boost::enable_shared_from_this<RiscOperators> {
49 public:
52 
53 private:
54  SValuePtr protoval_; // Prototypical value used for its virtual constructors
55  StatePtr currentState_; // State upon which RISC operators operate
56  StatePtr initialState_; // Lazily updated initial state; see readMemory
57  SmtSolverPtr solver_; // Optional SMT solver
58  SgAsmInstruction *currentInsn_ = nullptr; // Current instruction, as set by latest startInstruction call
59  size_t nInsns_ = 0; // Number of instructions processed
60  std::string name_; // Name to use for debugging
61  HotPatch hotPatch_; // Adjustments to the semantic state after each instruction.
62  bool isNoopRead_ = false; // Read is part of a possible no-op read-then-write sequence
63 
65  // Serialization
66 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
67 private:
68  friend class boost::serialization::access;
69 
70  template<class S>
71  void serialize(S &s, const unsigned version) {
72  s & BOOST_SERIALIZATION_NVP(protoval_);
73  s & BOOST_SERIALIZATION_NVP(currentState_);
74  s & BOOST_SERIALIZATION_NVP(initialState_);
75  s & BOOST_SERIALIZATION_NVP(solver_);
76  s & BOOST_SERIALIZATION_NVP(currentInsn_);
77  s & BOOST_SERIALIZATION_NVP(nInsns_);
78  s & BOOST_SERIALIZATION_NVP(name_);
79  if (version >= 1)
80  s & BOOST_SERIALIZATION_NVP(hotPatch_);
81  if (version >= 2)
82  s & BOOST_SERIALIZATION_NVP(isNoopRead_);
83  }
84 #endif
85 
87  // Real constructors
88 protected:
89  // for serialization
90  RiscOperators();
91 
92  explicit RiscOperators(const SValuePtr &protoval, const SmtSolverPtr &solver = SmtSolverPtr());
93  explicit RiscOperators(const StatePtr &state, const SmtSolverPtr &solver = SmtSolverPtr());
94 
95 public:
96  virtual ~RiscOperators();
97 
99  // Static allocating constructors. None needed since this class is abstract.
100 
101 
103  // Virtual constructors.
104 public:
108  virtual RiscOperatorsPtr create(const SValuePtr &protoval, const SmtSolverPtr &solver = SmtSolverPtr()) const = 0;
109 
114  virtual RiscOperatorsPtr create(const StatePtr &state, const SmtSolverPtr &solver = SmtSolverPtr()) const = 0;
115 
117  // Dynamic pointer casts. No-op since this is the base class.
118 public:
119  static RiscOperatorsPtr promote(const RiscOperatorsPtr &x) {
120  ASSERT_not_null(x);
121  return x;
122  }
123 
125  // Other methods part of our API
126 public:
130  virtual SValuePtr protoval() const { return protoval_; }
131 
140  virtual SmtSolverPtr solver() const { return solver_; }
141  virtual void solver(const SmtSolverPtr &s) { solver_ = s; }
150  const HotPatch& hotPatch() const { return hotPatch_; }
151  HotPatch& hotPatch() { return hotPatch_; }
152  void hotPatch(const HotPatch &hp) { hotPatch_ = hp; }
166  virtual StatePtr currentState() const { return currentState_; }
167  virtual void currentState(const StatePtr &s) { currentState_ = s; }
207  virtual StatePtr initialState() const { return initialState_; }
208  virtual void initialState(const StatePtr &s) { initialState_ = s; }
216  virtual const std::string& name() const { return name_; }
217  virtual void name(const std::string &s) { name_ = s; }
223  virtual void hash(Combinatorics::Hasher&);
224 
227  void print(std::ostream &stream, const std::string prefix="") const;
228  virtual void print(std::ostream &stream, Formatter &fmt) const;
233  RiscOperatorsPtr obj;
234  Formatter &fmt;
235  public:
236  WithFormatter(const RiscOperatorsPtr &obj, Formatter &fmt): obj(obj), fmt(fmt) {}
237  void print(std::ostream &stream) const { obj->print(stream, fmt); }
238  };
239 
255  WithFormatter with_format(Formatter &fmt) { return WithFormatter(shared_from_this(), fmt); }
257  WithFormatter operator+(const std::string &linePrefix);
265  virtual size_t nInsns() const { return nInsns_; }
266  virtual void nInsns(size_t n) { nInsns_ = n; }
276  return currentInsn_;
277  }
278  virtual void currentInstruction(SgAsmInstruction *insn) {
279  currentInsn_ = insn;
280  }
296  virtual bool isNoopRead() const { return isNoopRead_; }
297  virtual void isNoopRead(bool b) { isNoopRead_ = b; }
302  virtual void startInstruction(SgAsmInstruction *insn);
303 
306  virtual void finishInstruction(SgAsmInstruction *insn);
307 
308 
310  // Value Construction Operations
312  // The trailing underscores are necessary for for undefined_() on some machines, so we just add one to the end of all the
313  // virtual constructors for consistency.
314 
318  virtual SValuePtr undefined_(size_t nbits);
319  virtual SValuePtr unspecified_(size_t nbits);
323  virtual SValuePtr number_(size_t nbits, uint64_t value);
324 
326  virtual SValuePtr boolean_(bool value);
327 
329  virtual SValuePtr bottom_(size_t nbits);
330 
331 
333  // x86-specific Operations (FIXME)
335 
338  virtual SValuePtr filterCallTarget(const SValuePtr &a);
339 
343  virtual SValuePtr filterReturnTarget(const SValuePtr &a);
344 
348  virtual SValuePtr filterIndirectJumpTarget(const SValuePtr &a);
349 
351  virtual void hlt() {}
352 
354  virtual void cpuid() {}
355 
357  virtual SValuePtr rdtsc() { return unspecified_(64); }
358 
359 
361  // Boolean Operations
363 
366  virtual SValuePtr and_(const SValuePtr &a, const SValuePtr &b) = 0;
367 
370  virtual SValuePtr or_(const SValuePtr &a, const SValuePtr &b) = 0;
371 
374  virtual SValuePtr xor_(const SValuePtr &a, const SValuePtr &b) = 0;
375 
377  virtual SValuePtr invert(const SValuePtr &a) = 0;
378 
382  virtual SValuePtr extract(const SValuePtr &a, size_t begin_bit, size_t end_bit) = 0;
383 
389  virtual SValuePtr concat(const SValuePtr &lowBits, const SValuePtr &highBits) = 0;
390 
398  virtual SValuePtr concatLoHi(const SValuePtr &lowBits, const SValuePtr &highBits) {
399  return concat(lowBits, highBits);
400  }
401  virtual SValuePtr concatHiLo(const SValuePtr &highBits, const SValuePtr &lowBits) {
402  return concat(lowBits, highBits);
403  }
411  virtual std::pair<SValuePtr /*low*/, SValuePtr /*high*/> split(const SValuePtr &a, size_t splitPoint);
412 
415  virtual SValuePtr leastSignificantSetBit(const SValuePtr &a) = 0;
416 
419  virtual SValuePtr mostSignificantSetBit(const SValuePtr &a) = 0;
420 
425  virtual SValuePtr countLeadingZeros(const SValuePtr &a);
426 
431  virtual SValuePtr countLeadingOnes(const SValuePtr &a);
432 
436  virtual SValuePtr rotateLeft(const SValuePtr &a, const SValuePtr &nbits) = 0;
437 
441  virtual SValuePtr rotateRight(const SValuePtr &a, const SValuePtr &nbits) = 0;
442 
446  virtual SValuePtr shiftLeft(const SValuePtr &a, const SValuePtr &nbits) = 0;
447 
451  virtual SValuePtr shiftRight(const SValuePtr &a, const SValuePtr &nbits) = 0;
452 
457  virtual SValuePtr shiftRightArithmetic(const SValuePtr &a, const SValuePtr &nbits) = 0;
458 
464  virtual SValuePtr reverseElmts(const SValuePtr &a, size_t elmtNBits);
465 
466 
468  // Comparison Operations
470 
473  virtual SValuePtr equalToZero(const SValuePtr &a) = 0;
474 
478  virtual SValuePtr ite(const SValuePtr &cond, const SValuePtr &a, const SValuePtr &b) = 0;
479 
486  virtual SValuePtr isEqual(const SValuePtr &a, const SValuePtr &b);
487  virtual SValuePtr isNotEqual(const SValuePtr &a, const SValuePtr &b);
497  virtual SValuePtr isUnsignedLessThan(const SValuePtr &a, const SValuePtr &b);
498  virtual SValuePtr isUnsignedLessThanOrEqual(const SValuePtr &a, const SValuePtr &b);
499  virtual SValuePtr isUnsignedGreaterThan(const SValuePtr &a, const SValuePtr &b);
500  virtual SValuePtr isUnsignedGreaterThanOrEqual(const SValuePtr &a, const SValuePtr &b);
510  virtual SValuePtr isSignedLessThan(const SValuePtr &a, const SValuePtr &b);
511  virtual SValuePtr isSignedLessThanOrEqual(const SValuePtr &a, const SValuePtr &b);
512  virtual SValuePtr isSignedGreaterThan(const SValuePtr &a, const SValuePtr &b);
513  virtual SValuePtr isSignedGreaterThanOrEqual(const SValuePtr &a, const SValuePtr &b);
516  // Integer Arithmetic Operations
519 
522  virtual SValuePtr unsignedExtend(const SValuePtr &a, size_t new_width);
523 
526  virtual SValuePtr signExtend(const SValuePtr &a, size_t new_width) = 0;
527 
530  virtual SValuePtr add(const SValuePtr &a, const SValuePtr &b) = 0;
531 
536  virtual SValuePtr addCarry(const SValuePtr &a, const SValuePtr &b,
537  SValuePtr &carryOut /*out*/, SValuePtr &overflowed /*out*/);
538 
544  virtual SValuePtr subtract(const SValuePtr &minuend, const SValuePtr &subtrahend);
545 
554  virtual SValuePtr subtractCarry(const SValuePtr &minuend, const SValuePtr &subtrahend,
555  SValuePtr &carryOut /*out*/, SValuePtr &overflowed /*out*/);
556 
573  virtual SValuePtr addWithCarries(const SValuePtr &a, const SValuePtr &b, const SValuePtr &c,
574  SValuePtr &carry_out/*output*/) = 0;
575 
577  virtual SValuePtr negate(const SValuePtr &a) = 0;
578 
580  virtual SValuePtr signedDivide(const SValuePtr &dividend, const SValuePtr &divisor) = 0;
581 
583  virtual SValuePtr signedModulo(const SValuePtr &a, const SValuePtr &b) = 0;
584 
586  virtual SValuePtr signedMultiply(const SValuePtr &a, const SValuePtr &b) = 0;
587 
589  virtual SValuePtr unsignedDivide(const SValuePtr &dividend, const SValuePtr &divisor) = 0;
590 
592  virtual SValuePtr unsignedModulo(const SValuePtr &a, const SValuePtr &b) = 0;
593 
595  virtual SValuePtr unsignedMultiply(const SValuePtr &a, const SValuePtr &b) = 0;
596 
597 
599  // Interrupt and system calls
601 
608  virtual void interrupt(int majr, int minr) {}
609 
615  virtual void interrupt(const SValuePtr &majr, const SValuePtr &minr, const SValuePtr &enabled);
616 
617 
619  // Floating-point operations
620  //
621  // For now these all have default implementations that throw NotImplemented, but we might change them to pure virtual
622  // sometime in the future so they're consistent with most other RISC operators. [Robb P. Matzke 2015-08-03]
624 
626  virtual SValuePtr fpFromInteger(const SValuePtr &intValue, SgAsmFloatType *fpType);
627 
633  virtual SValuePtr fpToInteger(const SValuePtr &fpValue, SgAsmFloatType *fpType, const SValuePtr &dflt);
634 
638  virtual SValuePtr fpConvert(const SValuePtr &a, SgAsmFloatType *aType, SgAsmFloatType *retType);
639 
641  virtual SValuePtr fpIsNan(const SValuePtr &fpValue, SgAsmFloatType *fpType);
642 
644  virtual SValuePtr fpIsDenormalized(const SValuePtr &fpValue, SgAsmFloatType *fpType);
645 
647  virtual SValuePtr fpIsZero(const SValuePtr &fpValue, SgAsmFloatType *fpType);
648 
653  virtual SValuePtr fpIsInfinity(const SValuePtr &fpValue, SgAsmFloatType *fpType);
654 
658  virtual SValuePtr fpSign(const SValuePtr &fpValue, SgAsmFloatType *fpType);
659 
665  virtual SValuePtr fpEffectiveExponent(const SValuePtr &fpValue, SgAsmFloatType *fpType);
666 
670  virtual SValuePtr fpAdd(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType);
671 
676  virtual SValuePtr fpSubtract(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType);
677 
681  virtual SValuePtr fpMultiply(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType);
682 
686  virtual SValuePtr fpDivide(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType);
687 
691  virtual SValuePtr fpSquareRoot(const SValuePtr &a, SgAsmFloatType *fpType);
692 
696  virtual SValuePtr fpRoundTowardZero(const SValuePtr &a, SgAsmFloatType *fpType);
697 
699  // Conversion operations
701 
707  virtual SValuePtr reinterpret(const SValuePtr &a, SgAsmType *retType);
708 
719  virtual SValuePtr convert(const SValuePtr &a, SgAsmType *srcType, SgAsmType *dstType);
720 
721 
723  // State Accessing Operations
725 
750  virtual SValuePtr readRegister(RegisterDescriptor reg) { // old subclasses can still override this if they want,
751  return readRegister(reg, undefined_(reg.nBits())); // but new subclasses should not override this method.
752  }
753  virtual SValuePtr readRegister(RegisterDescriptor reg, const SValuePtr &dflt); // new subclasses override this
765  virtual void writeRegister(RegisterDescriptor reg, const SValuePtr &a);
766 
774  virtual SValuePtr peekRegister(RegisterDescriptor, const SValuePtr &dflt);
776  return peekRegister(reg, undefined_(reg.nBits()));
777  }
801  virtual SValuePtr readMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &dflt,
802  const SValuePtr &cond) = 0;
803 
814  virtual void writeMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &data,
815  const SValuePtr &cond) = 0;
816 
821  virtual SValuePtr peekMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &dflt) = 0;
822 };
823 
824 std::ostream& operator<<(std::ostream&, const RiscOperators&);
825 std::ostream& operator<<(std::ostream&, const RiscOperators::WithFormatter&);
826 
827 } // namespace
828 } // namespace
829 } // namespace
830 } // namespace
831 
834 
835 #endif
836 #endif
virtual SValuePtr signedMultiply(const SValuePtr &a, const SValuePtr &b)=0
Multiplies two signed values.
boost::shared_ptr< RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to a RISC operators object.
virtual SValuePtr fpIsDenormalized(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is denormalized.
virtual SgAsmInstruction * currentInstruction() const
Property: Current instruction.
virtual SValuePtr rotateRight(const SValuePtr &a, const SValuePtr &nbits)=0
Rotate bits to the right.
virtual SValuePtr filterIndirectJumpTarget(const SValuePtr &a)
Invoked to filter indirect jumps.
virtual SValuePtr isEqual(const SValuePtr &a, const SValuePtr &b)
Equality comparison.
virtual SValuePtr countLeadingOnes(const SValuePtr &a)
Count leading one bits.
size_t nBits() const
Property: Size in bits.
virtual SValuePtr fpMultiply(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Multiply two floating-point values.
virtual SValuePtr undefined_(size_t nbits)
Returns a new undefined value.
virtual SValuePtr isSignedGreaterThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
virtual SValuePtr isSignedLessThan(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
Describes how to modify machine state after each instruction.
Definition: HotPatch.h:22
virtual SValuePtr leastSignificantSetBit(const SValuePtr &a)=0
Returns position of least significant set bit; zero when no bits are set.
virtual SValuePtr convert(const SValuePtr &a, SgAsmType *srcType, SgAsmType *dstType)
Convert value from one type to another.
virtual void writeMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &data, const SValuePtr &cond)=0
Writes a value to memory.
Base class for machine instructions.
WithFormatter operator+(Formatter &fmt)
Used for printing RISC operators with formatting.
virtual void finishInstruction(SgAsmInstruction *insn)
Called at the end of every instruction.
HotPatch & hotPatch()
Property: Post-instruction hot patches.
const HotPatch & hotPatch() const
Property: Post-instruction hot patches.
virtual SValuePtr fpFromInteger(const SValuePtr &intValue, SgAsmFloatType *fpType)
Construct a floating-point value from an integer value.
virtual SValuePtr unsignedDivide(const SValuePtr &dividend, const SValuePtr &divisor)=0
Divides two unsigned values.
virtual SValuePtr fpRoundTowardZero(const SValuePtr &a, SgAsmFloatType *fpType)
Round toward zero.
boost::shared_ptr< State > StatePtr
Shared-ownership pointer to a semantic state.
virtual SValuePtr rotateLeft(const SValuePtr &a, const SValuePtr &nbits)=0
Rotate bits to the left.
virtual SValuePtr extract(const SValuePtr &a, size_t begin_bit, size_t end_bit)=0
Extracts bits from a value.
virtual SValuePtr fpDivide(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Divide one floating-point value by another.
virtual SValuePtr signedDivide(const SValuePtr &dividend, const SValuePtr &divisor)=0
Divides two signed values.
virtual void cpuid()
Invoked for the x86 CPUID instruction.
virtual SValuePtr fpSign(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Sign of floating-point value.
virtual SValuePtr protoval() const
Property: Prototypical semantic value.
Main namespace for the ROSE library.
virtual SValuePtr fpToInteger(const SValuePtr &fpValue, SgAsmFloatType *fpType, const SValuePtr &dflt)
Construct an integer value from a floating-point value.
virtual SValuePtr unsignedMultiply(const SValuePtr &a, const SValuePtr &b)=0
Multiply two unsigned values.
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.
virtual SValuePtr peekMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &dflt)=0
Read memory without side effects.
virtual void solver(const SmtSolverPtr &s)
Property: Satisfiability module theory (SMT) solver.
virtual SValuePtr concatLoHi(const SValuePtr &lowBits, const SValuePtr &highBits)
Aliases for concatenation.
virtual SValuePtr readMemory(RegisterDescriptor segreg, const SValuePtr &addr, const SValuePtr &dflt, const SValuePtr &cond)=0
Reads a value from memory.
virtual SValuePtr or_(const SValuePtr &a, const SValuePtr &b)=0
Computes bit-wise OR of two values.
virtual SValuePtr boolean_(bool value)
Returns a Boolean value.
virtual void interrupt(int majr, int minr)
Invoked for instructions that cause an interrupt.
virtual size_t nInsns() const
Property: Number of instructions processed.
virtual SValuePtr shiftRight(const SValuePtr &a, const SValuePtr &nbits)=0
Returns arg shifted right logically (no sign bit).
virtual StatePtr currentState() const
Property: Current semantic state.
virtual SValuePtr add(const SValuePtr &a, const SValuePtr &b)=0
Adds two integers of equal size.
virtual SValuePtr isSignedGreaterThan(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
virtual SValuePtr ite(const SValuePtr &cond, const SValuePtr &a, const SValuePtr &b)=0
If-then-else.
virtual SValuePtr reinterpret(const SValuePtr &a, SgAsmType *retType)
Reinterpret an expression as a different type.
virtual SValuePtr equalToZero(const SValuePtr &a)=0
Determines whether a value is equal to zero.
virtual SValuePtr isUnsignedLessThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
virtual SValuePtr countLeadingZeros(const SValuePtr &a)
Count leading zero bits.
virtual void hlt()
Invoked for the x86 HLT instruction.
virtual SValuePtr reverseElmts(const SValuePtr &a, size_t elmtNBits)
Reverse parts of a 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 xor_(const SValuePtr &a, const SValuePtr &b)=0
Computes bit-wise XOR of two values.
Base classes for instruction semantics.
Definition: Dispatcher.h:18
virtual SValuePtr subtract(const SValuePtr &minuend, const SValuePtr &subtrahend)
Subtract one value from another.
virtual SValuePtr fpIsInfinity(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is infinity.
virtual SValuePtr filterReturnTarget(const SValuePtr &a)
Invoked to filter return targets.
Describes (part of) a physical CPU register.
virtual SValuePtr addCarry(const SValuePtr &a, const SValuePtr &b, SValuePtr &carryOut, SValuePtr &overflowed)
Adds two integers of equal size and carry.
virtual void nInsns(size_t n)
Property: Number of instructions processed.
virtual SValuePtr fpIsZero(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is equal to zero.
virtual SValuePtr invert(const SValuePtr &a)=0
One's complement.
virtual SValuePtr fpSquareRoot(const SValuePtr &a, SgAsmFloatType *fpType)
Square root.
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 filterCallTarget(const SValuePtr &a)
Invoked to filter call targets.
virtual SValuePtr isUnsignedGreaterThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
virtual SValuePtr fpAdd(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Add two floating-point values.
virtual void currentState(const StatePtr &s)
Property: Current semantic state.
void print(std::ostream &stream, const std::string prefix="") const
Print multi-line output for this object.
virtual SValuePtr concat(const SValuePtr &lowBits, const SValuePtr &highBits)=0
Concatenates the bits of two values.
virtual StatePtr initialState() const
Property: Optional lazily updated initial state.
virtual SValuePtr fpIsNan(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Whether a floating-point value is a special not-a-number bit pattern.
Base class for most instruction semantics RISC operators.
Definition: RiscOperators.h:48
virtual SValuePtr rdtsc()
Invoked for the x86 RDTSC instruction.
virtual SValuePtr unsignedModulo(const SValuePtr &a, const SValuePtr &b)=0
Calculates modulo with unsigned values.
SValuePtr peekRegister(RegisterDescriptor reg)
Obtain a register value without side effects.
virtual void initialState(const StatePtr &s)
Property: Optional lazily updated initial state.
virtual SValuePtr fpConvert(const SValuePtr &a, SgAsmFloatType *aType, SgAsmFloatType *retType)
Convert from one floating-point type to another.
virtual SValuePtr concatHiLo(const SValuePtr &highBits, const SValuePtr &lowBits)
Aliases for concatenation.
Base class for binary types.
virtual std::pair< SValuePtr, SValuePtr > split(const SValuePtr &a, size_t splitPoint)
Split a value into two narrower values.
virtual SValuePtr fpEffectiveExponent(const SValuePtr &fpValue, SgAsmFloatType *fpType)
Exponent of floating-point value.
virtual SValuePtr isUnsignedLessThan(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
virtual SValuePtr signExtend(const SValuePtr &a, size_t new_width)=0
Sign extends a value.
virtual void name(const std::string &s)
Property: Name used for debugging.
virtual SValuePtr unspecified_(size_t nbits)
Returns a new undefined value.
virtual void startInstruction(SgAsmInstruction *insn)
Called at the beginning of every instruction.
virtual SValuePtr bottom_(size_t nbits)
Returns a data-flow bottom value.
WithFormatter with_format(Formatter &fmt)
Used for printing RISC operators with formatting.
virtual SValuePtr mostSignificantSetBit(const SValuePtr &a)=0
Returns position of most significant set bit; zero when no bits are set.
virtual void writeRegister(RegisterDescriptor reg, const SValuePtr &a)
Writes a value to a register.
virtual void hash(Combinatorics::Hasher &)
Compute hash of current state.
virtual SValuePtr negate(const SValuePtr &a)=0
Two's complement.
virtual SValuePtr shiftLeft(const SValuePtr &a, const SValuePtr &nbits)=0
Returns arg shifted left.
virtual SValuePtr isUnsignedGreaterThan(const SValuePtr &a, const SValuePtr &b)
Comparison for unsigned values.
virtual SValuePtr peekRegister(RegisterDescriptor, const SValuePtr &dflt)
Obtain a register value without side effects.
virtual SmtSolverPtr solver() const
Property: Satisfiability module theory (SMT) solver.
void hotPatch(const HotPatch &hp)
Property: Post-instruction hot patches.
virtual RiscOperatorsPtr create(const SValuePtr &protoval, const SmtSolverPtr &solver=SmtSolverPtr()) const =0
Virtual allocating constructor.
virtual const std::string & name() const
Property: Name used for debugging.
RiscOperatorsPtr Ptr
Shared-ownership pointer for a RiscOperators object.
Definition: RiscOperators.h:51
virtual SValuePtr readRegister(RegisterDescriptor reg)
Reads a value from a register.
virtual SValuePtr number_(size_t nbits, uint64_t value)
Returns a number of the specified bit width.
virtual SValuePtr fpSubtract(const SValuePtr &a, const SValuePtr &b, SgAsmFloatType *fpType)
Subtract one floating-point value from another.
virtual SValuePtr signedModulo(const SValuePtr &a, const SValuePtr &b)=0
Calculates modulo with signed values.
virtual void currentInstruction(SgAsmInstruction *insn)
Property: Current instruction.
virtual SValuePtr isNotEqual(const SValuePtr &a, const SValuePtr &b)
Equality comparison.
Floating point types.
virtual SValuePtr isSignedLessThanOrEqual(const SValuePtr &a, const SValuePtr &b)
Comparison for signed values.
std::shared_ptr< class SmtSolver > SmtSolverPtr
Reference-counting pointer for SMT solvers.
Definition: SmtSolver.h:26
virtual SValuePtr and_(const SValuePtr &a, const SValuePtr &b)=0
Computes bit-wise AND of two values.