summaryrefslogtreecommitdiff
path: root/src/analysis/disass/block.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/block.c')
-rw-r--r--src/analysis/disass/block.c56
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. *