ROSE  0.11.31.0
MultiSemantics2.h
1 #ifndef Rose_MultiSemantics2_H
2 #define Rose_MultiSemantics2_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
5 
6 #include "BaseSemantics2.h"
7 
8 namespace Rose { // documented elsewhere
9 namespace BinaryAnalysis { // documented elsewhere
10 namespace InstructionSemantics2 { // documented elsewhere
11 
59 namespace MultiSemantics {
60 
63 public:
64  std::vector<std::string> subdomain_names;
65 };
66 
68 // Semantic values
70 
73 
84 protected:
85  typedef std::vector<BaseSemantics::SValuePtr> Subvalues;
86  Subvalues subvalues;
87 
88 protected:
89  // Protected constructors
90  explicit SValue(size_t nbits)
91  : BaseSemantics::SValue(nbits) {}
92 
93  SValue(const SValue &other)
94  : BaseSemantics::SValue(other.nBits()) {
95  init(other);
96  }
97 
98  void init(const SValue &other);
99 
101  // Static allocating constructors
102 public:
104  static SValuePtr instance() {
105  return SValuePtr(new SValue(1));
106  }
107 
109  static SValuePtr promote(const BaseSemantics::SValuePtr &v) { // hot
110  SValuePtr retval = v.dynamicCast<SValue>();
111  ASSERT_not_null(retval);
112  return retval;
113  }
114 
116  // Virtual allocating constructors
117 public:
118 
119  virtual BaseSemantics::SValuePtr bottom_(size_t nbits) const ROSE_OVERRIDE;
120 
124  virtual BaseSemantics::SValuePtr undefined_(size_t nbits) const ROSE_OVERRIDE;
125 
129  virtual BaseSemantics::SValuePtr unspecified_(size_t nbits) const ROSE_OVERRIDE;
130 
133  virtual BaseSemantics::SValuePtr number_(size_t nbits, uint64_t number) const ROSE_OVERRIDE;
134 
137  virtual SValuePtr create_empty(size_t nbits) const {
138  return SValuePtr(new SValue(nbits));
139  }
140 
141  virtual BaseSemantics::SValuePtr copy(size_t new_width=0) const ROSE_OVERRIDE {
142  return BaseSemantics::SValuePtr(new SValue(*this));
143  }
144 
147  const SmtSolverPtr&) const ROSE_OVERRIDE;
148 
150  // Override virtual methods
151 public:
152  virtual bool isBottom() const ROSE_OVERRIDE;
153  virtual void print(std::ostream&, BaseSemantics::Formatter&) const ROSE_OVERRIDE;
154  virtual void hash(Combinatorics::Hasher&) const override;
155 
157  // Override legacy methods. Override these for now, but always call the camelCase names from the base class. Eventually
158  // these snake_case names will go away and the camelCase will become the virtual functions, so be sure to specify
159  // "override" in your own code so you get notified when that change occurs.
160 public:
163  virtual bool may_equal(const BaseSemantics::SValuePtr &other,
164  const SmtSolverPtr &solver = SmtSolverPtr()) const ROSE_OVERRIDE;
165 
169  virtual bool must_equal(const BaseSemantics::SValuePtr &other,
170  const SmtSolverPtr &solver = SmtSolverPtr()) const ROSE_OVERRIDE;
171 
172  virtual void set_width(size_t nbits) ROSE_OVERRIDE;
173 
177  virtual bool is_number() const ROSE_OVERRIDE;
178 
179  virtual uint64_t get_number() const ROSE_OVERRIDE;
180 
181 
183  // Additional methods first declared at this level of the class hierarchy
184 public:
187  virtual bool is_valid(size_t idx) const { // hot
188  return idx<subvalues.size() && subvalues[idx]!=NULL;
189  }
190 
193  virtual void invalidate(size_t idx);
194 
196  virtual BaseSemantics::SValuePtr get_subvalue(size_t idx) const { // hot
197  ASSERT_require(idx<subvalues.size() && subvalues[idx]!=NULL); // you should have called is_valid() first
198  return subvalues[idx];
199  }
200 
204  virtual void set_subvalue(size_t idx, const BaseSemantics::SValuePtr &value) { // hot
205  ASSERT_require(value==NULL || value->nBits()==nBits());
206  if (idx>=subvalues.size())
207  subvalues.resize(idx+1);
208  subvalues[idx] = value;
209  }
210 };
211 
212 
214 // Register states
216 
217 typedef void RegisterState;
218 
220 typedef boost::shared_ptr<void> RegisterStatePtr;
221 
223 // Memory states
225 
226 typedef void MemoryState;
227 
229 typedef boost::shared_ptr<void> MemoryStatePtr;
230 
232 // Complete state
234 
235 typedef void State;
236 
238 typedef boost::shared_ptr<void> StatePtr;
239 
241 // RISC operators
243 
245 typedef boost::shared_ptr<class RiscOperators> RiscOperatorsPtr;
246 
252 protected:
253  typedef std::vector<BaseSemantics::RiscOperatorsPtr> Subdomains;
254  Subdomains subdomains;
255  std::vector<bool> active;
256  Formatter formatter; // contains names for the subdomains
257 
259  // Real constructors
260 protected:
262  : BaseSemantics::RiscOperators(protoval, solver) {
263  name("Multi");
264  (void) SValue::promote(protoval); // check that its dynamic type is a MultiSemantics::SValue
265  }
266 
267  explicit RiscOperators(const BaseSemantics::StatePtr &state, const SmtSolverPtr &solver = SmtSolverPtr())
269  name("Multi");
270  (void) SValue::promote(state->protoval()); // dynamic type must be a MultiSemantics::SValue
271  }
272 
274  // Static allocating constructors
275 public:
279  static RiscOperatorsPtr instance(const RegisterDictionary *regdict) {
281  return RiscOperatorsPtr(new RiscOperators(protoval));
282  }
283 
284  static RiscOperatorsPtr instance(const BaseSemantics::SValuePtr &protoval, const SmtSolverPtr &solver = SmtSolverPtr()) {
285  return RiscOperatorsPtr(new RiscOperators(protoval, solver));
286  }
287 
288  static RiscOperatorsPtr instance(const BaseSemantics::StatePtr &state, const SmtSolverPtr &solver = SmtSolverPtr()) {
289  return RiscOperatorsPtr(new RiscOperators(state, solver));
290  }
291 
293  // Virtual constructors
294 public:
296  const SmtSolverPtr &solver = SmtSolverPtr()) const ROSE_OVERRIDE {
297  return instance(protoval, solver);
298  }
299 
301  const SmtSolverPtr &solver = SmtSolverPtr()) const ROSE_OVERRIDE {
302  return instance(state, solver);
303  }
304 
306  // Dynamic pointer casts
307 public:
308  static RiscOperatorsPtr promote(const BaseSemantics::RiscOperatorsPtr &ops);
309 
311  // Methods first defined at this level of the class hiearchy
312 public:
318  virtual size_t add_subdomain(const BaseSemantics::RiscOperatorsPtr &subdomain, const std::string &name, bool activate=true);
319 
322  return formatter;
323  }
324 
326  virtual size_t nsubdomains() const {
327  return subdomains.size();
328  }
329 
331  virtual BaseSemantics::RiscOperatorsPtr get_subdomain(size_t idx) const;
332 
336  virtual bool is_active(size_t idx) const {
337  return idx<subdomains.size() && subdomains[idx]!=NULL && active[idx];
338  }
339 
342  virtual void clear_active(size_t idx) {
343  set_active(idx, false);
344  }
345 
349  virtual void set_active(size_t idx, bool status);
350 
353  virtual void before(size_t idx) {}
354 
357  virtual void after(size_t idx) {}
358 
360  virtual SValuePtr svalue_empty(size_t nbits) {
361  return SValue::promote(protoval())->create_empty(nbits);
362  }
363 
379  class Cursor {
380  public:
381  typedef std::vector<SValuePtr> Inputs;
382  protected:
383  RiscOperators *ops_;
384  Inputs inputs_;
385  size_t idx_;
386  public:
387  Cursor(RiscOperators *ops, const SValuePtr &arg1=SValuePtr(), const SValuePtr &arg2=SValuePtr(),
388  const SValuePtr &arg3=SValuePtr())
389  : ops_(ops), idx_(0) {
390  init(arg1, arg2, arg3);
391  }
392  Cursor(RiscOperators *ops, const Inputs &inputs)
393  : ops_(ops), inputs_(inputs), idx_(0) {
394  init();
395  }
396 
400  static Inputs inputs(const BaseSemantics::SValuePtr &arg1=BaseSemantics::SValuePtr(),
403 
404  bool at_end() const;
405  void next();
406  size_t idx() const;
412 
413  protected:
414  void init(const SValuePtr &arg1, const SValuePtr &arg2, const SValuePtr &arg3);
415  void init();
416  void skip_invalid();
417  bool inputs_are_valid() const;
418  };
419 
421  // RISC operations and other overrides
422 public:
423  virtual void print(std::ostream &o, BaseSemantics::Formatter&) const ROSE_OVERRIDE;
424  virtual void startInstruction(SgAsmInstruction *insn) ROSE_OVERRIDE;
425  virtual void finishInstruction(SgAsmInstruction *insn) ROSE_OVERRIDE;
426  virtual BaseSemantics::SValuePtr undefined_(size_t nbits) ROSE_OVERRIDE;
427  virtual BaseSemantics::SValuePtr unspecified_(size_t nbits) ROSE_OVERRIDE;
428  virtual BaseSemantics::SValuePtr number_(size_t nbits, uint64_t value) ROSE_OVERRIDE;
429  virtual BaseSemantics::SValuePtr boolean_(bool) ROSE_OVERRIDE;
430  virtual BaseSemantics::SValuePtr bottom_(size_t nbits) ROSE_OVERRIDE;
431  virtual BaseSemantics::SValuePtr filterCallTarget(const BaseSemantics::SValuePtr&) ROSE_OVERRIDE;
432  virtual BaseSemantics::SValuePtr filterReturnTarget(const BaseSemantics::SValuePtr&) ROSE_OVERRIDE;
433  virtual BaseSemantics::SValuePtr filterIndirectJumpTarget(const BaseSemantics::SValuePtr&) ROSE_OVERRIDE;
434  virtual BaseSemantics::SValuePtr and_(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
435  virtual BaseSemantics::SValuePtr or_(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
436  virtual BaseSemantics::SValuePtr xor_(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
437  virtual BaseSemantics::SValuePtr invert(const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE;
438  virtual BaseSemantics::SValuePtr extract(const BaseSemantics::SValuePtr &a, size_t begin_bit, size_t end_bit) ROSE_OVERRIDE;
439  virtual BaseSemantics::SValuePtr concat(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
440  virtual BaseSemantics::SValuePtr leastSignificantSetBit(const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE;
441  virtual BaseSemantics::SValuePtr mostSignificantSetBit(const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE;
442  virtual BaseSemantics::SValuePtr rotateLeft(const BaseSemantics::SValuePtr &a,
443  const BaseSemantics::SValuePtr &nbits) ROSE_OVERRIDE;
444  virtual BaseSemantics::SValuePtr rotateRight(const BaseSemantics::SValuePtr &a,
445  const BaseSemantics::SValuePtr &nbits) ROSE_OVERRIDE;
446  virtual BaseSemantics::SValuePtr shiftLeft(const BaseSemantics::SValuePtr &a,
447  const BaseSemantics::SValuePtr &nbits) ROSE_OVERRIDE;
448  virtual BaseSemantics::SValuePtr shiftRight(const BaseSemantics::SValuePtr &a,
449  const BaseSemantics::SValuePtr &nbits) ROSE_OVERRIDE;
450  virtual BaseSemantics::SValuePtr shiftRightArithmetic(const BaseSemantics::SValuePtr &a,
451  const BaseSemantics::SValuePtr &nbits) ROSE_OVERRIDE;
452  virtual BaseSemantics::SValuePtr equalToZero(const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE;
453  virtual BaseSemantics::SValuePtr ite(const BaseSemantics::SValuePtr &cond, const BaseSemantics::SValuePtr &a,
454  const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
455  virtual BaseSemantics::SValuePtr unsignedExtend(const BaseSemantics::SValuePtr &a, size_t new_width) ROSE_OVERRIDE;
456  virtual BaseSemantics::SValuePtr signExtend(const BaseSemantics::SValuePtr &a, size_t new_width) ROSE_OVERRIDE;
457  virtual BaseSemantics::SValuePtr add(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
458  virtual BaseSemantics::SValuePtr addWithCarries(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b,
459  const BaseSemantics::SValuePtr &c,
460  BaseSemantics::SValuePtr &carry_out/*output*/) ROSE_OVERRIDE;
461  virtual BaseSemantics::SValuePtr negate(const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE;
462  virtual BaseSemantics::SValuePtr signedDivide(const BaseSemantics::SValuePtr &a,
463  const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
464  virtual BaseSemantics::SValuePtr signedModulo(const BaseSemantics::SValuePtr &a,
465  const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
466  virtual BaseSemantics::SValuePtr signedMultiply(const BaseSemantics::SValuePtr &a,
467  const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
468  virtual BaseSemantics::SValuePtr unsignedDivide(const BaseSemantics::SValuePtr &a,
469  const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
470  virtual BaseSemantics::SValuePtr unsignedModulo(const BaseSemantics::SValuePtr &a,
471  const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
472  virtual BaseSemantics::SValuePtr unsignedMultiply(const BaseSemantics::SValuePtr &a,
473  const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE;
474  virtual BaseSemantics::SValuePtr fpFromInteger(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
475  virtual BaseSemantics::SValuePtr fpToInteger(const BaseSemantics::SValuePtr&, SgAsmFloatType*,
476  const BaseSemantics::SValuePtr&) ROSE_OVERRIDE;
477  virtual BaseSemantics::SValuePtr fpConvert(const BaseSemantics::SValuePtr&, SgAsmFloatType*, SgAsmFloatType*) ROSE_OVERRIDE;
478  virtual BaseSemantics::SValuePtr fpIsNan(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
479  virtual BaseSemantics::SValuePtr fpIsDenormalized(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
480  virtual BaseSemantics::SValuePtr fpIsZero(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
481  virtual BaseSemantics::SValuePtr fpIsInfinity(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
482  virtual BaseSemantics::SValuePtr fpSign(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
483  virtual BaseSemantics::SValuePtr fpEffectiveExponent(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
484  virtual BaseSemantics::SValuePtr fpAdd(const BaseSemantics::SValuePtr&, const BaseSemantics::SValuePtr&,
485  SgAsmFloatType*) ROSE_OVERRIDE;
486  virtual BaseSemantics::SValuePtr fpSubtract(const BaseSemantics::SValuePtr&, const BaseSemantics::SValuePtr&,
487  SgAsmFloatType*) ROSE_OVERRIDE;
488  virtual BaseSemantics::SValuePtr fpMultiply(const BaseSemantics::SValuePtr&, const BaseSemantics::SValuePtr&,
489  SgAsmFloatType*) ROSE_OVERRIDE;
490  virtual BaseSemantics::SValuePtr fpDivide(const BaseSemantics::SValuePtr&, const BaseSemantics::SValuePtr&,
491  SgAsmFloatType*) ROSE_OVERRIDE;
492  virtual BaseSemantics::SValuePtr fpSquareRoot(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
493  virtual BaseSemantics::SValuePtr fpRoundTowardZero(const BaseSemantics::SValuePtr&, SgAsmFloatType*) ROSE_OVERRIDE;
494  virtual BaseSemantics::SValuePtr reinterpret(const BaseSemantics::SValuePtr&, SgAsmType*) ROSE_OVERRIDE;
495  virtual BaseSemantics::SValuePtr readRegister(RegisterDescriptor reg,
496  const BaseSemantics::SValuePtr &dflt) ROSE_OVERRIDE;
497  virtual BaseSemantics::SValuePtr peekRegister(RegisterDescriptor reg,
498  const BaseSemantics::SValuePtr &dflt) ROSE_OVERRIDE;
499  virtual void writeRegister(RegisterDescriptor reg, const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE;
500  virtual BaseSemantics::SValuePtr readMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr,
501  const BaseSemantics::SValuePtr &dflt,
502  const BaseSemantics::SValuePtr &cond) ROSE_OVERRIDE;
503  virtual BaseSemantics::SValuePtr peekMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr,
504  const BaseSemantics::SValuePtr &dflt) ROSE_OVERRIDE;
505  virtual void writeMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr,
506  const BaseSemantics::SValuePtr &data, const BaseSemantics::SValuePtr &cond) ROSE_OVERRIDE;
507 };
508 
509 } // namespace
510 } // namespace
511 } // namespace
512 } // namespace
513 
514 #endif
515 #endif
virtual BaseSemantics::SValuePtr fpSign(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Sign of floating-point value.
BaseSemantics::RiscOperatorsPtr operator->() const
Return the subdomain for the current cursor position.
boost::shared_ptr< RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to a RISC operators object.
boost::shared_ptr< void > MemoryStatePtr
Shared-ownership pointer to a multi-semantics memory state.
boost::shared_ptr< void > StatePtr
Shared-ownership pointer to a multi-semantics state.
virtual BaseSemantics::RiscOperatorsPtr create(const BaseSemantics::StatePtr &state, const SmtSolverPtr &solver=SmtSolverPtr()) const ROSE_OVERRIDE
Virtual allocating constructor.
virtual BaseSemantics::RiscOperatorsPtr create(const BaseSemantics::SValuePtr &protoval, const SmtSolverPtr &solver=SmtSolverPtr()) const ROSE_OVERRIDE
Virtual allocating constructor.
static SValuePtr instance()
Construct a prototypical value.
virtual SValuePtr svalue_empty(size_t nbits)
Convenience function for SValue::create_empty().
virtual BaseSemantics::SValuePtr fpIsZero(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Whether a floating-point value is equal to zero.
virtual BaseSemantics::SValuePtr reinterpret(const BaseSemantics::SValuePtr &, SgAsmType *) ROSE_OVERRIDE
Reinterpret an expression as a different type.
virtual BaseSemantics::SValuePtr negate(const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE
Two's complement.
virtual BaseSemantics::SValuePtr addWithCarries(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b, const BaseSemantics::SValuePtr &c, BaseSemantics::SValuePtr &carry_out) ROSE_OVERRIDE
Used for printing RISC operators with formatting.
virtual bool isBottom() const ROSE_OVERRIDE
Determines whether a value is a data-flow bottom.
virtual Formatter & get_formatter()
Returns a formatter containing the names of the subdomains.
virtual bool may_equal(const BaseSemantics::SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const ROSE_OVERRIDE
Determines if two multidomain values might be equal.
Base class for machine instructions.
virtual bool is_active(size_t idx) const
Returns true if a subdomain is active.
virtual BaseSemantics::SValuePtr fpIsInfinity(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Whether a floating-point value is infinity.
virtual BaseSemantics::SValuePtr fpAdd(const BaseSemantics::SValuePtr &, const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Add two floating-point values.
boost::shared_ptr< State > StatePtr
Shared-ownership pointer to a semantic state.
static RiscOperatorsPtr instance(const RegisterDictionary *regdict)
Static allocating constructor.
virtual BaseSemantics::SValuePtr fpConvert(const BaseSemantics::SValuePtr &, SgAsmFloatType *, SgAsmFloatType *) ROSE_OVERRIDE
Convert from one floating-point type to another.
virtual BaseSemantics::SValuePtr fpIsDenormalized(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Whether a floating-point value is denormalized.
STL namespace.
Holds a value or nothing.
Definition: Optional.h:49
virtual SValuePtr protoval() const
Property: Prototypical semantic value.
Helps printing multidomain values by allowing the user to specify a name for each subdomain...
virtual bool is_number() const ROSE_OVERRIDE
Determines if the value is a concrete number.
Main namespace for the ROSE library.
virtual BaseSemantics::SValuePtr fpToInteger(const BaseSemantics::SValuePtr &, SgAsmFloatType *, const BaseSemantics::SValuePtr &) ROSE_OVERRIDE
Construct an integer value from a floating-point value.
virtual bool must_equal(const BaseSemantics::SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const ROSE_OVERRIDE
Determines if two multidomain values must be equal.
boost::shared_ptr< class RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to multi-semantics RISC operators.
virtual BaseSemantics::SValuePtr fpSubtract(const BaseSemantics::SValuePtr &, const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Subtract one floating-point value from another.
virtual BaseSemantics::SValuePtr readRegister(RegisterDescriptor reg, const BaseSemantics::SValuePtr &dflt) ROSE_OVERRIDE
Reads a value from a register.
Defines RISC operators for the MultiSemantics domain.
virtual BaseSemantics::SValuePtr signedDivide(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE
Divides two signed values.
virtual BaseSemantics::SValuePtr peekMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &dflt) ROSE_OVERRIDE
Read memory without side effects.
Reference-counting intrusive smart pointer.
Definition: SharedPointer.h:68
virtual void clear_active(size_t idx)
Makes a subdomain inactive.
virtual Sawyer::Optional< BaseSemantics::SValuePtr > createOptionalMerge(const BaseSemantics::SValuePtr &other, const BaseSemantics::MergerPtr &, const SmtSolverPtr &) const ROSE_OVERRIDE
Possibly create a new value by merging two existing values.
BaseSemantics::RiscOperatorsPtr operator*() const
Return the subdomain for the current cursor position.
virtual BaseSemantics::SValuePtr fpMultiply(const BaseSemantics::SValuePtr &, const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Multiply two floating-point values.
virtual void before(size_t idx)
Called before each subdomain RISC operation.
virtual uint64_t get_number() const ROSE_OVERRIDE
Virtual API.
static SValuePtr promote(const BaseSemantics::SValuePtr &v)
Promote a base value to a MultiSemantics value.
virtual void writeMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &data, const BaseSemantics::SValuePtr &cond) ROSE_OVERRIDE
Writes a value to memory.
virtual void set_active(size_t idx, bool status)
Makes a subdomain active or inactive.
Describes (part of) a physical CPU register.
virtual BaseSemantics::SValuePtr copy(size_t new_width=0) const ROSE_OVERRIDE
Create a new value from an existing value, changing the width if new_width is non-zero.
virtual void set_subvalue(size_t idx, const BaseSemantics::SValuePtr &value)
Insert a subdomain value.
BaseSemantics::SValuePtr operator()(const BaseSemantics::SValuePtr &) const
Returns subdomain value of its multidomain argument.
virtual bool is_valid(size_t idx) const
Returns true if a subdomain value is valid.
Sawyer::SharedPointer< class SValue > SValuePtr
Shared-ownership pointer to a multi-semantic value.
virtual void after(size_t idx)
Called after each subdomain RISC operation.
virtual BaseSemantics::SValuePtr peekRegister(RegisterDescriptor reg, const BaseSemantics::SValuePtr &dflt) ROSE_OVERRIDE
Obtain a register value without side effects.
virtual size_t add_subdomain(const BaseSemantics::RiscOperatorsPtr &subdomain, const std::string &name, bool activate=true)
Add a subdomain to this MultiSemantics domain.
boost::shared_ptr< void > RegisterStatePtr
Shared-ownership pointer to a multi-semantics register state.
virtual void invalidate(size_t idx)
Removes a subdomain value and marks it as invalid.
virtual BaseSemantics::RiscOperatorsPtr get_subdomain(size_t idx) const
Returns the RiscOperators for a subdomain.
virtual BaseSemantics::SValuePtr fpIsNan(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Whether a floating-point value is a special not-a-number bit pattern.
virtual BaseSemantics::SValuePtr fpRoundTowardZero(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Round toward zero.
virtual void writeRegister(RegisterDescriptor reg, const BaseSemantics::SValuePtr &a) ROSE_OVERRIDE
Writes a value to a register.
SharedPointer< U > dynamicCast() const
Dynamic cast.
Base class for most instruction semantics RISC operators.
virtual size_t nsubdomains() const
Returns the number of subdomains added to this MultiDomain.
virtual BaseSemantics::SValuePtr bottom_(size_t nbits) const ROSE_OVERRIDE
Data-flow bottom value.
virtual BaseSemantics::SValuePtr unspecified_(size_t nbits) const ROSE_OVERRIDE
Create a new unspecified MultiSemantics value.
virtual BaseSemantics::SValuePtr unsignedDivide(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE
Divides two unsigned values.
virtual BaseSemantics::SValuePtr fpFromInteger(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Construct a floating-point value from an integer value.
static Inputs inputs(const BaseSemantics::SValuePtr &arg1=BaseSemantics::SValuePtr(), const BaseSemantics::SValuePtr &arg2=BaseSemantics::SValuePtr(), const BaseSemantics::SValuePtr &arg3=BaseSemantics::SValuePtr())
Class method to construct the array of inputs from a variable number of arguments.
virtual void set_width(size_t nbits) ROSE_OVERRIDE
Virtual API.
Base class for binary types.
virtual BaseSemantics::SValuePtr undefined_(size_t nbits) const ROSE_OVERRIDE
Create a new undefined MultiSemantics value.
virtual BaseSemantics::SValuePtr readMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &dflt, const BaseSemantics::SValuePtr &cond) ROSE_OVERRIDE
Reads a value from memory.
Sawyer::SharedPointer< SValue > SValuePtr
Shared-ownership pointer to a semantic value in any domain.
virtual void hash(Combinatorics::Hasher &) const override
Hash this semantic value.
Type of values manipulated by the MultiSemantics domain.
virtual BaseSemantics::SValuePtr get_subvalue(size_t idx) const
Return a subdomain value.
virtual BaseSemantics::SValuePtr signedModulo(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE
Calculates modulo with signed values.
virtual void print(std::ostream &o, BaseSemantics::Formatter &) const ROSE_OVERRIDE
Print multi-line output for this object.
Defines registers available for a particular architecture.
Definition: Registers.h:38
virtual SmtSolverPtr solver() const
Property: Satisfiability module theory (SMT) solver.
virtual BaseSemantics::SValuePtr unsignedMultiply(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE
Multiply two unsigned values.
virtual const std::string & name() const
Property: Name used for debugging.
virtual BaseSemantics::SValuePtr fpSquareRoot(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Square root.
virtual BaseSemantics::SValuePtr fpEffectiveExponent(const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Exponent of floating-point value.
virtual BaseSemantics::SValuePtr number_(size_t nbits, uint64_t number) const ROSE_OVERRIDE
Create a MultiSemantics value holding a concrete value.
virtual SValuePtr create_empty(size_t nbits) const
Create a new MultiSemantics value with no valid subvalues.
Floating point types.
virtual BaseSemantics::SValuePtr fpDivide(const BaseSemantics::SValuePtr &, const BaseSemantics::SValuePtr &, SgAsmFloatType *) ROSE_OVERRIDE
Divide one floating-point value by another.
virtual BaseSemantics::SValuePtr signedMultiply(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE
Multiplies two signed values.
size_t idx() const
Return the subdomain index for the current cursor position.
bool at_end() const
Returns true when the cursor has gone past the last valid subdomain.
virtual BaseSemantics::SValuePtr unsignedModulo(const BaseSemantics::SValuePtr &a, const BaseSemantics::SValuePtr &b) ROSE_OVERRIDE
Calculates modulo with unsigned values.
std::shared_ptr< class SmtSolver > SmtSolverPtr
Reference-counting pointer for SMT solvers.
virtual void print(std::ostream &, BaseSemantics::Formatter &) const ROSE_OVERRIDE
Print a value to a stream using default format.