ROSE 0.11.145.147
RegisterState.h
1#ifndef ROSE_BinaryAnalysis_InstructionSemantics_BaseSemantics_RegisterState_H
2#define ROSE_BinaryAnalysis_InstructionSemantics_BaseSemantics_RegisterState_H
3#include <featureTests.h>
4#ifdef ROSE_ENABLE_BINARY_ANALYSIS
5
6#include <Rose/BinaryAnalysis/BasicTypes.h>
7#include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/Merger.h>
8#include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/SValue.h>
9#include <Rose/BinaryAnalysis/RegisterDictionary.h>
10
11#include <boost/enable_shared_from_this.hpp>
12#include <boost/serialization/access.hpp>
13#include <boost/serialization/export.hpp>
14#include <boost/serialization/nvp.hpp>
15#include <boost/serialization/shared_ptr.hpp>
16#include <boost/serialization/version.hpp>
17
18namespace Rose {
19namespace BinaryAnalysis {
20namespace InstructionSemantics {
21namespace BaseSemantics {
22
24// Register States
26
30class RegisterState: public boost::enable_shared_from_this<RegisterState> {
31public:
34
35private:
36 MergerPtr merger_;
37 SValuePtr protoval_;
39protected:
43 // Serialization
44#ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
45private:
46 friend class boost::serialization::access;
47
48 template<class S>
49 void serialize(S &s, const unsigned version) {
50 //s & merger_; -- not saved
51 s & BOOST_SERIALIZATION_NVP(protoval_);
52 if (version >= 1)
53 s & BOOST_SERIALIZATION_NVP(regdict);
54 }
55#endif
56
57
59 // Real constructors
60protected:
61 RegisterState(); // for serialization
62
64
65public:
66 virtual ~RegisterState();
67
69 // Static allocating constructors. None are needed--this class is abstract.
70
71
73 // Virtual constructors.
74public:
80
82 virtual RegisterStatePtr clone() const = 0;
83
85 // Dynamic pointer casts. No-op since this is the base class.
86public:
87 static RegisterStatePtr promote(const RegisterStatePtr&);
88
89public:
91 // The rest of the API...
92
101 MergerPtr merger() const { return merger_; }
102 void merger(const MergerPtr &m) { merger_ = m; }
106 SValuePtr protoval() const { return protoval_; }
107
128 virtual void clear() = 0;
129
131 virtual void zero() = 0;
132
136 virtual bool merge(const RegisterStatePtr &other, RiscOperators *ops) = 0;
137
152
157
164
171 virtual void writeRegister(RegisterDescriptor reg, const SValuePtr &value, RiscOperators *ops) = 0;
172
178
182 virtual void hash(Combinatorics::Hasher&, RiscOperators*) const = 0;
183
186 void print(std::ostream &stream, const std::string prefix = "") const;
187 virtual void print(std::ostream&, Formatter&) const = 0;
193 Formatter &fmt;
194 public:
195 WithFormatter(const RegisterStatePtr &obj, Formatter &fmt): obj(obj), fmt(fmt) {}
196 void print(std::ostream &stream) const { obj->print(stream, fmt); }
197 };
198
214 WithFormatter with_format(Formatter &fmt) { return WithFormatter(shared_from_this(), fmt); }
216 WithFormatter operator+(const std::string &linePrefix);
219};
220
221std::ostream& operator<<(std::ostream&, const RegisterState&);
222std::ostream& operator<<(std::ostream&, const RegisterState::WithFormatter&);
223
224} // namespace
225} // namespace
226} // namespace
227} // namespace
228
231
232#endif
233#endif
virtual void updateWriteProperties(RegisterDescriptor, InputOutputProperty)=0
Update register properties after writing to a register.
WithFormatter operator+(const std::string &linePrefix)
Used for printing register states with formatting.
virtual SValuePtr peekRegister(RegisterDescriptor reg, const SValuePtr &dflt, RiscOperators *ops)=0
Read a register without side effects.
RegisterDictionaryPtr registerDictionary() const
Property: Register dictionary.
virtual void writeRegister(RegisterDescriptor reg, const SValuePtr &value, RiscOperators *ops)=0
Write a value to a register.
virtual RegisterStatePtr clone() const =0
Make a copy of this register state.
WithFormatter with_format(Formatter &fmt)
Used for printing register states with formatting.
WithFormatter operator+(Formatter &fmt)
Used for printing register states with formatting.
virtual void updateReadProperties(RegisterDescriptor)=0
Update register properties after reading a register.
virtual RegisterStatePtr create(const SValuePtr &protoval, const RegisterDictionaryPtr &regdict) const =0
Virtual constructor.
virtual SValuePtr readRegister(RegisterDescriptor reg, const SValuePtr &dflt, RiscOperators *ops)=0
Read a value from a register.
virtual bool merge(const RegisterStatePtr &other, RiscOperators *ops)=0
Merge register states for data flow analysis.
virtual void clear()=0
Removes stored values from the register state.
void print(std::ostream &stream, const std::string prefix="") const
Print the register contents.
RegisterDictionaryPtr regdict
Registers that are able to be stored by this state.
Base class for most instruction semantics RISC operators.
Describes (part of) a physical CPU register.
boost::shared_ptr< RegisterState > RegisterStatePtr
Shared-ownership pointer to a register state.
The ROSE library.