summaryrefslogtreecommitdiff
path: root/src/analysis/disass/links.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/links.c')
-rw-r--r--src/analysis/disass/links.c150
1 files changed, 75 insertions, 75 deletions
diff --git a/src/analysis/disass/links.c b/src/analysis/disass/links.c
index 43b7e6f..8d826c5 100644
--- a/src/analysis/disass/links.c
+++ b/src/analysis/disass/links.c
@@ -30,13 +30,86 @@
+/* Rétablit un lien naturel coupé par un autre lien. */
+static void establish_natural_link(GArchInstruction *, GArchInstruction *);
+
/* Complète un désassemblage accompli pour une instruction. */
static void convert_immediate_into_target(GArchInstruction *, size_t, GBinFormat *);
-/* Rétablit un lien naturel coupé par un autre lien. */
-static void establish_natural_link(GArchInstruction *, GArchInstruction *);
+/******************************************************************************
+* *
+* Paramètres : instr = instruction désassemblée à traiter. *
+* prev = instruction précédente. *
+* *
+* Description : Rétablit un lien naturel coupé par un autre lien. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev)
+{
+ GArchInstruction **others; /* Instructions diverses liées */
+ InstructionLinkType *types; /* Types de lien existants */
+ size_t count; /* Nbre de sources affichées */
+ size_t i; /* Boucle de parcours */
+
+ /**
+ * Si rien ne vient séparer les deux instructions,
+ * on ne peut pas créer de lien plus naturel que l'existant.
+ */
+
+ if (!g_arch_instruction_has_sources(instr))
+ return;
+
+ /**
+ * Si on se trouve à une extrémité, on ne se lie pas
+ * avec le voisin.
+ */
+
+ if (g_arch_instruction_get_flags(prev) & AIF_RETURN_POINT)
+ return;
+
+ if (g_arch_instruction_get_flags(instr) & AIF_ROUTINE_START)
+ return;
+
+ /**
+ * On s'assure que le lien naturel est valide.
+ */
+
+ count = g_arch_instruction_get_destinations(prev, &others, &types, NULL);
+
+ for (i = 0; i < count; i++)
+ {
+ if (types[i] == ILT_EXEC_FLOW) break;
+ if (types[i] == ILT_JUMP) break;
+ if (types[i] == ILT_CASE_JUMP) break;
+ if (types[i] == ILT_LOOP) break;
+ }
+
+ if (count > 0 && i < count) return;
+
+ /**
+ * On vérifie que le lien n'existe pas déjà avant d'en créer un...
+ */
+
+ count = g_arch_instruction_get_sources(instr, &others, &types);
+
+ for (i = 0; i < count; i++)
+ {
+ if (others[i] == prev && types[i] == ILT_JUMP_IF_TRUE) break;
+ if (others[i] == prev && types[i] == ILT_JUMP_IF_FALSE) break;
+ }
+
+ if (i == count)
+ g_arch_instruction_link_with(prev, instr, ILT_EXEC_FLOW);
+
+}
+
/******************************************************************************
* *
@@ -125,79 +198,6 @@ static void establish_links_for_instruction(GArchInstruction *instr, GArchInstru
/******************************************************************************
* *
-* Paramètres : instr = instruction désassemblée à traiter. *
-* prev = instruction précédente. *
-* *
-* Description : Rétablit un lien naturel coupé par un autre lien. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev)
-{
- GArchInstruction **others; /* Instructions diverses liées */
- InstructionLinkType *types; /* Types de lien existants */
- size_t count; /* Nbre de sources affichées */
- size_t i; /* Boucle de parcours */
-
- /**
- * Si rien ne vient séparer les deux instructions,
- * on ne peut pas créer de lien plus naturel que l'existant.
- */
-
- if (!g_arch_instruction_has_sources(instr))
- return;
-
- /**
- * Si on se trouve à une extrémité, on ne se lie pas
- * avec le voisin.
- */
-
- if (g_arch_instruction_get_flags(prev) & AIF_RETURN_POINT)
- return;
-
- if (g_arch_instruction_get_flags(instr) & AIF_ROUTINE_START)
- return;
-
- /**
- * On s'assure que le lien naturel est valide.
- */
-
- count = g_arch_instruction_get_destinations(prev, &others, &types, NULL);
-
- for (i = 0; i < count; i++)
- {
- if (types[i] == ILT_EXEC_FLOW) break;
- if (types[i] == ILT_JUMP) break;
- if (types[i] == ILT_CASE_JUMP) break;
- if (types[i] == ILT_LOOP) break;
- }
-
- if (count > 0 && i < count) return;
-
- /**
- * On vérifie que le lien n'existe pas déjà avant d'en créer un...
- */
-
- count = g_arch_instruction_get_sources(instr, &others, &types);
-
- for (i = 0; i < count; i++)
- {
- if (others[i] == prev && types[i] == ILT_JUMP_IF_TRUE) break;
- if (others[i] == prev && types[i] == ILT_JUMP_IF_FALSE) break;
- }
-
- if (i == count)
- g_arch_instruction_link_with(prev, instr, ILT_EXEC_FLOW);
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : list = ensemble d'instructions à relier. *
* format = accès aux données du binaire d'origine. *
* statusbar = barre de statut avec progression à mettre à jour.*