X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fcore%2FBasicBlock.cxx;h=7af6bd85f47af3ebc59701c26160539c9e297dbf;hp=0dec430fcf6bd00b6ba1f5af6bf06683d430552a;hb=4443ad3e38327c776dcc68538591456d37c9ed6f;hpb=3493bceb6690f53900d2a4524401990c601b1464 diff --git a/src/core/BasicBlock.cxx b/src/core/BasicBlock.cxx index 0dec430..7af6bd8 100644 --- a/src/core/BasicBlock.cxx +++ b/src/core/BasicBlock.cxx @@ -1,5 +1,9 @@ #include "BasicBlock.hxx" #include "gui/qt.hxx" +#include "core/InformationManager.hxx" + +#include +#include void BasicBlock::serialize(QXmlStreamWriter& stream) { stream.writeStartElement("block"); @@ -12,3 +16,80 @@ void BasicBlock::serialize(QXmlStreamWriter& stream) { stream.writeTextElement("next", QString::number(getNextBlock(1), 16)); stream.writeEndElement(); // "block" } + +BasicBlock* BasicBlock::deserialize(QXmlStreamReader& stream, InformationManager* manager) { + Q_ASSERT(stream.name() == "block"); + + QString name = stream.attributes().value("id").toString(); + uint64_t start_address(0), end_address(0), next_blocks[2] = {0, 0}; + BasicBlock* block; + + + while (QXmlStreamReader::NoToken != stream.readNext()) { + while (QXmlStreamReader::Characters == stream.tokenType() && + stream.isWhitespace()) + stream.readNext(); + if (QXmlStreamReader::EndElement == stream.tokenType()) + break; + + if(QXmlStreamReader::StartElement != stream.tokenType()) + return NULL; + + if (stream.name() == "start") { + stream.readNext(); + if (QXmlStreamReader::Characters != stream.tokenType()) + return NULL; + + start_address = stream.text().toULongLong(NULL, 16); + stream.readNext(); + + if(QXmlStreamReader::EndElement != stream.tokenType()) + return NULL; + } + if (stream.name() == "end") { + stream.readNext(); + if (QXmlStreamReader::Characters != stream.tokenType()) + return NULL; + + end_address = stream.text().toULongLong(NULL, 16); + stream.readNext(); + + if(QXmlStreamReader::EndElement != stream.tokenType()) + return NULL; + } + if (stream.name() == "next") { + stream.readNext(); + if (QXmlStreamReader::Characters != stream.tokenType()) + return NULL; + + uint64_t newblock = stream.text().toULongLong(NULL, 16); + stream.readNext(); + + if (next_blocks[0] == 0) { + next_blocks[0] = newblock; + } else { + if (0 != next_blocks[1]) + return NULL; + next_blocks[1] = newblock; + } + + if(QXmlStreamReader::EndElement != stream.tokenType()) + return NULL; + } + } + + block = manager->newBasicBlock(start_address); + block->end_address = end_address; + block->next_blocks[0] = next_blocks[0]; + block->next_blocks[1] = next_blocks[1]; + + assert(stream.name() == "block"); + assert(block->getName() == name.toStdString()); + + manager->finishBasicBlock(block); + return block; +} + +std::list BasicBlock::getInstructions() const { + return manager->getDisassembler()->getInstructions(this); +}