void normalizeInstructionInSubTree(SgNode* topNode ){ vector<SgAsmx86Instruction*> insns; FindInstructionsVisitor vis; AstQueryNamespace::querySubTree(topNode, std::bind2nd( vis, &insns )); for(std::vector<SgAsmx86Instruction*>::iterator iItr = insns.begin(); iItr != insns.end(); ++iItr) { SgAsmx86Instruction* insn = *iItr; SgAsmExpressionPtrList& operands = getOperands(insn); // Add to total for this variant // Add to total for each kind of operand size_t operandCount = operands.size(); for (size_t i = 0; i < operandCount; ++i) { SgAsmExpression* operand = operands[i]; SgAsmExpression* newOperand; if( isSgAsmMemoryReferenceExpression(operand) ) { SgAsmMemoryReferenceExpression* memRefExp = new SgAsmMemoryReferenceExpression; SgAsmWordValueExpression* wordVal = new SgAsmWordValueExpression; wordVal->set_value(0); memRefExp->set_segment(wordVal); memRefExp->set_address(wordVal); memRefExp->set_type(new SgAsmTypeWord); newOperand = memRefExp; }else if(isSgAsmRegisterReferenceExpression(operand) ){ SgAsmx86RegisterReferenceExpression* regRef = new SgAsmx86RegisterReferenceExpression; regRef->get_descriptor().set_major(x86_regclass_mm); regRef->get_descriptor().set_minor(0); newOperand = regRef; }else{ SgAsmWordValueExpression* wordVal = new SgAsmWordValueExpression; wordVal->set_value(0); newOperand = wordVal; } newOperand->set_parent(operand->get_parent()); DeleteSgTree(operands[i]); operands[i]=newOperand; } //std::cout << "Unparsed: " <<unparseX86Instruction(insn)<< std::endl; } };
SgAsmMemoryReferenceExpression* makeMemoryReference(SgAsmExpression* addr, SgAsmExpression* segment, SgAsmType* t) { SgAsmMemoryReferenceExpression* r = new SgAsmMemoryReferenceExpression(addr); addr->set_parent(r); if (segment) { r->set_segment(segment); segment->set_parent(r); } if (t) r->set_type(t); return r; }