// 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; }
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; }
void RegisterHandler::setAndMarkRegisters(const Registers ®isters) { 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. } }
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)); } } }
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 ® = 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(); }
bool Liveness::IsSelfMove(Registers& leftOperand, Registers& rightOperand) const { assert (leftOperand.size() == 1 && rightOperand.size() == 1); return leftOperand.at(0) == rightOperand.at(0); }