diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-10-09 11:35:00 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-10-09 11:35:00 (GMT) |
commit | 3628caa2311ee89ad0d2a0aa2438d7e85b497da4 (patch) | |
tree | bf81ed850cec1a35cdcaeff25a3479182e365c3c /src/analysis/disass | |
parent | b6427496bde6f3ab34dc62d6b437c4f8a3a29b2d (diff) |
Defined a new and simpler way to produce graphical view of basic blocks.
Diffstat (limited to 'src/analysis/disass')
-rw-r--r-- | src/analysis/disass/block.c | 56 | ||||
-rw-r--r-- | src/analysis/disass/block.h | 11 | ||||
-rw-r--r-- | src/analysis/disass/dragon.c | 2 |
3 files changed, 64 insertions, 5 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. * diff --git a/src/analysis/disass/block.h b/src/analysis/disass/block.h index 8d38976..755dbe6 100644 --- a/src/analysis/disass/block.h +++ b/src/analysis/disass/block.h @@ -29,6 +29,7 @@ #include "../../arch/instruction.h" +#include "../../common/bits.h" @@ -54,7 +55,7 @@ typedef struct _GBasicBlockClass GBasicBlockClass; GType g_basic_block_get_type(void); /* Crée un bloc basique d'exécution d'instructions. */ -GBasicBlock *g_basic_block_new(GArchInstruction *, GArchInstruction *); +GBasicBlock *g_basic_block_new(GArchInstruction *, GArchInstruction *, const bitfield_t *); /* Fournit les instructions limites d'un bloc basique. */ void g_basic_block_get_boundary(const GBasicBlock *, GArchInstruction **, GArchInstruction **); @@ -68,6 +69,9 @@ unsigned int g_basic_block_get_rank(const GBasicBlock *); /* Définit le rang du bloc basique dans le flot d'exécution. */ void g_basic_block_set_rank(GBasicBlock *, unsigned int); +/* Indique la liste des blocs de code dominés. */ +const bitfield_t *g_basic_block_get_domination(const GBasicBlock *); + /* ------------------------- REGROUPEMENT EN LISTE DE BLOCS ------------------------- */ @@ -101,7 +105,10 @@ size_t g_block_list_count_blocks(const GBlockList *); void g_block_list_add_block(GBlockList *, GBasicBlock *, size_t); /* Fournit un bloc basique à d'une liste définie. */ -GBasicBlock *g_block_list_get_block(GBlockList *, size_t ); +GBasicBlock *g_block_list_get_block(const GBlockList *, size_t ); + +/* Fournit l'indice d'un bloc basique d'une liste de blocs. */ +size_t g_block_list_get_index(const GBlockList *, GBasicBlock *); /* Recherche un bloc basique selon une première instruction. */ GBasicBlock *g_block_list_find_by_starting_instr(const GBlockList *, GArchInstruction *); diff --git a/src/analysis/disass/dragon.c b/src/analysis/disass/dragon.c index 98b1cd6..24c24dc 100644 --- a/src/analysis/disass/dragon.c +++ b/src/analysis/disass/dragon.c @@ -770,7 +770,7 @@ GBlockList *translate_dragon_knight(const dragon_knight *knight) get_dragon_node_bounding_instructions(node, &first, &last); - block = g_basic_block_new(first, last); + block = g_basic_block_new(first, last, node->bits); g_block_list_add_block(result, block, i); |