summaryrefslogtreecommitdiff
path: root/src/analysis/disass/rank.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-05-28 14:39:56 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-05-28 14:42:41 (GMT)
commit3154db88ce14aa681cc553a8910edba1e69d8c2b (patch)
treec54fa0190da66831c19c83ae57dba117e56387e7 /src/analysis/disass/rank.c
parented70a0bacfdca738ba29d50e9f1b02290f28b9b8 (diff)
Built the basic blocks list simply at loading.
Diffstat (limited to 'src/analysis/disass/rank.c')
-rw-r--r--src/analysis/disass/rank.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/analysis/disass/rank.c b/src/analysis/disass/rank.c
index 85d9e66..3694d04 100644
--- a/src/analysis/disass/rank.c
+++ b/src/analysis/disass/rank.c
@@ -24,6 +24,10 @@
#include "rank.h"
+
+
+#if 0
+
#include <assert.h>
#include <sys/param.h>
@@ -263,3 +267,127 @@ void rank_routine_blocks(GBinRoutine *routine)
}
+
+
+
+#endif
+
+
+
+
+
+
+
+#include <assert.h>
+
+
+
+/* Classe les blocs basiques d'une routine. */
+void rank_routine_block(const GBlockList *, GBasicBlock *);
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : list = ensemble de blocs basiques à traiter. *
+* block = bloc d'analyse courant. *
+* *
+* Description : Classe les blocs basiques d'une routine. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void rank_routine_block(const GBlockList *list, GBasicBlock *block)
+{
+ unsigned int next; /* Rang suivant obtenu */
+ GArchInstruction *last; /* Dernière instruction du bloc*/
+ GArchInstruction **dests; /* Instr. visée par une autre */
+ InstructionLinkType *types; /* Type de lien entre lignes */
+ size_t dcount; /* Nombre de liens de dest. */
+ size_t i; /* Boucle de parcours */
+ GBasicBlock *target; /* Bloc ciblé par un lien */
+ unsigned int rank; /* Rang à constituer */
+
+ next = g_basic_block_get_rank(block) + 1;
+
+ g_basic_block_get_boundary(block, NULL, &last);
+
+ g_arch_instruction_rlock_dest(last);
+ dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL);
+
+ for (i = 0; i < dcount; i++)
+ {
+ /* La boucle de remontée n'abaisse pas les rangs */
+ if (types[i] == ILT_LOOP) continue;
+
+ target = g_block_list_find_by_starting_instr(list, dests[i]);
+
+ /**
+ * Les sauts ne se font pas toujours à l'intérieur d'une même fonction.
+ * Par exemple sous ARM :
+ *
+ * 00008358 <call_gmon_start>:
+ * ....
+ * 8362: f7ff bfcf b.w 8304 <_init+0x38>
+ * ....
+ *
+ */
+
+ if (target != NULL)
+ {
+ rank = g_basic_block_get_rank(target);
+
+ if (next > rank)
+ {
+ g_basic_block_set_rank(target, rank);
+
+ rank_routine_block(list, target);
+
+ }
+
+ }
+
+ }
+
+ g_arch_instruction_runlock_dest(last);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine regroupant les blocs à traiter. *
+* *
+* Description : Classe les blocs des routines. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void rank_routine_blocks(GBinRoutine *routine)
+{
+ GBlockList *blocks; /* Ensemble des blocs d'instr. */
+ GBasicBlock *start; /* Bloc basique de départ */
+
+ blocks = g_binary_routine_get_basic_blocks(routine);
+
+ start = g_block_list_get_block(blocks, 0 /* FIXME */);
+ assert(start != NULL);
+
+
+
+
+ rank_routine_block(blocks, start);
+
+
+
+
+
+
+}