diff options
Diffstat (limited to 'src/analysis/blocks/virtual.c')
-rw-r--r-- | src/analysis/blocks/virtual.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/analysis/blocks/virtual.c b/src/analysis/blocks/virtual.c index 90bccca..71a6d06 100644 --- a/src/analysis/blocks/virtual.c +++ b/src/analysis/blocks/virtual.c @@ -69,6 +69,9 @@ static void g_virtual_block_dispose(GVirtualBlock *); /* Procède à la libération totale de la mémoire. */ static void g_virtual_block_finalize(GVirtualBlock *); +/* Recherche le bloc contenant une adresse donnée. */ +static GInstrBlock *g_virtual_block_find_by_addr(const GVirtualBlock *, vmpa_t); + /* Parcours le bloc d'instructions dans un ordre donné. */ static bool g_virtual_block_visit(GVirtualBlock *, instr_block_visitor_cb, void *); @@ -126,6 +129,7 @@ static void g_virtual_block_init(GVirtualBlock *block) parent = G_INSTR_BLOCK(block); + parent->find_by_addr = (find_by_addr_fc)g_virtual_block_find_by_addr; parent->visit_blocks = (visit_all_blocks_fc)g_virtual_block_visit; parent->list_blocks = (list_all_blocks_fc)g_virtual_block_list_all_blocks; parent->list_regs = (list_regs_accesses_fc)g_virtual_block_list_regs_accesses; @@ -207,6 +211,34 @@ GInstrBlock *g_virtual_block_new(void) /****************************************************************************** * * +* Paramètres : block = bloc de départ des recherches. * +* addr = ensemble de blocs à parcourir. * +* * +* Description : Recherche le bloc contenant une adresse donnée. * +* * +* Retour : bloc basique trouvé ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GInstrBlock *g_virtual_block_find_by_addr(const GVirtualBlock *block, vmpa_t addr) +{ + GInstrBlock *result; /* Resultat à retourner */ + size_t i; /* Boucle de parcours */ + + result = NULL; + + for (i = 0; i < block->children_count && result == NULL; i++) + result = g_instr_block_find_by_addr(block->children[i], addr); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : block = bloc d'instructions concerné par la visite. * * callback = ensemble de blocs à parcourir. * * data = donnée utilisateur à associer au parcours. * @@ -324,3 +356,27 @@ size_t g_virtual_block_count_children(GVirtualBlock *block) return block->children_count; } + + +/****************************************************************************** +* * +* Paramètres : block = bloc d'instructions à consulter. * +* index = indice du sous-bloc recherché. * +* * +* Description : Renvoie un des blocs contenus dans le groupe courant. * +* * +* Retour : Un des blocs du groupe. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GInstrBlock *g_virtual_block_get_child(GVirtualBlock *block, size_t index) +{ + if (index >= block->children_count) + return NULL; + + else + return block->children[index]; + +} |