Beispiel #1
0
/* FIXME: Stupid SgAsmInstruction interface necessitates a "switch". [RPM 2011-11-11] */
size_t
Partitioner::count_kinds(const InstructionMap &insns)
{
    std::set<int> kinds;
    for (InstructionMap::const_iterator ii=insns.begin(); ii!=insns.end(); ++ii) {
        SgAsmInstruction *insn = ii->second->node;
        int kind = -1;
        switch (insn->variantT()) {
            case V_SgAsmx86Instruction:     kind = isSgAsmx86Instruction(insn)    ->get_kind(); break;
            case V_SgAsmPowerpcInstruction: kind = isSgAsmPowerpcInstruction(insn)->get_kind(); break;
            case V_SgAsmArmInstruction:     kind = isSgAsmArmInstruction(insn)    ->get_kind(); break;
            default: break; // to shut up compiler warnings
        }
        if (-1!=kind)
            kinds.insert(kind);
    }
    return kinds.size();
}
Beispiel #2
0
/** Returns the string representation of an instruction operand. */
std::string unparsePowerpcExpression(SgAsmExpression *expr, const AsmUnparser::LabelMap *labels,
                                     const RegisterDictionary *registers) {
    /* Find the instruction with which this expression is associated. */
    SgAsmPowerpcInstruction *insn = NULL;
    for (SgNode *node=expr; !insn && node; node=node->get_parent()) {
        insn = isSgAsmPowerpcInstruction(node);
    }
    ROSE_ASSERT(insn!=NULL);

    PowerpcInstructionKind kind = insn->get_kind();
    bool isBranchTarget = (((kind == powerpc_b ||
                             kind == powerpc_bl ||
                             kind == powerpc_ba ||
                             kind == powerpc_bla) &&
                            expr==insn->get_operandList()->get_operands()[0]) ||
                           ((kind == powerpc_bc ||
                             kind == powerpc_bcl ||
                             kind == powerpc_bca ||
                             kind == powerpc_bcla) &&
                            insn->get_operandList()->get_operands().size()>=3 &&
                            expr==insn->get_operandList()->get_operands()[2]));
    return unparsePowerpcExpression(expr, labels, registers, isBranchTarget);
}