summaryrefslogtreecommitdiff
path: root/src/analysis/disass/dragon.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-05-28 14:39:56 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-05-28 14:42:41 (GMT)
commit3154db88ce14aa681cc553a8910edba1e69d8c2b (patch)
treec54fa0190da66831c19c83ae57dba117e56387e7 /src/analysis/disass/dragon.c
parented70a0bacfdca738ba29d50e9f1b02290f28b9b8 (diff)
Built the basic blocks list simply at loading.
Diffstat (limited to 'src/analysis/disass/dragon.c')
-rw-r--r--src/analysis/disass/dragon.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/analysis/disass/dragon.c b/src/analysis/disass/dragon.c
index 75b8bb7..98b1cd6 100644
--- a/src/analysis/disass/dragon.c
+++ b/src/analysis/disass/dragon.c
@@ -735,3 +735,47 @@ dragon_node *find_knight_node_for_instruction(const dragon_knight *knight, bool
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : knight = rassemblement des complexités de code. *
+* *
+* Description : Traduit une complexité de noeuds en liste de blocs basiques. *
+* *
+* Retour : Liste de blocs basiques créés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBlockList *translate_dragon_knight(const dragon_knight *knight)
+{
+ GBlockList *result; /* Liste à retourner */
+ dragon_node *nodes; /* Liste des noeuds détectés */
+ size_t count; /* Taille de cette liste */
+ size_t i; /* Boucle de parcours */
+ dragon_node *node; /* Noeud à traiter */
+ GArchInstruction *first; /* Première instruction */
+ GArchInstruction *last; /* Dernière instruction */
+ GBasicBlock *block; /* Nouveau bloc basique */
+
+ get_dragon_knight_content(knight, &nodes, &count);
+
+ result = g_block_list_new(count);
+
+ for (i = 0; i < count; i++)
+ {
+ node = get_dragon_node(nodes, i);
+
+ get_dragon_node_bounding_instructions(node, &first, &last);
+
+ block = g_basic_block_new(first, last);
+
+ g_block_list_add_block(result, block, i);
+
+ }
+
+ return result;
+
+}