X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=src%2Fcore%2FInformationManager.cxx;h=3eebc3422300cfde2f68323192d7f20b2a46f203;hb=48970b341025a501ca17b991e9a5d0ee7995ec30;hp=a274c418091e40efcab87f1f29821cb67ab3c5f9;hpb=440c4598343d9e46d8963f7753c122b121826334;p=frida%2Ffrida.git diff --git a/src/core/InformationManager.cxx b/src/core/InformationManager.cxx index a274c41..3eebc34 100644 --- a/src/core/InformationManager.cxx +++ b/src/core/InformationManager.cxx @@ -2,6 +2,7 @@ #include "disassembler/llvm/LLVMDisassembler.hxx" #include "core/Function.hxx" #include "core/BasicBlock.hxx" +#include "core/Comment.hxx" #include "gui/qt.hxx" #include @@ -36,23 +37,9 @@ void InformationManager::save(const QString& filename) { stream.setAutoFormatting(true); stream.setAutoFormattingIndent(-1); stream.writeStartDocument(); - stream.writeStartElement("function"); - stream.writeAttribute("name", fun->getName().c_str()); - stream.writeAttribute("entry", QString::number(fun->getStartAddress(), 16)); - - for (auto& blockentry : fun->blocks()) { - stream.writeStartElement("block"); - stream.writeAttribute("id", blockentry.second->getName().c_str()); - stream.writeTextElement("start", QString::number(blockentry.second->getStartAddress(), 16)); - stream.writeTextElement("end", QString::number(blockentry.second->getEndAddress(), 16)); - if (0 != blockentry.second->getNextBlock(0)) - stream.writeTextElement("next", QString::number(blockentry.second->getNextBlock(0), 16)); - if (0 != blockentry.second->getNextBlock(1)) - stream.writeTextElement("next", QString::number(blockentry.second->getNextBlock(1), 16)); - stream.writeEndElement(); // "block" - } - - stream.writeEndElement(); // "function" + + fun->serialize(stream); + stream.writeEndDocument(); outZipFile.close(); } @@ -61,10 +48,68 @@ void InformationManager::save(const QString& filename) { } void InformationManager::signal_new_function(Function* fun) { - functions.insert(std::make_pair(fun->getStartAddress(), fun)); +} + +Function* InformationManager::getFunction(uint64_t address) { + auto it = functions.find(address); + if (it != functions.end()) + return it->second; + else + return NULL; +} + +BasicBlock* InformationManager::getBasicBlock(uint64_t address) { + auto it = blocks.find(address); + if (it != blocks.end()) + return it->second; + else + return NULL; +} + +Function* InformationManager::newFunction(uint64_t address) { + Function* fun = new Function(address, this); + functions.insert(std::make_pair(address, fun)); + return fun; +} + +BasicBlock* InformationManager::newBasicBlock(uint64_t address) { + BasicBlock* block = new BasicBlock(address, this); + blocks.insert(std::make_pair(address, block)); + return block; +} + +Comment* InformationManager::newGlobalComment(uint64_t address) { + return NULL; +} + +Comment* InformationManager::newLocalComment(uint64_t address, Function* f) { + return NULL; +} + +void InformationManager::finishFunction(Function* fun) { for (auto b : fun->blocks()) { BasicBlock* bl = b.second; blocks.insert(std::make_pair(bl->getStartAddress(), bl)); } new_function_signal(fun); } + +void InformationManager::finishBasicBlock(BasicBlock* b) { +} + +void InformationManager::finnishComment(Comment* c) { +} + +void InformationManager::deleteFunction(Function* f) { + functions.erase(f->getStartAddress()); + delete f; +} + +void InformationManager::deleteBasicBlock(BasicBlock* b) { + blocks.erase(b->getStartAddress()); + delete b; +} + +void InformationManager::deleteComment(Comment* c) { + delete c; +}