X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fcore%2FInformationManager.cxx;h=1234ac96aa64845775af2069a0bf73c901634d80;hp=6e9157263ef4eb8b22f2ea461ea76a4c209c4eb8;hb=9fe5caf6408d1b7d5eb86dacdb211bd22335398a;hpb=231dae075375e7d57982f5107b86294fbe726b33 diff --git a/src/core/InformationManager.cxx b/src/core/InformationManager.cxx index 6e91572..1234ac9 100644 --- a/src/core/InformationManager.cxx +++ b/src/core/InformationManager.cxx @@ -1,9 +1,67 @@ #include "InformationManager.hxx" #include "disassembler/llvm/LLVMDisassembler.hxx" +#include "core/Function.hxx" +#include "core/BasicBlock.hxx" -#include +#include "gui/qt.hxx" +#include +#include + +InformationManager::~InformationManager() { + for (BasicBlock * b : blocks) + delete b; + + for (Function * f : functions) + delete f; +} void InformationManager::reset(const std::string& filename) { - disassembler.reset(new LLVMDisassembler(filename, this)); - disassembler.get()->start(); + disassembler.reset(createLLVMDisassembler(filename, this)); + if (disassembler.get() != NULL) + disassembler.get()->start(); +} + +void InformationManager::save(const QString& filename) { + QuaZip zip(filename); + zip.open(QuaZip::mdCreate); + zip.setComment("FRIDA 0.0"); + QuaZipFile outZipFile(&zip); + + for (Function* fun : functions) { + QuaZipNewInfo zipinfo(fun->getName().c_str()); + zipinfo.setPermissions(static_cast(0x6444)); + outZipFile.open(QIODevice::WriteOnly, zipinfo); + QXmlStreamWriter stream(&outZipFile); + 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" + stream.writeEndDocument(); + outZipFile.close(); + } + + zip.close(); +} + +void InformationManager::signal_new_function(Function* fun) { + functions.insert(fun); + for (auto b : fun->blocks()) + blocks.insert(b.second); + new_function_signal(fun); }