summaryrefslogtreecommitdiff
path: root/src/analysis/disass/dragon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/dragon.c')
-rw-r--r--src/analysis/disass/dragon.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/analysis/disass/dragon.c b/src/analysis/disass/dragon.c
index c817727..6220014 100644
--- a/src/analysis/disass/dragon.c
+++ b/src/analysis/disass/dragon.c
@@ -101,11 +101,12 @@ static dragon_node *create_dragon_nodes(const GArchProcessor *proc, const instr_
GArchInstruction *last; /* Mémorisation du passé */
GArchInstruction *iter; /* Boucle de parcours */
const mrange_t *irange; /* Emplacement d'instruction */
- InstructionLinkType *types; /* Type de lien entre instr. */
+ instr_link_t *sources; /* Liste des instructions liées*/
size_t scount; /* Nombre de liens de source */
bool cut; /* Un découpage a été réalisé ?*/
size_t i; /* Boucle de parcours */
dragon_node *new; /* Nouvel élément à créer */
+ instr_link_t *dests; /* Liste des instructions liées*/
size_t dcount; /* Nombre de liens de dest. */
result = NULL;
@@ -165,12 +166,12 @@ static dragon_node *create_dragon_nodes(const GArchProcessor *proc, const instr_
/* Analyse des sources */
g_arch_instruction_rlock_src(iter);
- scount = g_arch_instruction_get_sources(iter, NULL, &types);
+ scount = g_arch_instruction_get_sources(iter, &sources);
cut = false;
for (i = 0; i < scount && !cut; i++)
- switch (types[i])
+ switch (sources[i].type)
{
case ILT_EXEC_FLOW:
case ILT_JUMP:
@@ -209,12 +210,12 @@ static dragon_node *create_dragon_nodes(const GArchProcessor *proc, const instr_
/* Analyse des destinations */
g_arch_instruction_rlock_dest(iter);
- dcount = g_arch_instruction_get_destinations(iter, NULL, &types);
+ dcount = g_arch_instruction_get_destinations(iter, &dests);
cut = false;
for (i = 0; i < dcount && !cut; i++)
- switch (types[i])
+ switch (dests[i].type)
{
case ILT_JUMP:
@@ -431,18 +432,17 @@ void compute_all_paths(dragon_node *nodes, size_t count)
{
void follow_flow_in_nodes(dragon_node *node)
{
- GArchInstruction **dests; /* Instr. visée par une autre */
- InstructionLinkType *types; /* Type de lien entre lignes */
+ instr_link_t *dests; /* Liste des instructions liées*/
size_t dcount; /* Nombre de liens de dest. */
size_t i; /* Boucle de parcours */
dragon_node *next; /* Noeud suivant dans le code */
size_t id; /* Indice du bit associé */
g_arch_instruction_rlock_dest(node->last);
- dcount = g_arch_instruction_get_destinations(node->last, &dests, &types);
+ dcount = g_arch_instruction_get_destinations(node->last, &dests);
for (i = 0; i < dcount; i++)
- switch (types[i])
+ switch (dests[i].type)
{
case ILT_EXEC_FLOW:
case ILT_JUMP:
@@ -450,7 +450,7 @@ void compute_all_paths(dragon_node *nodes, size_t count)
case ILT_JUMP_IF_TRUE:
case ILT_JUMP_IF_FALSE:
- next = find_node_for_instruction(nodes, count, false, dests[i]);
+ next = find_node_for_instruction(nodes, count, false, dests[i].linked);
if (next == NULL) break;
id = get_dragon_node_index(nodes, next);
@@ -514,8 +514,7 @@ void compute_all_dominators(dragon_node *nodes, size_t count)
size_t k; /* Boucle de parcours #1 */
dragon_node *node; /* Noeud à traiter */
dragon_node *predecessor; /* Noeud prédécesseur direct */
- GArchInstruction **srcs; /* Instructions d'origine */
- InstructionLinkType *types; /* Type de lien entre instr. */
+ instr_link_t *sources; /* Instructions d'origine */
size_t scount; /* Nombre de liens de source */
size_t i; /* Boucle de parcours #2 */
@@ -532,11 +531,11 @@ void compute_all_dominators(dragon_node *nodes, size_t count)
set_all_in_bit_field(inter);
g_arch_instruction_rlock_src(node->first);
- scount = g_arch_instruction_get_sources(node->first, &srcs, &types);
+ scount = g_arch_instruction_get_sources(node->first, &sources);
//assert(scount > 0); // un 'ret' coupe, le suivant n'a pas de source
for (i = 0; i < scount; i++)
- switch (types[i])
+ switch (sources[i].type)
{
case ILT_EXEC_FLOW:
case ILT_JUMP:
@@ -544,7 +543,7 @@ void compute_all_dominators(dragon_node *nodes, size_t count)
case ILT_JUMP_IF_TRUE:
case ILT_JUMP_IF_FALSE:
- predecessor = find_node_for_instruction(nodes, count, true, srcs[i]);
+ predecessor = find_node_for_instruction(nodes, count, true, sources[i].linked);
/*
printf(" -- finding pred @ 0x%08x -> 0x%08x :: %p\n",