diff options
Diffstat (limited to 'src/decomp')
-rw-r--r-- | src/decomp/context-int.h | 10 | ||||
-rw-r--r-- | src/decomp/context.c | 88 | ||||
-rw-r--r-- | src/decomp/context.h | 21 |
3 files changed, 94 insertions, 25 deletions
diff --git a/src/decomp/context-int.h b/src/decomp/context-int.h index 2be4218..8139077 100644 --- a/src/decomp/context-int.h +++ b/src/decomp/context-int.h @@ -28,6 +28,7 @@ #include "context.h" +#include "../analysis/routine.h" #include "../glibext/gnhash.h" @@ -41,18 +42,13 @@ struct _GDecContext { GObject parent; /* A laisser en premier */ - vmpa_t max; /* Première adresse à écarter */ + GExeFormat *format; /* Format binaire concerné */ + GBinRoutine *routine; /* Routine visée par l'opérat° */ GDecInstruction *list; /* Chaîne décompilée */ convert_register_fc convert_reg; /* Traduction des registres */ - GHashTable *machine; /* Correspondance reg./pseudo */ - GHashTable *ssa; /* Remplacement des pseudos */ - - GDecInstruction **pseudos; /* Liste des pseudos-registre */ - size_t count; /* Taille de cette liste */ - }; diff --git a/src/decomp/context.c b/src/decomp/context.c index 94a50c1..6905505 100644 --- a/src/decomp/context.c +++ b/src/decomp/context.c @@ -39,6 +39,12 @@ static void g_dec_context_class_init(GDecContextClass *); /* Initialise une instance de contexte de décompilation. */ static void g_dec_context_init(GDecContext *); +/* Supprime toutes les références externes. */ +static void g_dec_context_dispose(GDecContext *); + +/* Procède à la libération totale de la mémoire. */ +static void g_dec_context_finalize(GDecContext *); + /* Indique le type défini pour un contexte de décompilation. */ @@ -47,7 +53,7 @@ G_DEFINE_TYPE(GDecContext, g_dec_context, G_TYPE_OBJECT); /****************************************************************************** * * -* Paramètres : klass = classe à initialiser. * +* Paramètres : class = classe à initialiser. * * * * Description : Initialise la classe des contextes de décompilation. * * * @@ -57,8 +63,14 @@ G_DEFINE_TYPE(GDecContext, g_dec_context, G_TYPE_OBJECT); * * ******************************************************************************/ -static void g_dec_context_class_init(GDecContextClass *klass) +static void g_dec_context_class_init(GDecContextClass *class) { + GObjectClass *object; /* Autre version de la classe */ + + object = G_OBJECT_CLASS(class); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_dec_context_dispose; + object->finalize = (GObjectFinalizeFunc)g_dec_context_finalize; } @@ -77,8 +89,50 @@ static void g_dec_context_class_init(GDecContextClass *klass) static void g_dec_context_init(GDecContext *ctx) { - ctx->machine = g_hash_table_new(g_constant_hash, (GEqualFunc)g_arch_operand_compare); - ctx->ssa = g_hash_table_new(NULL, NULL); + +} + + +/****************************************************************************** +* * +* Paramètres : ctx = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_dec_context_dispose(GDecContext *ctx) +{ + if (ctx->format != NULL) + g_object_unref(G_OBJECT(ctx->format)); + + if (ctx->routine != NULL) + g_object_unref(G_OBJECT(ctx->routine)); + + G_OBJECT_CLASS(g_dec_context_parent_class)->dispose(G_OBJECT(ctx)); + +} + + +/****************************************************************************** +* * +* Paramètres : ctx = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_dec_context_finalize(GDecContext *ctx) +{ + G_OBJECT_CLASS(g_dec_context_parent_class)->finalize(G_OBJECT(ctx)); } @@ -108,19 +162,25 @@ GDecContext *g_dec_context_new(void) /****************************************************************************** * * -* Paramètres : ctx = instance à consulter. * +* Paramètres : ctx = contexte de décompilation à compléter. * +* routine = routine visée par l'opération. * +* format = format du fichier binaire associé. * * * -* Description : Indique l'adresse où la décompilation n'est plus souhaitée. * +* Description : Définit les informations essentielles à la décompilation. * * * -* Retour : Adresse mémoire ou physique. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -vmpa_t g_dec_context_get_max_address(const GDecContext *ctx) +void g_dec_context_set_info(GDecContext *ctx, GBinRoutine *routine, GExeFormat *format) { - return ctx->max; + g_object_ref(G_OBJECT(routine)); + g_object_ref(G_OBJECT(format)); + + ctx->routine = routine; + ctx->format = format; } @@ -128,19 +188,19 @@ vmpa_t g_dec_context_get_max_address(const GDecContext *ctx) /****************************************************************************** * * * Paramètres : ctx = instance à consulter. * -* max = adresse mémoire ou physique. * * * -* Description : Définit l'adresse où la décompilation n'est plus souhaitée. * +* Description : Fournit le format binaire associé au contexte. * * * -* Retour : - . * +* Retour : Format du fichier binaire décompilé. * * * * Remarques : - * * * ******************************************************************************/ -void g_dec_context_set_max_address(GDecContext *ctx, vmpa_t max) +GExeFormat *g_dec_context_get_format(const GDecContext *ctx) { - ctx->max = max; + return ctx->format; + } diff --git a/src/decomp/context.h b/src/decomp/context.h index bf584f4..2daff91 100644 --- a/src/decomp/context.h +++ b/src/decomp/context.h @@ -30,6 +30,19 @@ #include "instruction.h" #include "../arch/archbase.h" +#include "../format/executable.h" + + +/** + * Impossible d'inclure directement : + * - ../analysis/routine.h, qui inclut ../arch/instruction.h. + * - ../arch/instruction.h, qui inclut ce fichier. + * + * On redéclare donc manuellement les types manquants. + */ + +/* "../analysis/routine.h" : Représentation générique de routine (instance) */ +typedef struct _GBinRoutine GBinRoutine; @@ -55,11 +68,11 @@ GType g_dec_context_get_type(void); /* Met en place un nouveau contexte de décompilation. */ GDecContext *g_dec_context_new(void); -/* Indique l'adresse où la décompilation n'est plus souhaitée. */ -vmpa_t g_dec_context_get_max_address(const GDecContext *); +/* Définit les informations essentielles à la décompilation. */ +void g_dec_context_set_info(GDecContext *, GBinRoutine *, GExeFormat *); -/* Définit l'adresse où la décompilation n'est plus souhaitée. */ -void g_dec_context_set_max_address(GDecContext *, vmpa_t); +/* Fournit le format binaire associé au contexte. */ +GExeFormat *g_dec_context_get_format(const GDecContext *); /* Fournit le premier élément de la liste des instructions. */ GDecInstruction *g_dec_context_get_decomp_instrs(const GDecContext *tx); |