Function listing and selection.

This commit is contained in:
Ben Vanik
2013-12-22 02:59:42 -08:00
parent a631ada0f7
commit 4ecdfed46f
16 changed files with 314 additions and 65 deletions

View File

@@ -152,3 +152,15 @@ SymbolInfo::Status Module::DefineFunction(FunctionInfo* symbol_info) {
SymbolInfo::Status Module::DefineVariable(VariableInfo* symbol_info) {
return DefineSymbol((SymbolInfo*)symbol_info);
}
void Module::ForEachFunction(std::function<void (FunctionInfo*)> callback) {
LockMutex(lock_);
for (SymbolMap::iterator it = map_.begin();
it != map_.end(); ++it) {
if (it->second->type() == SymbolInfo::TYPE_FUNCTION) {
FunctionInfo* info = (FunctionInfo*)it->second;
callback(info);
}
}
UnlockMutex(lock_);
}

View File

@@ -10,6 +10,8 @@
#ifndef ALLOY_RUNTIME_MODULE_H_
#define ALLOY_RUNTIME_MODULE_H_
#include <functional>
#include <alloy/core.h>
#include <alloy/memory.h>
#include <alloy/runtime/symbol_info.h>
@@ -41,6 +43,8 @@ public:
SymbolInfo::Status DefineFunction(FunctionInfo* symbol_info);
SymbolInfo::Status DefineVariable(VariableInfo* symbol_info);
void ForEachFunction(std::function<void (FunctionInfo*)> callback);
private:
SymbolInfo::Status DeclareSymbol(
SymbolInfo::Type type, uint64_t address, SymbolInfo** out_symbol_info);

View File

@@ -116,6 +116,29 @@ int Runtime::AddModule(Module* module) {
return 0;
}
Module* Runtime::GetModule(const char* name) {
Module* result = NULL;
LockMutex(modules_lock_);
for (ModuleList::iterator it = modules_.begin();
it != modules_.end(); ++it) {
Module* module = *it;
if (xestrcmpa(module->name(), name) == 0) {
result = module;
break;
}
}
UnlockMutex(modules_lock_);
return result;
}
Runtime::ModuleList Runtime::GetModules() {
ModuleList clone;
LockMutex(modules_lock_);
clone = modules_;
UnlockMutex(modules_lock_);
return clone;
}
int Runtime::ResolveFunction(uint64_t address, Function** out_function) {
*out_function = NULL;
Entry* entry;

View File

@@ -26,6 +26,9 @@ namespace runtime {
class Runtime {
public:
typedef std::vector<Module*> ModuleList;
public:
Runtime(Memory* memory);
virtual ~Runtime();
@@ -40,6 +43,8 @@ public:
int Initialize(frontend::Frontend* frontend, backend::Backend* backend = 0);
int AddModule(Module* module);
Module* GetModule(const char* name);
ModuleList GetModules();
int LookupFunctionInfo(uint64_t address, FunctionInfo** out_symbol_info);
int ResolveFunction(uint64_t address, Function** out_function);
@@ -60,7 +65,6 @@ protected:
EntryTable entry_table_;
Mutex* modules_lock_;
typedef std::vector<Module*> ModuleList;
ModuleList modules_;
RegisterAccessCallbacks* access_callbacks_;