diff options
Diffstat (limited to 'src/analysis/disass/block.c')
-rw-r--r-- | src/analysis/disass/block.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/src/analysis/disass/block.c b/src/analysis/disass/block.c index ff780e6..1babe95 100644 --- a/src/analysis/disass/block.c +++ b/src/analysis/disass/block.c @@ -41,6 +41,8 @@ struct _GBasicBlock unsigned int rank; /* Rang dans l'exécution */ + bitfield_t *domination; /* Blocs dominés de l'ensemble */ + }; /* Description d'un bloc basique d'instructions (classe) */ @@ -188,6 +190,8 @@ static void g_basic_block_dispose(GBasicBlock *block) static void g_basic_block_finalize(GBasicBlock *block) { + delete_bit_field(block->domination); + G_OBJECT_CLASS(g_basic_block_parent_class)->finalize(G_OBJECT(block)); } @@ -197,6 +201,7 @@ static void g_basic_block_finalize(GBasicBlock *block) * * * Paramètres : first = première instruction du bloc. * * last = dernière instruction du bloc. * +* bits = liste des blocs dominés. * * * * Description : Crée un bloc basique d'exécution d'instructions. * * * @@ -206,7 +211,7 @@ static void g_basic_block_finalize(GBasicBlock *block) * * ******************************************************************************/ -GBasicBlock *g_basic_block_new(GArchInstruction *first, GArchInstruction *last) +GBasicBlock *g_basic_block_new(GArchInstruction *first, GArchInstruction *last, const bitfield_t *bits) { GBasicBlock *result; /* Structure à retourner */ @@ -218,6 +223,8 @@ GBasicBlock *g_basic_block_new(GArchInstruction *first, GArchInstruction *last) g_object_ref(G_OBJECT(result->first)); g_object_ref(G_OBJECT(result->last)); + result->domination = dup_bit_field(bits); + return result; } @@ -320,6 +327,25 @@ void g_basic_block_set_rank(GBasicBlock *block, unsigned int rank) } +/****************************************************************************** +* * +* Paramètres : block = bloc d'instructions à consulter. * +* * +* Description : Indique la liste des blocs de code dominés. * +* * +* Retour : Champ de bits représentant des blocs. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const bitfield_t *g_basic_block_get_domination(const GBasicBlock *block) +{ + return block->domination; + +} + + /* ---------------------------------------------------------------------------------- */ /* REGROUPEMENT EN LISTE DE BLOCS */ @@ -499,7 +525,7 @@ void g_block_list_add_block(GBlockList *list, GBasicBlock *block, size_t index) * * ******************************************************************************/ -GBasicBlock *g_block_list_get_block(GBlockList *list, size_t index) +GBasicBlock *g_block_list_get_block(const GBlockList *list, size_t index) { assert(index < list->count); @@ -511,6 +537,32 @@ GBasicBlock *g_block_list_get_block(GBlockList *list, size_t index) /****************************************************************************** * * * Paramètres : list = liste de blocs basiques à consulter. * +* block = bloc d'instructions basique à considérer. * +* * +* Description : Fournit l'indice d'un bloc basique d'une liste de blocs. * +* * +* Retour : Indice de la position du bloc fourni en cas de succès. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t g_block_list_get_index(const GBlockList *list, GBasicBlock *block) +{ + size_t result; /* Indice trouvé à retourner */ + + for (result = 0; result < list->count; result++) + if (list->blocks[result] == block) + break; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : list = liste de blocs basiques à consulter. * * instr = instruction de début de bloc recherchée. * * * * Description : Recherche un bloc basique selon une première instruction. * |