Ejemplo n.º 1
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.º 2
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.º 3
0
void RegisterHandler::setAndMarkRegisters(const Registers &registers)
{
    if (!compareRegisterSet(m_registers, registers)) {
        setRegisters(registers);
        return;
    }
    const int size = m_registers.size();
    for (int r = 0; r != size; ++r) {
        const QModelIndex regIndex = index(r, 1, QModelIndex());
        if (m_registers.at(r).value != registers.at(r).value) {
            // Indicate red if values change, keep changed.
            m_registers[r].changed = m_registers.at(r).changed
                || !m_registers.at(r).value.isEmpty();
            m_registers[r].value = registers.at(r).value;
            emit dataChanged(regIndex, regIndex);
        }
        emit registerSet(regIndex); // Notify attached memory views.
    }
}
Ejemplo n.º 4
0
        void Liveness::GenerateMovePairs()
        {
            for (auto oneNode : cfGraph.GetDirectedGraph().GetNodes())
            {
                Registers leftOperand = cfGraph.GetNodeIns(oneNode)->GetDstRegs();
                Registers rightOperand = cfGraph.GetNodeIns(oneNode)->GetSrcRegs();

                if (IsTwoContentRegOperandMove(oneNode, leftOperand, rightOperand) &&
                    !IsSelfMove(leftOperand, rightOperand))
                {
                    assert (leftOperand.at(0) != nullptr && rightOperand.at(0) != nullptr);

                    Node leftNode = interferenceGraph.GetRegNode(leftOperand.at(0));
                    Node rightNode = interferenceGraph.GetRegNode(rightOperand.at(0));

                    if(!MovePairContains(leftNode, rightNode))
                        movePairs.push_back(Edge(leftNode, rightNode));
                }
            }
        }
Ejemplo n.º 5
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.º 6
0
 bool Liveness::IsSelfMove(Registers& leftOperand, Registers& rightOperand) const
 {
     assert (leftOperand.size() == 1 && rightOperand.size() == 1);
     return leftOperand.at(0) == rightOperand.at(0);
 }