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 *);  | 
