diff options
Diffstat (limited to 'src/analysis/disass/dragon.c')
-rw-r--r-- | src/analysis/disass/dragon.c | 29 |
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", |