1#ifndef ROSE_BinaryAnalysis_InstructionSemantics_NullSemantics_H
2#define ROSE_BinaryAnalysis_InstructionSemantics_NullSemantics_H
3#include <featureTests.h>
4#ifdef ROSE_ENABLE_BINARY_ANALYSIS
6#include <Rose/BinaryAnalysis/BasicTypes.h>
7#include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics.h>
10namespace BinaryAnalysis {
11namespace InstructionSemantics {
18namespace NullSemantics {
81 if (new_width!=0 && new_width!=retval->nBits())
82 retval->set_width(new_width);
96 ASSERT_not_null(retval);
108 stream <<
"VOID[" <<
nBits() <<
"]";
127 ASSERT_not_reachable(
"not a number");
139 return this == getRawPointer(other);
186 ASSERT_not_null(retval);
195 virtual void zero()
override {}
245 return MemoryStatePtr(
new MemoryState(addrProtoval, valProtoval));
251 return instance(addrProtoval, valProtoval);
260 MemoryStatePtr retval = boost::dynamic_pointer_cast<MemoryState>(x);
367 size_t begin_bit,
size_t end_bit)
override;
Represents all memory in the state.
The set of all registers and their values.
SValuePtr protoval() const
Return the protoval.
RegisterDictionaryPtr regdict
Registers that are able to be stored by this state.
Base class for most instruction semantics RISC operators.
virtual SmtSolverPtr solver() const
Property: Satisfiability module theory (SMT) solver.
virtual SValuePtr protoval() const
Property: Prototypical semantic value.
IteStatus
Status for iteWithStatus operation.
Base class for semantic values.
size_t nBits() const
Property: value width.
Base class for semantics machine states.
virtual BaseSemantics::MemoryStatePtr create(const BaseSemantics::SValuePtr &addrProtoval, const BaseSemantics::SValuePtr &valProtoval) const override
Virtual allocating constructor.
virtual bool merge(const BaseSemantics::MemoryStatePtr &, BaseSemantics::RiscOperators *, BaseSemantics::RiscOperators *) override
Merge memory states for data flow analysis.
virtual BaseSemantics::SValuePtr peekMemory(const BaseSemantics::SValuePtr &, const BaseSemantics::SValuePtr &dflt, BaseSemantics::RiscOperators *, BaseSemantics::RiscOperators *) override
Read a value from memory without side effects.
virtual BaseSemantics::MemoryStatePtr clone() const override
Virtual allocating copy constructor.
virtual void print(std::ostream &, BaseSemantics::Formatter &) const override
Print a memory state to more than one line of output.
virtual void clear() override
Clear memory.
virtual void writeMemory(const BaseSemantics::SValuePtr &, const BaseSemantics::SValuePtr &, BaseSemantics::RiscOperators *, BaseSemantics::RiscOperators *) override
Write a value to memory.
MemoryStatePtr Ptr
Shared-ownership pointer.
virtual void hash(Combinatorics::Hasher &, BaseSemantics::RiscOperators *, BaseSemantics::RiscOperators *) const override
Calculate a hash for this memory state.
virtual BaseSemantics::SValuePtr readMemory(const BaseSemantics::SValuePtr &, const BaseSemantics::SValuePtr &dflt, BaseSemantics::RiscOperators *, BaseSemantics::RiscOperators *) override
Read a value from memory.
virtual void hash(Combinatorics::Hasher &, BaseSemantics::RiscOperators *) const override
Hash the register state.
virtual BaseSemantics::SValuePtr readRegister(RegisterDescriptor reg, const BaseSemantics::SValuePtr &, BaseSemantics::RiscOperators *) override
Read a value from a register.
virtual void updateReadProperties(RegisterDescriptor) override
Update register properties after reading a register.
virtual void print(std::ostream &, BaseSemantics::Formatter &) const override
Print the register contents.
virtual void zero() override
Set all registers to the zero.
virtual void clear() override
Removes stored values from the register state.
virtual void updateWriteProperties(RegisterDescriptor, BaseSemantics::InputOutputProperty) override
Update register properties after writing to a register.
virtual BaseSemantics::SValuePtr peekRegister(RegisterDescriptor reg, const BaseSemantics::SValuePtr &, BaseSemantics::RiscOperators *) override
Read a register without side effects.
virtual BaseSemantics::RegisterStatePtr clone() const override
Make a copy of this register state.
RegisterStatePtr Ptr
Shared-ownership pointer.
virtual void writeRegister(RegisterDescriptor, const BaseSemantics::SValuePtr &, BaseSemantics::RiscOperators *) override
Write a value to a register.
virtual BaseSemantics::RegisterStatePtr create(const BaseSemantics::SValuePtr &protoval, const RegisterDictionaryPtr ®dict) const override
Virtual constructor.
virtual bool merge(const BaseSemantics::RegisterStatePtr &, BaseSemantics::RiscOperators *) override
Merge register states for data flow analysis.
NullSemantics operators always return a new undefined value.
virtual BaseSemantics::SValuePtr unsignedModulo(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Calculates modulo with unsigned values.
virtual BaseSemantics::SValuePtr rotateRight(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &sa_) override
Rotate bits to the right.
virtual BaseSemantics::SValuePtr iteWithStatus(const BaseSemantics::SValuePtr &sel_, const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_, IteStatus &) override
If-then-else with status.
virtual BaseSemantics::SValuePtr unsignedDivide(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Divides two unsigned values.
virtual BaseSemantics::SValuePtr signedModulo(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Calculates modulo with signed values.
virtual BaseSemantics::SValuePtr readMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &dflt, const BaseSemantics::SValuePtr &cond) override
Reads a value from memory.
virtual BaseSemantics::SValuePtr leastSignificantSetBit(const BaseSemantics::SValuePtr &a_) override
Returns position of least significant set bit; zero when no bits are set.
virtual BaseSemantics::SValuePtr shiftRightArithmetic(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &sa_) override
Returns arg shifted right arithmetically (with sign bit).
RiscOperatorsPtr Ptr
Shared-ownership pointer.
virtual BaseSemantics::SValuePtr invert(const BaseSemantics::SValuePtr &a_) override
One's complement.
virtual BaseSemantics::SValuePtr xor_(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Computes bit-wise XOR of two values.
virtual BaseSemantics::SValuePtr rotateLeft(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &sa_) override
Rotate bits to the left.
virtual BaseSemantics::SValuePtr and_(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Computes bit-wise AND of two values.
virtual BaseSemantics::RiscOperatorsPtr create(const BaseSemantics::SValuePtr &protoval, const SmtSolverPtr &solver=SmtSolverPtr()) const override
Virtual allocating constructor.
virtual BaseSemantics::SValuePtr concat(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Concatenates the bits of two values.
virtual BaseSemantics::SValuePtr shiftRight(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &sa_) override
Returns arg shifted right logically (no sign bit).
virtual BaseSemantics::SValuePtr unsignedMultiply(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Multiply two unsigned values.
virtual BaseSemantics::SValuePtr signedDivide(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Divides two signed values.
static RiscOperatorsPtr instanceFromRegisters(const RegisterDictionaryPtr ®dict)
Instantiate a new RiscOperators object and configures it to use semantic values and states that are d...
virtual void writeMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &data, const BaseSemantics::SValuePtr &cond) override
Writes a value to memory.
virtual BaseSemantics::SValuePtr signExtend(const BaseSemantics::SValuePtr &a_, size_t new_width) override
Sign extends a value.
virtual BaseSemantics::SValuePtr add(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Adds two integers of equal size.
virtual BaseSemantics::SValuePtr mostSignificantSetBit(const BaseSemantics::SValuePtr &a_) override
Returns position of most significant set bit; zero when no bits are set.
virtual BaseSemantics::SValuePtr equalToZero(const BaseSemantics::SValuePtr &a_) override
Determines whether a value is equal to zero.
virtual BaseSemantics::SValuePtr addWithCarries(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_, const BaseSemantics::SValuePtr &c_, BaseSemantics::SValuePtr &carry_out) override
Add two values of equal size and a carry bit.
static RiscOperatorsPtr instanceFromProtoval(const BaseSemantics::SValuePtr &protoval, const SmtSolverPtr &solver=SmtSolverPtr())
Static allocating constructor.
virtual BaseSemantics::SValuePtr peekMemory(RegisterDescriptor segreg, const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &dflt) override
Read memory without side effects.
virtual BaseSemantics::SValuePtr extract(const BaseSemantics::SValuePtr &a_, size_t begin_bit, size_t end_bit) override
Extracts bits from a value.
static RiscOperatorsPtr instanceFromState(const BaseSemantics::StatePtr &, const SmtSolverPtr &solver=SmtSolverPtr())
Constructor.
virtual BaseSemantics::SValuePtr or_(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Computes bit-wise OR of two values.
virtual BaseSemantics::SValuePtr signedMultiply(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) override
Multiplies two signed values.
virtual BaseSemantics::RiscOperatorsPtr create(const BaseSemantics::StatePtr &, const SmtSolverPtr &solver=SmtSolverPtr()) const override
Virtual allocating constructor.
virtual BaseSemantics::SValuePtr negate(const BaseSemantics::SValuePtr &a_) override
Two's complement.
virtual BaseSemantics::SValuePtr shiftLeft(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &sa_) override
Returns arg shifted left.
Values in the NullSemantics domain.
virtual bool may_equal(const BaseSemantics::SValuePtr &, const SmtSolverPtr &=SmtSolverPtr()) const override
Virtual API.
virtual bool is_number() const override
Virtual API.
virtual BaseSemantics::SValuePtr undefined_(size_t nBits) const override
Create a new undefined semantic value.
virtual Sawyer::Optional< BaseSemantics::SValuePtr > createOptionalMerge(const BaseSemantics::SValuePtr &, const BaseSemantics::MergerPtr &, const SmtSolverPtr &) const override
Possibly create a new value by merging two existing values.
virtual BaseSemantics::SValuePtr unspecified_(size_t nBits) const override
Create a new unspecified semantic value.
static SValuePtr instance(const SValuePtr &other)
Instantiate a new copy of an existing value.
virtual void print(std::ostream &stream, BaseSemantics::Formatter &) const override
Print a value to a stream using default format.
virtual BaseSemantics::SValuePtr copy(size_t new_width=0) const override
Create a new value from an existing value, changing the width if new_width is non-zero.
static SValuePtr instance(size_t nbits, uint64_t)
Instantiate a new concrete value.
virtual bool must_equal(const BaseSemantics::SValuePtr &other, const SmtSolverPtr &=SmtSolverPtr()) const override
Virtual API.
virtual uint64_t get_number() const override
Virtual API.
static SValuePtr promote(const BaseSemantics::SValuePtr &v)
Promote a base value to a NullSemantics value.
virtual bool isBottom() const override
Determines whether a value is a data-flow bottom.
static SValuePtr instance()
Instantiate a new prototypical values.
virtual BaseSemantics::SValuePtr bottom_(size_t nBits) const override
Data-flow bottom value.
virtual void hash(Combinatorics::Hasher &hasher) const override
Hash this semantic value.
static SValuePtr instance(size_t nbits)
Instantiate a new undefined value.
virtual BaseSemantics::SValuePtr number_(size_t nBits, uint64_t number) const override
Create a new concrete semantic value.
Describes (part of) a physical CPU register.
size_t nBits() const
Property: Size in bits.
void insert(const std::string &x)
Insert data into the digest.
Holds a value or nothing.
Reference-counting intrusive smart pointer.
SharedPointer< U > dynamicCast() const
Dynamic cast.
Base classes for instruction semantics.
boost::shared_ptr< RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to a RISC operators object.
boost::shared_ptr< MemoryState > MemoryStatePtr
Shared-ownership pointer to a memory state.
InputOutputProperty
Boolean properties related to I/O.
boost::shared_ptr< State > StatePtr
Shared-ownership pointer to a semantic state.
boost::shared_ptr< RegisterState > RegisterStatePtr
Shared-ownership pointer to a register state.
boost::shared_ptr< class RegisterState > RegisterStatePtr
Shared-ownership pointer.
boost::shared_ptr< class RiscOperators > RiscOperatorsPtr
Shared-ownership pointer.
boost::shared_ptr< class MemoryState > MemoryStatePtr
Shared-ownership pointer.
Sawyer::SharedPointer< class SValue > SValuePtr
Shared-ownership pointer.
std::shared_ptr< SmtSolver > SmtSolverPtr
Reference counting pointer.