summaryrefslogtreecommitdiff
path: root/src/analysis/blocks
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/blocks')
-rw-r--r--src/analysis/blocks/flow.c29
-rw-r--r--src/analysis/blocks/flow.h2
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 *);