X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=src%2Fcore%2FInformationManager.cxx;h=e1571892349336ab5d0cc94f1d64104d64428d68;hb=42c66e29eeee1c1e0d7eb4450202fc0493db65e9;hp=fd0715b851adfe927601fe50aa0bc5ef9e552485;hpb=11fd69cdfce58707599bf57c07c5a784905e23f6;p=frida%2Ffrida.git diff --git a/src/core/InformationManager.cxx b/src/core/InformationManager.cxx index fd0715b..e157189 100644 --- a/src/core/InformationManager.cxx +++ b/src/core/InformationManager.cxx @@ -1,8 +1,10 @@ #include "InformationManager.hxx" +#include "bindings/Interpreter.hxx" #include "disassembler/llvm/LLVMDisassembler.hxx" #include "core/Function.hxx" #include "core/BasicBlock.hxx" #include "core/Comment.hxx" +#include "core/events/NewFunctionEvent.hxx" #include "gui/qt.hxx" #include @@ -10,9 +12,19 @@ #include +InformationManager* current_information_manager; + InformationManager::InformationManager() - : logger(log4cxx::Logger::getLogger("InformationManager")) -{} + : logger(log4cxx::Logger::getLogger("core.InformationManager")) +{ + current_information_manager = this; + + QPluginLoader* loader = new QPluginLoader("libguilePlugin", NULL); + if (!loader->load()) + LOG4CXX_ERROR(logger, "Loading plugin failed: " << loader->errorString().toStdString()); + interpreters["GUILE"] = qobject_cast(loader->instance()); + plugins.push_back(loader); +} InformationManager::~InformationManager() { for (auto b : blocks) @@ -20,6 +32,9 @@ InformationManager::~InformationManager() { for (auto f : functions) delete f.second; + + for (auto i : plugins) + delete i; } void InformationManager::reset(const std::string& filename) { @@ -105,8 +120,10 @@ void InformationManager::save(const std::string& filename) { zip.close(); } -void InformationManager::signal_new_function(Function* fun) { -} + +/* ******************************* + * Accessors for the Functions map + */ Function* InformationManager::getFunction(uint64_t address) { auto it = functions.find(address); @@ -116,6 +133,18 @@ Function* InformationManager::getFunction(uint64_t address) { return NULL; } +std::map::const_iterator InformationManager::beginFunctions() { + return functions.begin(); +} +std::map::const_iterator InformationManager::endFunctions() { + return functions.end(); +} + + +/* ********************************* + * Accessors for the BasicBlocks map + */ + BasicBlock* InformationManager::getBasicBlock(uint64_t address) { auto it = blocks.find(address); if (it != blocks.end()) @@ -124,8 +153,46 @@ BasicBlock* InformationManager::getBasicBlock(uint64_t address) { return NULL; } +std::map::const_iterator InformationManager::beginBasicBlocks() { + return blocks.begin(); +} +std::map::const_iterator InformationManager::endBasicBlocks() { + return blocks.end(); +} + + +/* ********************************* + * Accessors for the Interpreter map + */ + +Interpreter* InformationManager::getInterpreter(const std::string& name) { + auto it = interpreters.find(name); + if (it != interpreters.end()) + return it->second; + else + return NULL; +} + +std::map::const_iterator InformationManager::beginInterpreters() { + return interpreters.begin(); +} +std::map::const_iterator InformationManager::endInterpreters() { + return interpreters.end(); +} + + +/* ******************************** + * Factory methods for data classes + */ + Function* InformationManager::newFunction(uint64_t address) { - Function* fun = new Function(address, this); + Function* fun = new Function(address, false, this); + functions.insert(std::make_pair(address, fun)); + return fun; +} + +Function* InformationManager::newDynamicFunction(uint64_t address) { + Function* fun = new Function(address, true, this); functions.insert(std::make_pair(address, fun)); return fun; } @@ -137,11 +204,15 @@ BasicBlock* InformationManager::newBasicBlock(uint64_t address) { } Comment* InformationManager::newGlobalComment(uint64_t address) { - return NULL; + Comment* comment = new Comment(address, this); + comments.insert(std::make_pair(address, comment)); + return comment; } Comment* InformationManager::newLocalComment(uint64_t address, Function* f) { - return NULL; + Comment* comment = new Comment(address, this); + comments.insert(std::make_pair(address, comment)); + return comment; } void InformationManager::finishFunction(Function* fun) { @@ -150,10 +221,11 @@ void InformationManager::finishFunction(Function* fun) { BasicBlock* bl = b.second; blocks.insert(std::make_pair(bl->getStartAddress(), bl)); } - new_function_signal(fun); + NewFunctionEvent event(fun->getStartAddress(), fun); + dispatch(&event); } -void InformationManager::finishBasicBlock(BasicBlock* b) { +void InformationManager::finishBasicBlock(BasicBlock*) { } void InformationManager::finnishComment(Comment* c) { @@ -170,5 +242,12 @@ void InformationManager::deleteBasicBlock(BasicBlock* b) { } void InformationManager::deleteComment(Comment* c) { + auto range = comments.equal_range(c->getAddress()); + for (auto it = range.first; it != range.second; ++it) { + if (it->second == c) { + comments.erase(it); + break; + } + } delete c; }