Exemplo n.º 1
0
 virtual void visit(SgNode* n) {
     SgAsmX86Instruction* insn = isSgAsmX86Instruction(n);
     if (!insn) return;
     if (insn->get_kind() != x86_call) return;
     //cerr << "Found call xxx at " << hex << insn->get_address() << endl;
     uint64_t tgtAddr;
     if (!insn->getBranchTarget(&tgtAddr)) return;
     //cerr << "Found call at " << hex << insn->get_address() << " with known target " << hex << tgtAddr << endl;
     SgAsmInstruction* tgt = info->getInstructionAtAddress(tgtAddr);
     if (!tgt) return;
     //cerr << "Found target insn" << endl;
     SgNode* f = tgt;
     while (f && !isSgAsmBlock(f) && !isSgAsmFunction(f)) f = f->get_parent();
     if (!f) return;
     //cerr << "Found function of target" << endl;
     uint64_t next = insn->get_address() + insn->get_raw_bytes().size();
     info->returnTargets[isSgAsmStatement(f)].insert(next);
 }
Exemplo n.º 2
0
 const std::set<uint64_t>& AuxiliaryInformation::getPossibleSuccessors(SgAsmInstruction* insn) const {
     static const std::set<uint64_t> emptySet;
     std::map<SgAsmInstruction*, std::set<uint64_t> >::const_iterator succsIter = indirectJumpTargets.find(insn);
     if (isSgAsmX86Instruction(insn) && isSgAsmX86Instruction(insn)->get_kind() == x86_ret) {
         SgNode* f = insn;
         while (f && !isSgAsmBlock(f) && !isSgAsmFunction(f)) f = f->get_parent();
         std::map<SgAsmStatement*, std::set<uint64_t> >::const_iterator retIter = returnTargets.find(isSgAsmStatement(f));
         if (retIter == returnTargets.end()) {
             return emptySet;
         } else {
             return retIter->second;
         }
     } else if (succsIter == indirectJumpTargets.end()) {
         return emptySet;
     } else {
         // rose translator has trouble in unparsing it correctly.
         return succsIter->second;
     }
 }
Exemplo n.º 3
0
 void visit(SgNode *node) {
     SgAsmBlock *block = isSgAsmBlock(node);
     SgAsmFunction *func = block ? block->get_enclosing_function() : NULL;
     if (block && func) {
         if (block==func->get_entry_block()) {
             if (block->get_immediate_dominator()) {
                 if (bad_blocks)
                     bad_blocks->insert(block);
                 failed = true;
             }
         } else {
             SgAsmBlock *idom = block->get_immediate_dominator();
             if (!idom || idom->get_enclosing_function()!=func) {
                 if (bad_blocks)
                     bad_blocks->insert(block);
                 failed = true;
             }
         }
     }
 }
Exemplo n.º 4
0
 void visit(SgNode *node) {
     SgAsmBlock *block = isSgAsmBlock(node);
     if (block)
         block->set_immediate_dominator(NULL);
 }