23 #define BUILD CPUI_MULTIEQUAL
24 #define DELAY_SLOT CPUI_INDIRECT
25 #define CROSSBUILD CPUI_PTRSUB
26 #define MACROBUILD CPUI_CAST
27 #define LABELBUILD CPUI_PTRADD
33 enum const_type { real=0, handle=1, j_start=2, j_next=3, j_curspace=4,
34 j_curspace_size=5, spaceid=6, j_relative=7,
35 j_flowref=8, j_flowref_size=9, j_flowdest=10, j_flowdest_size=11 };
36 enum v_field { v_space=0, v_offset=1, v_size=2, v_offset_plus=3 };
46 static void printHandleSelector(ostream &s,v_field val);
47 static v_field readHandleSelector(
const string &name);
49 ConstTpl(
void) { type = real; value_real = 0; }
51 type=op2.type; value=op2.value; value_real=op2.value_real; select=op2.select; }
55 ConstTpl(const_type tp,int4 ht,v_field vf);
56 ConstTpl(const_type tp,int4 ht,v_field vf,uintb plus);
57 bool isConstSpace(
void)
const;
58 bool isUniqueSpace(
void)
const;
59 bool operator==(
const ConstTpl &op2)
const;
60 bool operator<(
const ConstTpl &op2)
const;
61 uintb getReal(
void)
const {
return value_real; }
62 AddrSpace *getSpace(
void)
const {
return value.spaceid; }
63 int4 getHandleIndex(
void)
const {
return value.handle_index; }
64 const_type getType(
void)
const {
return type; }
65 v_field getSelect(
void)
const {
return select; }
68 void transfer(
const vector<HandleTpl *> ¶ms);
69 bool isZero(
void)
const {
return ((type==real)&&(value_real==0)); }
70 void changeHandleIndex(
const vector<int4> &handmap);
73 void saveXml(ostream &s)
const;
84 VarnodeTpl(
void) : space(), offset(), size() { unnamed_flag=
false; }
87 const ConstTpl &getSpace(
void)
const {
return space; }
88 const ConstTpl &getOffset(
void)
const {
return offset; }
89 const ConstTpl &getSize(
void)
const {
return size; }
91 int4 transfer(
const vector<HandleTpl *> ¶ms);
92 bool isZeroSize(
void)
const {
return size.isZero(); }
94 void setOffset(uintb constVal) { offset =
ConstTpl(ConstTpl::real,constVal); }
95 void setRelative(uintb constVal) { offset =
ConstTpl(ConstTpl::j_relative,constVal); }
96 void setSize(
const ConstTpl &sz ) { size = sz; }
97 bool isUnnamed(
void)
const {
return unnamed_flag; }
98 void setUnnamed(
bool val) { unnamed_flag = val; }
99 bool isLocalTemp(
void)
const;
100 bool isRelative(
void)
const {
return (offset.getType() == ConstTpl::j_relative); }
101 void changeHandleIndex(
const vector<int4> &handmap);
102 bool adjustTruncation(int4 sz,
bool isbigendian);
103 void saveXml(ostream &s)
const;
120 const ConstTpl &getSpace(
void)
const {
return space; }
121 const ConstTpl &getPtrSpace(
void)
const {
return ptrspace; }
122 const ConstTpl &getPtrOffset(
void)
const {
return ptroffset; }
123 const ConstTpl &getPtrSize(
void)
const {
return ptrsize; }
124 const ConstTpl &getSize(
void)
const {
return size; }
125 const ConstTpl &getTempSpace(
void)
const {
return temp_space; }
126 const ConstTpl &getTempOffset(
void)
const {
return temp_offset; }
127 void setSize(
const ConstTpl &sz) { size = sz; }
128 void setPtrSize(
const ConstTpl &sz) { ptrsize=sz; }
129 void setPtrOffset(uintb val) { ptroffset =
ConstTpl(ConstTpl::real,val); }
130 void setTempOffset(uintb val) { temp_offset =
ConstTpl(ConstTpl::real,val); }
132 void changeHandleIndex(
const vector<int4> &handmap);
133 void saveXml(ostream &s)
const;
140 vector<VarnodeTpl *> input;
145 VarnodeTpl *getOut(
void)
const {
return output; }
146 int4 numInput(
void)
const {
return input.size(); }
147 VarnodeTpl *getIn(int4 i)
const {
return input[i]; }
148 OpCode getOpcode(
void)
const {
return opc; }
149 bool isZeroSize(
void)
const;
150 void setOpcode(
OpCode o) { opc = o; }
151 void setOutput(
VarnodeTpl *vt) { output = vt; }
152 void clearOutput(
void) {
delete output; output = (
VarnodeTpl *)0; }
153 void addInput(
VarnodeTpl *vt) { input.push_back(vt); }
154 void setInput(
VarnodeTpl *vt,int4 slot) { input[slot] = vt; }
155 void removeInput(int4 index);
156 void changeHandleIndex(
const vector<int4> &handmap);
157 void saveXml(ostream &s)
const;
168 void setOpvec(vector<OpTpl *> &opvec) { vec = opvec; }
169 void setNumLabels(uint4 val) { numlabels = val; }
173 uint4 delaySlot(
void)
const {
return delayslot; }
174 uint4 numLabels(
void)
const {
return numlabels; }
175 const vector<OpTpl *> &getOpvec(
void)
const {
return vec; }
176 HandleTpl *getResult(
void)
const {
return result; }
177 bool addOp(
OpTpl *ot);
178 bool addOpList(
const vector<OpTpl *> &oplist);
179 void setResult(
HandleTpl *t) { result = t; }
180 int4 fillinBuild(vector<int4> &check,
AddrSpace *const_space);
181 bool buildOnly(
void)
const;
182 void changeHandleIndex(
const vector<int4> &handmap);
183 void setInput(
VarnodeTpl *vn,int4 index,int4 slot);
185 void deleteOps(
const vector<int4> &indices);
186 void saveXml(ostream &s,int4 sectionid)
const;
197 virtual void dump(
OpTpl *op )=0;
199 PcodeBuilder(uint4 lbcnt) { labelbase=labelcount=lbcnt; }
202 uint4 getLabelBase(
void)
const {
return labelbase; }
203 ParserWalker *getCurrentWalker()
const {
return walker; }
205 virtual void appendBuild(
OpTpl *bld,int4 secnum)=0;
206 virtual void delaySlot(
OpTpl *op)=0;
207 virtual void setLabel(
OpTpl *op)=0;
208 virtual void appendCrossBuild(
OpTpl *bld,int4 secnum)=0;