summaryrefslogtreecommitdiff
path: root/src/analysis/disass/loop.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-04-16 21:51:10 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-04-16 21:51:10 (GMT)
commitf21c18a6933036bd4cfec25446ac363c63997c13 (patch)
tree0f31a44028ed0892684c6485a598b3c672c1ca72 /src/analysis/disass/loop.c
parent90923fccb863075722d2ed17360e2c330b262e04 (diff)
Fixed some bugs in the basic blocks building.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@512 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/disass/loop.c')
-rw-r--r--src/analysis/disass/loop.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/analysis/disass/loop.c b/src/analysis/disass/loop.c
index 44fa6d5..9a99bc4 100644
--- a/src/analysis/disass/loop.c
+++ b/src/analysis/disass/loop.c
@@ -227,6 +227,20 @@ static void track_loops_in_code(const GArchProcessor *proc, const mrange_t *rang
if (g_arch_instruction_is_return(iter))
break;
+ /**
+ * Afin de détecter les boucles le plus en aval possible,
+ * on marque toutes les arrivées potentielles de boucles comme jalons.
+ * Ainsi la détection se réalise sur l'ultime saut qui boucle effectivement.
+ */
+ if (g_arch_instruction_has_sources(iter))
+ {
+ addr = get_mrange_addr(irange);
+
+ if (is_new_exec_flow(flow, addr))
+ add_step_into_exec_flow(flow, addr);
+
+ }
+
/* Analyse des destinations */
dcount = g_arch_instruction_get_destinations(iter, &dests, &types, NULL);