forked from HPCL/MemoryEvaluation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMiraSemantics.h
185 lines (141 loc) · 6.25 KB
/
MiraSemantics.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#ifndef MIRASEMANTICS_H
#define MIRASEMANTICS_H
#include "ConcreteSemantics2.h"
#include <iostream>
using namespace std;
namespace rose {
namespace BinaryAnalysis {
namespace InstructionSemantics2 {
namespace ConcreteSemantics {
// derive SValue may not be necessary at this time
typedef Sawyer::SharedPointer<class MiraSValue> MiraSValuePtr;
class MiraSValue : public ConcreteSemantics::SValue {
protected:
explicit MiraSValue(size_t nbits) : ConcreteSemantics::SValue(nbits) {}
MiraSValue(size_t nbits, uint64_t number) : ConcreteSemantics::SValue(nbits, number) {}
public:
static MiraSValuePtr instance() {
return MiraSValuePtr(new MiraSValue(1));
}
static MiraSValuePtr instance(size_t nbits) {
return MiraSValuePtr(new MiraSValue(nbits));
}
static MiraSValuePtr instance(size_t nbits, uint64_t value) {
return MiraSValuePtr(new MiraSValue(nbits, value));
}
// virtual allocating constructor
public:
virtual BaseSemantics::SValuePtr undefined_(size_t nbits) const ROSE_OVERRIDE {
return instance(nbits);
}
virtual BaseSemantics::SValuePtr unspecified_(size_t nbits) const ROSE_OVERRIDE {
return instance(nbits);
}
virtual BaseSemantics::SValuePtr bottom_(size_t nbits) const ROSE_OVERRIDE {
return instance(nbits);
}
virtual BaseSemantics::SValuePtr number_(size_t nbits, uint64_t value) const ROSE_OVERRIDE {
return instance(nbits, value);
}
virtual BaseSemantics::SValuePtr boolean_(bool value) const ROSE_OVERRIDE {
return instance(1, value ? 1 : 0);
}
virtual BaseSemantics::SValuePtr copy(size_t new_width=0) const ROSE_OVERRIDE {
SValuePtr retval(new SValue(*this));
if (new_width!=0 && new_width!=retval->get_width())
retval->set_width(new_width);
return retval;
}
virtual Sawyer::Optional<BaseSemantics::SValuePtr> createOptionalMerge(const BaseSemantics::SValuePtr &other,
const BaseSemantics::MergerPtr&, SMTSolver*) const ROSE_OVERRIDE {
throw BaseSemantics::NotImplemented("SValue merging for ConcreteSemantics is not supported", NULL);
}
public:
// dynamic cast
static MiraSValuePtr promote(const BaseSemantics::SValuePtr &v) {
MiraSValuePtr retval = v.dynamicCast<MiraSValue>();
ASSERT_not_null(retval);
return retval;
}
};
// smart pointer
typedef boost::shared_ptr<class MiraMemoryState> MiraMemoryStatePtr;
// MiraMemoryState inherit from ConcreteSemantics::MemoryState
class MiraMemoryState: public ConcreteSemantics::MemoryState {
protected:
MiraMemoryState(const MiraMemoryState &other)
: ConcreteSemantics::MemoryState(other) {}
explicit MiraMemoryState(const BaseSemantics::SValuePtr &addrProtoval, const BaseSemantics::SValuePtr &valProtoval)
: ConcreteSemantics::MemoryState(addrProtoval, valProtoval) {}
// static allocating constructors
public:
static MiraMemoryStatePtr instance(const MiraMemoryStatePtr &other) {
return MiraMemoryStatePtr(new MiraMemoryState(*other));
}
static MiraMemoryStatePtr instance(const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &val) {
return MiraMemoryStatePtr(new MiraMemoryState(addr, val));
}
// virtual constructors
public:
virtual BaseSemantics::MemoryStatePtr clone() const ROSE_OVERRIDE {
return MiraMemoryStatePtr(new MiraMemoryState(*this));
}
virtual BaseSemantics::MemoryStatePtr create(const BaseSemantics::SValuePtr &addr, const BaseSemantics::SValuePtr &val) const ROSE_OVERRIDE {
return instance(addr, val);
}
// check dynamic casts
public:
static MiraMemoryStatePtr promote(const BaseSemantics::MemoryStatePtr &x) {
MiraMemoryStatePtr retval = boost::dynamic_pointer_cast<MiraMemoryState>(x);
assert(retval!=NULL);
return retval;
}
}; // end class MiraMemoryState
// MiraRiscOperators
typedef boost::shared_ptr<class MiraRiscOperators> MiraRiscOperatorsPtr;
class MiraRiscOperators : public ConcreteSemantics::RiscOperators {
protected:
MiraRiscOperators(const BaseSemantics::SValuePtr &protoval, SMTSolver *solver)
: ConcreteSemantics::RiscOperators(protoval, solver) {}
MiraRiscOperators(const BaseSemantics::StatePtr &state, SMTSolver *solver)
: ConcreteSemantics::RiscOperators(state, solver) {}
// static allocating constructor
public:
static MiraRiscOperatorsPtr instance(const RegisterDictionary *regdict, SMTSolver *solver=NULL) {
BaseSemantics::SValuePtr protoval = MiraSValue::instance();
BaseSemantics::RegisterStatePtr registers = BaseSemantics::RegisterStateGeneric::instance(protoval, regdict);
BaseSemantics::MemoryStatePtr memory = MiraMemoryState::instance(protoval, protoval);
BaseSemantics::StatePtr state = BaseSemantics::State::instance(registers, memory);
return MiraRiscOperatorsPtr(new MiraRiscOperators(state, solver));
}
static MiraRiscOperatorsPtr instance(const BaseSemantics::SValuePtr &protoval, SMTSolver *solver=NULL) {
return MiraRiscOperatorsPtr(new MiraRiscOperators(protoval, solver));
}
static MiraRiscOperatorsPtr instance(const BaseSemantics::StatePtr &state, SMTSolver *solver=NULL) {
return MiraRiscOperatorsPtr(new MiraRiscOperators(state, solver));
}
// virtual constructor
public:
virtual BaseSemantics::RiscOperatorsPtr create(const BaseSemantics::SValuePtr &protoval, SMTSolver *solver=NULL) const ROSE_OVERRIDE {
return instance(protoval, solver);
}
virtual BaseSemantics::RiscOperatorsPtr create(const BaseSemantics::StatePtr &state, SMTSolver *solver=NULL) const ROSE_OVERRIDE {
return instance(state, solver);
}
// check dynamic casts
public:
static MiraRiscOperatorsPtr promote(const BaseSemantics::RiscOperatorsPtr &x) {
MiraRiscOperatorsPtr retval = boost::dynamic_pointer_cast<MiraRiscOperators>(x);
assert(retval!=NULL);
return retval;
}
virtual void writeMemory(const RegisterDescriptor &segreg, const BaseSemantics::SValuePtr &address,
const BaseSemantics::SValuePtr &value_, const BaseSemantics::SValuePtr &cond) ROSE_OVERRIDE;
virtual BaseSemantics::SValuePtr readMemory(const RegisterDescriptor &segreg, const BaseSemantics::SValuePtr &address,
const BaseSemantics::SValuePtr &value_, const BaseSemantics::SValuePtr &cond) ROSE_OVERRIDE;
}; // end class MiraRiscOperators
} // end namespace ConcreteSemantics
} //end namespace InstructionSemantics2
} //end namespace BinaryAnalysis
}
#endif