diff options
Diffstat (limited to 'src/analysis/blocks')
-rw-r--r-- | src/analysis/blocks/flow.c | 29 | ||||
-rw-r--r-- | src/analysis/blocks/flow.h | 2 |
2 files changed, 21 insertions, 10 deletions
diff --git a/src/analysis/blocks/flow.c b/src/analysis/blocks/flow.c index cd435aa..7777623 100644 --- a/src/analysis/blocks/flow.c +++ b/src/analysis/blocks/flow.c @@ -70,7 +70,7 @@ static void g_flow_block_dispose(GFlowBlock *); static void g_flow_block_finalize(GFlowBlock *); /* Recherche le bloc contenant une adresse donnée. */ -static GInstrBlock *g_flow_block_find_by_addr(const GFlowBlock *, vmpa_t, bool); +static GInstrBlock *g_flow_block_find_by_addr(const GFlowBlock *, const vmpa2t *, bool); /* Parcourt le bloc d'instructions dans un ordre donné. */ static bool g_flow_block_visit(GFlowBlock *, instr_block_visitor_cb, void *); @@ -225,7 +225,7 @@ GInstrBlock *g_flow_block_new(GArchInstruction *instrs, GArchInstruction *first, g_object_ref(G_OBJECT(result->first)); g_object_ref(G_OBJECT(result->last)); - g_flow_block_compute_regs_access(result); + //g_flow_block_compute_regs_access(result); return G_INSTR_BLOCK(result); @@ -325,15 +325,18 @@ void g_flow_block_set_next_rank(GFlowBlock *block, unsigned int rank) * * ******************************************************************************/ -static GInstrBlock *g_flow_block_find_by_addr(const GFlowBlock *block, vmpa_t addr, bool final) +static GInstrBlock *g_flow_block_find_by_addr(const GFlowBlock *block, const vmpa2t *addr, bool final) { GInstrBlock *result; /* Resultat à retourner */ - vmpa_t start; /* Adresse de début du bloc */ - vmpa_t end; /* Adresse de fin du bloc */ + vmpa2t start; /* Adresse de début du bloc */ + vmpa2t end; /* Adresse de fin du bloc */ + mrange_t range; /* Couverture globale */ g_flow_block_get_boundary_addresses(block, &start, &end); - if (start <= addr && addr <= end) + init_mrange(&range, &start, compute_vmpa_diff(&start, &end)); + + if (mrange_contains_addr(&range, addr)) result = G_INSTR_BLOCK(block); else @@ -566,13 +569,21 @@ void g_flow_block_get_boundary(const GFlowBlock *block, GArchInstruction **first * * ******************************************************************************/ -void g_flow_block_get_boundary_addresses(const GFlowBlock *block, vmpa_t *start, vmpa_t *end) +void g_flow_block_get_boundary_addresses(const GFlowBlock *block, vmpa2t *start, vmpa2t *end) { + const mrange_t *range; /* Couverture d'instruction */ + if (start != NULL) - g_arch_instruction_get_location(block->first, NULL, NULL, start); + { + range = g_arch_instruction_get_range(block->first); + copy_vmpa(start, get_mrange_addr(range)); + } if (end != NULL) - g_arch_instruction_get_location(block->last, NULL, NULL, end); + { + range = g_arch_instruction_get_range(block->last); + copy_vmpa(end, get_mrange_addr(range)); + } } diff --git a/src/analysis/blocks/flow.h b/src/analysis/blocks/flow.h index a534a69..cc32834 100644 --- a/src/analysis/blocks/flow.h +++ b/src/analysis/blocks/flow.h @@ -89,7 +89,7 @@ GArchInstruction *g_flow_block_get_all_instructions_list(const GFlowBlock *); void g_flow_block_get_boundary(const GFlowBlock *, GArchInstruction **, GArchInstruction **); /* Fournit les adresses limites d'un bloc d'exécution. */ -void g_flow_block_get_boundary_addresses(const GFlowBlock *, vmpa_t *, vmpa_t *); +void g_flow_block_get_boundary_addresses(const GFlowBlock *, vmpa2t *, vmpa2t *); /* Détermine si un bloc peut conduire à un autre. */ bool g_flow_block_is_looping_to(GFlowBlock *, const GInstrBlock *, GFlowBlock *); |