summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--src/analysis/disass/loop.c16
-rw-r--r--src/gtkext/gtklinkrenderer.c3
3 files changed, 25 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0086536..daab6e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
13-02-24 Cyrille Bagard <nocbos@gmail.com>
+ * src/analysis/disass/loop.c:
+ Fix a bug in loops detection.
+
+ * src/gtkext/gtklinkrenderer.c:
+ Underline the links for loops on screen.
+
+13-02-24 Cyrille Bagard <nocbos@gmail.com>
+
* src/analysis/decomp/cmerge.c:
* src/analysis/decomp/cmerge.h:
New entries: begin to merge conditions when possible.
diff --git a/src/analysis/disass/loop.c b/src/analysis/disass/loop.c
index 301f084..6fd73f2 100644
--- a/src/analysis/disass/loop.c
+++ b/src/analysis/disass/loop.c
@@ -196,6 +196,7 @@ static void add_step_into_exec_flow(exec_flow *flow, vmpa_t addr)
static void track_loops_in_code(GArchInstruction *list, vmpa_t start, vmpa_t end, exec_flow *flow)
{
+ bool exit_track; /* Détermine la fin du parcours*/
GArchInstruction *iter; /* Boucle de parcours */
GArchInstruction **dests; /* Instr. visée par une autre */
InstructionLinkType *types; /* Type de lien entre lignes */
@@ -206,16 +207,23 @@ static void track_loops_in_code(GArchInstruction *list, vmpa_t start, vmpa_t end
add_step_into_exec_flow(flow, start);
+ exit_track = false;
+
for (iter = g_arch_instruction_find_by_address(list, start, true);
- iter != NULL;
+ iter != NULL && !exit_track;
iter = g_arch_instruction_get_next_iter(list, iter, end))
{
dcount = g_arch_instruction_get_destinations(iter, &dests, &types, NULL);
+ if (dcount == 0) continue;
for (i = 0; i < dcount; i++)
switch (types[i])
{
case ILT_LOOP:
+ /**
+ * On est déjà passé par là, donc on peut arrêter le parcours courant.
+ */
+ exit_track = true;
break;
case ILT_CALL:
@@ -223,6 +231,12 @@ static void track_loops_in_code(GArchInstruction *list, vmpa_t start, vmpa_t end
break;
default:
+ /**
+ * On se lance dans d'autres suivis qui vont parcourir le reste des
+ * instructions, donc on peut arrêter le parcours courant ici.
+ */
+ exit_track = true;
+
g_arch_instruction_get_location(dests[i], NULL, NULL, &addr);
if (!is_new_exec_flow(flow, addr))
diff --git a/src/gtkext/gtklinkrenderer.c b/src/gtkext/gtklinkrenderer.c
index 1d4a86d..7ef1c37 100644
--- a/src/gtkext/gtklinkrenderer.c
+++ b/src/gtkext/gtklinkrenderer.c
@@ -240,8 +240,9 @@ void _gtk_link_renderer_draw(const GtkLinkRenderer *renderer, cairo_t *cairo, bo
/**
* Si on ne veut pas de flèche, on doit se destiner à un aperçu...
* Dans ce cas, pour plus de lisibilité, on double la taille d'impression.
+ * Et pour faire ressortir les boucles, on double encore les liens associés.
*/
- cairo_set_line_width(cairo, arrow ? 1 : 2);
+ cairo_set_line_width(cairo, arrow ? 1 : (renderer->color == LKC_BLUE ? 4 : 2));
cairo_move_to(cairo, renderer->points[0].x + 0.5, renderer->points[0].y);