Ejemplo n.º 1
0
        bool Liveness::SrcRegisterIs(const Registers& regs, myTemp reg) const
        {
            assert (reg != nullptr);
            assert (regs.size() >= 0 && regs.size() <= 1);

            if (regs.size() == 1)   return regs.at(0) == reg;
            else                    return false;
        }
Ejemplo n.º 2
0
// Compare register sets by name
static inline bool compareRegisterSet(const Registers &r1, const Registers &r2)
{
    if (r1.size() != r2.size())
        return false;
    const int size = r1.size();
    for (int r = 0; r < size; r++)
        if (r1.at(r).name != r2.at(r).name)
            return false;
    return true;
}
Ejemplo n.º 3
0
        //  NOTE:
        //      This function also recognize conditions when either of the destination
        //      register or the source register is used as a memory location:
        //          mov [reg], reg | mov [reg], [reg] | mov reg, [reg]
        //      On these conditions, the move instructions are not treated as move pairs.
        bool Liveness::IsTwoContentRegOperandMove(
            Node node, Registers& leftOperand, Registers& rightOperand) const
        {
            if (!cfGraph.IsMoveIns(node) ||
                leftOperand.size() != 1 || rightOperand.size() != 1)
                return false;

            //  check memory operand type from "[]" characters
            string insStr = cfGraph.GetNodeIns(node)->ToString();
            return insStr.find('[') == string::npos;
        }
Ejemplo n.º 4
0
std::string gdbmiRegisters(CIDebugRegisters *regs,
                           CIDebugControl *control,
                           bool humanReadable,
                           unsigned flags,
                           std::string *errorMessage)
{
    if (regs == 0 || control == 0) {
        *errorMessage = "Required interfaces missing for registers dump.";
        return std::string();
    }

    const Registers registers = getRegisters(regs, flags, errorMessage);
    if (registers.empty())
        return std::string();

    std::ostringstream str;
    str << '[';
    if (humanReadable)
        str << '\n';
    const Registers::size_type size = registers.size();
    for (Registers::size_type r = 0; r < size; ++r) {
        const Register &reg = registers.at(r);
        if (r)
            str << ',';
        str << "{number=\"" << r << "\",name=\"" << gdbmiWStringFormat(reg.name) << '"';
        if (!reg.description.empty())
            str << ",description=\"" << gdbmiWStringFormat(reg.description) << '"';
        if (reg.subRegister)
            str << ",subregister=\"true\"";
        if (reg.pseudoRegister)
            str << ",pseudoregister=\"true\"";
        str << ",value=\"";
        formatDebugValue(str, reg.value, control);
        str << "\"}";
        if (humanReadable)
            str << '\n';
    }
    str << ']';
    if (humanReadable)
        str << '\n';
    return str.str();
}
Ejemplo n.º 5
0
 bool Liveness::IsSelfMove(Registers& leftOperand, Registers& rightOperand) const
 {
     assert (leftOperand.size() == 1 && rightOperand.size() == 1);
     return leftOperand.at(0) == rightOperand.at(0);
 }