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); }
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; } }
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; } } } }
void visit(SgNode *node) { SgAsmBlock *block = isSgAsmBlock(node); if (block) block->set_immediate_dominator(NULL); }