summaryrefslogtreecommitdiff
path: root/src/analysis/block.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/block.h')
-rw-r--r--src/analysis/block.h143
1 files changed, 110 insertions, 33 deletions
diff --git a/src/analysis/block.h b/src/analysis/block.h
index 20b018d..9087abf 100644
--- a/src/analysis/block.h
+++ b/src/analysis/block.h
@@ -1,6 +1,6 @@
/* Chrysalide - Outil d'analyse de fichiers binaires
- * block.h - prototypes pour l'encadrement des instructions par blocs
+ * block.h - prototypes pour l'encadrement des blocs de code
*
* Copyright (C) 2012-2017 Cyrille Bagard
*
@@ -30,58 +30,135 @@
#include <stdbool.h>
+#include "../arch/instruction.h"
#include "../arch/vmpa.h"
+#include "../common/bits.h"
+#include "../glibext/gbufferview.h"
+#include "../glibext/linesegment.h"
-#define G_TYPE_INSTR_BLOCK g_instr_block_get_type()
-#define G_INSTR_BLOCK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_instr_block_get_type(), GInstrBlock))
-#define G_IS_INSTR_BLOCK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_instr_block_get_type()))
-#define G_INSTR_BLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_INSTR_BLOCK, GInstrBlockClass))
-#define G_IS_INSTR_BLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_INSTR_BLOCK))
-#define G_INSTR_BLOCK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_INSTR_BLOCK, GInstrBlockClass))
+/* ----------------------------- BLOC DE CODE GENERIQUE ----------------------------- */
-/* Description d'un bloc d'instructions (instance) */
-typedef struct _GInstrBlock GInstrBlock;
+#define G_TYPE_CODE_BLOCK g_code_block_get_type()
+#define G_CODE_BLOCK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_CODE_BLOCK, GCodeBlock))
+#define G_IS_CODE_BLOCK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_CODE_BLOCK))
+#define G_CODE_BLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_CODE_BLOCK, GCodeBlockClass))
+#define G_IS_CODE_BLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_CODE_BLOCK))
+#define G_CODE_BLOCK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_CODE_BLOCK, GCodeBlockClass))
-/* Description d'un bloc d'instructions (classe) */
-typedef struct _GInstrBlockClass GInstrBlockClass;
+/* Description d'un bloc de code (instance) */
+typedef struct _GCodeBlock GCodeBlock;
-/* Position au cours d'une visite */
-typedef enum _BlockVisitOrder
+/* Description d'un bloc de code (classe) */
+typedef struct _GCodeBlockClass GCodeBlockClass;
+
+
+/* Indique le type défini pour un bloc de code. */
+GType g_code_block_get_type(void);
+
+/* Indique la liste des blocs de code dominés. */
+const bitfield_t *g_code_block_get_domination(const GCodeBlock *);
+
+/* Indique l'indice d'intégration du bloc dans une liste. */
+size_t g_code_block_get_index(const GCodeBlock *);
+
+/* Fournit le rang du bloc de code dans le flot d'exécution. */
+size_t g_code_block_get_rank(const GCodeBlock *);
+
+/* Définit le rang du bloc de code dans le flot d'exécution. */
+void g_code_block_set_rank(GCodeBlock *, size_t);
+
+/* Fournit la représentation graphique d'un bloc de code. */
+GBufferView *g_code_block_get_view(GCodeBlock *, segcnt_list *);
+
+
+
+/* ------------------- DEFINITION DE LIAISONS ENTRE BLOCS DE CODE ------------------- */
+
+
+/* Déscription d'une liaison entre deux blocs */
+typedef struct _block_link_t
{
- BVO_IN, /* Entrée dans un gros bloc */
- BVO_PENDING, /* Visite d'un bloc simple */
- BVO_OUT /* Sortie d'un gros bloc */
+ GCodeBlock *linked; /* Autre bloc de code lié */
+ InstructionLinkType type; /* Type de liaison */
+
+} block_link_t;
+
+
+#define ref_block_link(l) g_object_ref(G_OBJECT(l->linked));
+#define unref_block_link(l) g_object_unref(G_OBJECT(l->linked));
+
+
+/* Met à disposition un encadrement des accès aux liens. */
+void g_code_block_lock_unlock_links(GCodeBlock *, bool, bool);
+
+/* Etablit un lien entre deux blocs de code. */
+void g_code_block_link_with(GCodeBlock *, GCodeBlock *, InstructionLinkType);
+
+/* Supprime tous les liens établis avec d'autres blocs de code. */
+void g_code_block_delete_all_links(GCodeBlock *block);
+
+#define g_code_block_lock_src(blk) g_code_block_lock_unlock_links(blk, true, true)
+#define g_code_block_unlock_src(blk) g_code_block_lock_unlock_links(blk, true, false)
+
+/* Fournit la quantité de blocs de code pointant vers un autre. */
+size_t g_code_block_count_sources(const GCodeBlock *);
+
+/* Fournit les détails d'une origine d'un bloc de code donné. */
+const block_link_t *g_code_block_get_source(GCodeBlock *, size_t);
+
+#define g_code_block_lock_dest(blk) g_code_block_lock_unlock_links(blk, false, true)
+#define g_code_block_unlock_dest(blk) g_code_block_lock_unlock_links(blk, false, false)
+
+/* Donne le nombre de blocs de code suivants dans le flot. */
+size_t g_code_block_count_destinations(const GCodeBlock *);
+
+/* Fournit les détails d'une destination de bloc de code. */
+const block_link_t *g_code_block_get_destination(GCodeBlock *, size_t);
+
+
+
+/* ------------------------- REGROUPEMENT EN LISTE DE BLOCS ------------------------- */
+
+
+#define G_TYPE_BLOCK_LIST g_block_list_get_type()
+#define G_BLOCK_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BLOCK_LIST, GBlockList))
+#define G_IS_BLOCK_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BLOCK_LIST))
+#define G_BLOCK_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BLOCK_LIST, GBlockListClass))
+#define G_IS_BLOCK_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BLOCK_LIST))
+#define G_BLOCK_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BLOCK_LIST, GBlockListClass))
+
-} BlockVisitOrder;
+/* Description d'une liste de blocs de code (instance) */
+typedef struct _GBlockList GBlockList;
-/* Rappel à chaque bloc visité */
-typedef bool (* instr_block_visitor_cb) (GInstrBlock *, BlockVisitOrder, void *);
+/* Description d'une liste de blocs de code (classe) */
+typedef struct _GBlockListClass GBlockListClass;
-/* Indique le type défini pour un bloc d'instructions. */
-GType g_instr_block_get_type(void);
+/* Indique le type défini pour une liste de blocs de code. */
+GType g_block_list_get_type(void);
-/* Recherche le bloc contenant une adresse donnée. */
-GInstrBlock *g_instr_block_find_by_addr(const GInstrBlock *, const vmpa2t *, bool);
+/* Crée une liste de blocs de code. */
+GBlockList *g_block_list_new(size_t);
-/* Parcourt tous les blocs d'instructions dans un ordre donné. */
-bool g_instr_block_visit(GInstrBlock *, instr_block_visitor_cb, void *);
+/* Compte le nombre de blocs de code représentés. */
+size_t g_block_list_count_blocks(const GBlockList *);
-/* Etablit la liste de tous les blocs présents. */
-void g_instr_block_list_all_blocks(const GInstrBlock *, GInstrBlock ***, size_t *);
+/* Ajoute un bloc de code à une liste définie. */
+void g_block_list_add_block(GBlockList *, GCodeBlock *, size_t);
-/* Etablit la liste de tous les blocs terminaux. */
-void g_instr_block_list_leafs_blocks(const GInstrBlock *, GInstrBlock ***, size_t *);
+/* Etablit les liens entre les blocs de code et leurs voisins. */
+void g_block_list_resolve_links(const GBlockList *);
-/* Définit l'ensemble contenant les blocs liés. */
-void g_instr_block_set_links_block(GInstrBlock *, GInstrBlock *);
+/* Fournit le bloc de code correspondant à un indice de liste. */
+GCodeBlock *g_block_list_get_block(const GBlockList *, size_t);
-/* Fournit l'ensemble contenant les blocs liés. */
-GInstrBlock *g_instr_block_get_links_block(const GInstrBlock *);
+/* Recherche un bloc de code débutant à une adresse donnée. */
+GCodeBlock *g_block_list_find_by_starting_instr(const GBlockList *, const vmpa2t *);