diff options
Diffstat (limited to 'src/analysis/block.h')
-rw-r--r-- | src/analysis/block.h | 143 |
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 *); |