Example #1
0
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;

  }







};
Example #2
0
 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;
 }