@@ -254,6 +254,8 @@ void SymbolTable::restoreSymbolHeader(const Element *el)
254
254
sym = new OperandSymbol ();
255
255
else if (el->getName () == " start_sym_head" )
256
256
sym = new StartSymbol ();
257
+ else if (el->getName () == " offset_sym_head" )
258
+ sym = new OffsetSymbol ();
257
259
else if (el->getName () == " end_sym_head" )
258
260
sym = new EndSymbol ();
259
261
else if (el->getName () == " next2_sym_head" )
@@ -1196,6 +1198,70 @@ void StartSymbol::restoreXml(const Element *el,SleighBase *trans)
1196
1198
patexp->layClaim ();
1197
1199
}
1198
1200
1201
+ OffsetSymbol::OffsetSymbol (const string &nm,AddrSpace *cspc) : SpecificSymbol(nm)
1202
+
1203
+ {
1204
+ const_space = cspc;
1205
+ patexp = new OperandOffsetValue ();
1206
+ patexp->layClaim ();
1207
+ }
1208
+
1209
+ OffsetSymbol::~OffsetSymbol (void )
1210
+
1211
+ {
1212
+ if (patexp != (PatternExpression *)0 )
1213
+ PatternExpression::release (patexp);
1214
+ }
1215
+
1216
+ VarnodeTpl *OffsetSymbol::getVarnode (void ) const
1217
+
1218
+ { // Returns current operand offset as a constant
1219
+ ConstTpl spc (const_space);
1220
+ ConstTpl off (ConstTpl::j_offset);
1221
+ ConstTpl sz_zero;
1222
+ return new VarnodeTpl (spc,off,sz_zero);
1223
+ }
1224
+
1225
+ void OffsetSymbol::getFixedHandle (FixedHandle &hand,ParserWalker &walker) const
1226
+
1227
+ {
1228
+ hand.space = walker.getCurSpace ();
1229
+ hand.offset_space = (AddrSpace *)0 ;
1230
+ hand.offset_offset = walker.getAddr ().getOffset (); // Get starting address of instruction
1231
+ hand.size = hand.space ->getAddrSize ();
1232
+ }
1233
+
1234
+ void OffsetSymbol::print (ostream &s,ParserWalker &walker) const
1235
+
1236
+ {
1237
+ intb val = (intb) walker.getAddr ().getOffset ();
1238
+ s << " 0x" << std::hex << val << std::dec;
1239
+ }
1240
+
1241
+ void OffsetSymbol::saveXml (ostream &s) const
1242
+
1243
+ {
1244
+ s << " <offset_sym" ;
1245
+ SleighSymbol::saveXmlHeader (s);
1246
+ s << " />\n " ;
1247
+ }
1248
+
1249
+ void OffsetSymbol::saveXmlHeader (ostream &s) const
1250
+
1251
+ {
1252
+ s << " <offset_sym_head" ;
1253
+ SleighSymbol::saveXmlHeader (s);
1254
+ s << " />\n " ;
1255
+ }
1256
+
1257
+ void OffsetSymbol::restoreXml (const Element *el,SleighBase *trans)
1258
+
1259
+ {
1260
+ const_space = trans->getConstantSpace ();
1261
+ patexp = new OperandOffsetValue ();
1262
+ patexp->layClaim ();
1263
+ }
1264
+
1199
1265
EndSymbol::EndSymbol (const string &nm,AddrSpace *cspc) : SpecificSymbol(nm)
1200
1266
1201
1267
{
0 commit comments