summaryrefslogtreecommitdiff
path: root/src/decomp
diff options
context:
space:
mode:
Diffstat (limited to 'src/decomp')
-rw-r--r--src/decomp/context-int.h10
-rw-r--r--src/decomp/context.c88
-rw-r--r--src/decomp/context.h21
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);