summaryrefslogtreecommitdiff
path: root/src/analysis/blocks/virtual.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2013-01-13 20:23:05 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2013-01-13 20:23:05 (GMT)
commit35a6cd881528b5f77ce09476eccb39d02d9cc634 (patch)
tree13e0f080a277eb0647b6917f18fbe2cb84a67369 /src/analysis/blocks/virtual.c
parent221bcaeeb06415d501f9abbb9bc4b7d8339af1fe (diff)
Defined the registers allocation needs for each basic block.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@323 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/blocks/virtual.c')
-rw-r--r--src/analysis/blocks/virtual.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/analysis/blocks/virtual.c b/src/analysis/blocks/virtual.c
index 2385f67..584e57d 100644
--- a/src/analysis/blocks/virtual.c
+++ b/src/analysis/blocks/virtual.c
@@ -43,9 +43,10 @@ struct _GVirtualBlock
GInstrBlock **children; /* Sous-blocs intégrés */
size_t children_count; /* Nombre de ces sous-blocs */
+#if 0
reg_access *accesses; /* Commodités d'accès #1 */
size_t count; /* Commodités d'accès #2 */
-
+#endif
};
@@ -70,7 +71,7 @@ static void g_virtual_block_dispose(GVirtualBlock *);
static void g_virtual_block_finalize(GVirtualBlock *);
/* Recherche le bloc contenant une adresse donnée. */
-static GInstrBlock *g_virtual_block_find_by_addr(const GVirtualBlock *, vmpa_t);
+static GInstrBlock *g_virtual_block_find_by_addr(const GVirtualBlock *, vmpa_t, bool);
/* Parcours le bloc d'instructions dans un ordre donné. */
static bool g_virtual_block_visit(GVirtualBlock *, instr_block_visitor_cb, void *);
@@ -79,7 +80,7 @@ static bool g_virtual_block_visit(GVirtualBlock *, instr_block_visitor_cb, void
static void g_virtual_block_list_all_blocks(const GVirtualBlock *, GInstrBlock ***, size_t *);
/* Fournit les différents accès aux registres. */
-static const reg_access *g_virtual_block_list_regs_accesses(const GVirtualBlock *, size_t *);
+//static const reg_access *g_virtual_block_list_regs_accesses(const GVirtualBlock *, size_t *);
@@ -132,7 +133,7 @@ static void g_virtual_block_init(GVirtualBlock *block)
parent->find_by_addr = (find_by_addr_fc)g_virtual_block_find_by_addr;
parent->visit_blocks = (visit_all_blocks_fc)g_virtual_block_visit;
parent->list_blocks = (list_all_blocks_fc)g_virtual_block_list_all_blocks;
- parent->list_regs = (list_regs_accesses_fc)g_virtual_block_list_regs_accesses;
+ //parent->list_regs = (list_regs_accesses_fc)g_virtual_block_list_regs_accesses;
}
@@ -175,9 +176,6 @@ static void g_virtual_block_dispose(GVirtualBlock *block)
static void g_virtual_block_finalize(GVirtualBlock *block)
{
- if (block->accesses != NULL)
- free(block->accesses);
-
if (block->children != NULL)
free(block->children);
@@ -213,6 +211,7 @@ GInstrBlock *g_virtual_block_new(void)
* *
* Paramètres : block = bloc de départ des recherches. *
* addr = ensemble de blocs à parcourir. *
+* final = indique si la cible ou le conteneur est renvoyée. *
* *
* Description : Recherche le bloc contenant une adresse donnée. *
* *
@@ -222,16 +221,25 @@ GInstrBlock *g_virtual_block_new(void)
* *
******************************************************************************/
-static GInstrBlock *g_virtual_block_find_by_addr(const GVirtualBlock *block, vmpa_t addr)
+static GInstrBlock *g_virtual_block_find_by_addr(const GVirtualBlock *block, vmpa_t addr, bool final)
{
GInstrBlock *result; /* Resultat à retourner */
size_t i; /* Boucle de parcours */
+ GInstrBlock *ret; /* Retour des inspections */
result = NULL;
for (i = 0; i < block->children_count && result == NULL; i++)
- if (g_instr_block_find_by_addr(block->children[i], addr))
- result = block->children[i];
+ {
+ ret = g_instr_block_find_by_addr(block->children[i], addr, final);
+
+ if (ret != NULL)
+ {
+ if (final) result = ret;
+ else result = block->children[i];
+ }
+
+ }
return result;
@@ -292,7 +300,7 @@ static void g_virtual_block_list_all_blocks(const GVirtualBlock *block, GInstrBl
}
-
+#if 0
/******************************************************************************
* *
* Paramètres : block = bloc d'instructions à consulter. *
@@ -313,6 +321,7 @@ static const reg_access *g_virtual_block_list_regs_accesses(const GVirtualBlock
return NULL;
}
+#endif
/******************************************************************************