SymEvalPolicy::SymEvalPolicy(Result_t &r, Address a, Dyninst::Architecture ac, Instruction::Ptr insn) : res(r), arch(ac), addr(a), ip_(Handle<32>(wrap(Absloc::makePC(arch)))), failedTranslate_(false), insn_(insn) { // We also need to build aaMap FTW!!! for (Result_t::iterator iter = r.begin(); iter != r.end(); ++iter) { Assignment::Ptr a = iter->first; // For a different instruction... if (a->addr() != addr) continue; AbsRegion &o = a->out(); if (o.containsOfType(Absloc::Register)) { // We're assuming this is a single register... //std::cerr << "Marking register " << a << std::endl; aaMap[o.absloc()] = a; } else { // Use sufficiently-unique (Heap,0) Absloc // to represent a definition to a memory absloc aaMap[Absloc(0)] = a; } } }
bool SymEval::expand(Result_t &res, std::set<InstructionPtr> &failedInsns, bool applyVisitors) { // Symbolic evaluation works off an Instruction // so we have something to hand to ROSE. failedInsns.clear(); for (Result_t::iterator i = res.begin(); i != res.end(); ++i) { if (i->second != AST::Ptr()) { // Must've already filled it in from a previous instruction crack continue; } Assignment::Ptr ptr = i->first; bool success = expandInsn(ptr->insn(), ptr->addr(), res); if (!success) failedInsns.insert(ptr->insn()); } if (applyVisitors) { // Must apply the visitor to each filled in element for (Result_t::iterator i = res.begin(); i != res.end(); ++i) { if (!i->second) continue; AST::Ptr tmp = simplifyStack(i->second, i->first->addr(), i->first->func(), i->first->block()); BooleanVisitor b; AST::Ptr tmp2 = tmp->accept(&b); i->second = tmp2; } } return (failedInsns.empty()); }