summaryrefslogtreecommitdiff
path: root/src/decomp
diff options
context:
space:
mode:
Diffstat (limited to 'src/decomp')
-rwxr-xr-xsrc/decomp/Makefile.am1
-rw-r--r--src/decomp/context-int.h68
-rw-r--r--src/decomp/context.c54
-rw-r--r--src/decomp/context.h2
-rw-r--r--src/decomp/expr/pseudo.c23
-rw-r--r--src/decomp/expr/pseudo.h3
6 files changed, 100 insertions, 51 deletions
diff --git a/src/decomp/Makefile.am b/src/decomp/Makefile.am
index ccae8ad..ab12e01 100755
--- a/src/decomp/Makefile.am
+++ b/src/decomp/Makefile.am
@@ -2,6 +2,7 @@
noinst_LTLIBRARIES = libdecomp.la
libdecomp_la_SOURCES = \
+ context.-int.h \
context.h context.c \
expression-int.h \
expression.h expression.c \
diff --git a/src/decomp/context-int.h b/src/decomp/context-int.h
new file mode 100644
index 0000000..2be4218
--- /dev/null
+++ b/src/decomp/context-int.h
@@ -0,0 +1,68 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * context.c - mise en place d'un contexte de décompilation
+ *
+ * Copyright (C) 2010 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenIDA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _DECOMP_CONTEXT_INT_H
+#define _DECOMP_CONTEXT_INT_H
+
+
+#include "context.h"
+
+
+#include "../glibext/gnhash.h"
+
+
+
+/* Convertit un registre machine en un pseudo-registre. */
+typedef GDecInstruction * (* convert_register_fc) (GDecContext *, gpointer, bool);
+
+
+/* Définition d'une context décompilée (instance) */
+struct _GDecContext
+{
+ GObject parent; /* A laisser en premier */
+
+ vmpa_t max; /* Première adresse à écarter */
+
+ 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 */
+
+};
+
+
+/* Définition d'une context décompilée (classe) */
+struct _GDecContextClass
+{
+ GObjectClass parent; /* A laisser en premier */
+
+};
+
+
+
+#endif /* _DECOMP_CONTEXT_INT_H */
diff --git a/src/decomp/context.c b/src/decomp/context.c
index 15215eb..9db0bca 100644
--- a/src/decomp/context.c
+++ b/src/decomp/context.c
@@ -27,39 +27,13 @@
#include <malloc.h>
+#include "context-int.h"
#include "instruction-int.h"
-#include "expr/pseudo.h"
#include "../arch/operand.h"
-#include "../glibext/gnhash.h"
+#include "../format/dex/method.h"
-/* Définition d'une context décompilée (instance) */
-struct _GDecContext
-{
- GObject parent; /* A laisser en premier */
-
- vmpa_t max; /* Première adresse à écarter */
-
- GDecInstruction *list; /* Chaîne décompilée */
-
- GHashTable *machine; /* Correspondance reg./pseudo */
- GHashTable *ssa; /* Remplacement des pseudos */
-
- GDecInstruction **pseudos; /* Liste des pseudos-registre */
- size_t count; /* Taille de cette liste */
-
-};
-
-
-/* Définition d'une context décompilée (classe) */
-struct _GDecContextClass
-{
- GObjectClass parent; /* A laisser en premier */
-
-};
-
-
/* Initialise la classe des contextes de décompilation. */
static void g_dec_context_class_init(GDecContextClass *);
@@ -216,6 +190,7 @@ void g_dec_context_set_decomp_instrs(GDecContext *ctx, GDecInstruction *instr)
* *
* Paramètres : ctx = instance à consulter, voire mettre à jour. *
* operand = opérande représentant un registre quelconque. *
+* assign = précise le sort prochain du registre. *
* *
* Description : Convertit un registre machine en un pseudo-registre. *
* *
@@ -225,27 +200,8 @@ void g_dec_context_set_decomp_instrs(GDecContext *ctx, GDecInstruction *instr)
* *
******************************************************************************/
-GDecInstruction *g_dec_context_convert_register(GDecContext *ctx, gpointer operand)
+GDecInstruction *g_dec_context_convert_register(GDecContext *ctx, gpointer operand, bool assign)
{
- GDecInstruction *result; /* Instance à retourner */
- gpointer *found; /* Pseudo-registre trouvé */
-
- found = g_hash_table_lookup(ctx->machine, operand);
-
- if (found != NULL) result = G_DEC_INSTRUCTION(found);
- else
- {
- result = g_pseudo_register_new();
- g_pseudo_register_set_index(G_PSEUDO_REGISTER(result), ctx->count);
-
- g_hash_table_insert(ctx->machine, operand, result);
-
- ctx->pseudos = (GDecInstruction **)realloc(ctx->pseudos,
- ++ctx->count * sizeof(GDecInstruction *));
- ctx->pseudos[ctx->count - 1] = result;
-
- }
-
- return result;
+ return ctx->convert_reg(ctx, operand, assign);
}
diff --git a/src/decomp/context.h b/src/decomp/context.h
index b7dd445..bf584f4 100644
--- a/src/decomp/context.h
+++ b/src/decomp/context.h
@@ -68,7 +68,7 @@ GDecInstruction *g_dec_context_get_decomp_instrs(const GDecContext *tx);
void g_dec_context_set_decomp_instrs(GDecContext *, GDecInstruction *);
/* Convertit un registre machine en un pseudo-registre. */
-GDecInstruction *g_dec_context_convert_register(GDecContext *, gpointer);
+GDecInstruction *g_dec_context_convert_register(GDecContext *, gpointer, bool);
diff --git a/src/decomp/expr/pseudo.c b/src/decomp/expr/pseudo.c
index bb5861d..e73cb3d 100644
--- a/src/decomp/expr/pseudo.c
+++ b/src/decomp/expr/pseudo.c
@@ -38,6 +38,7 @@ struct _GPseudoRegister
{
GDecExpression parent; /* A laisser en premier */
+ char *name; /* Désignation générale */
size_t index; /* Position dans l'ensemble */
GBinVariable *var; /* Variable plus précise */
@@ -160,7 +161,7 @@ static void g_pseudo_register_print(const GPseudoRegister *reg, GCodeBuffer *buf
}
else
{
- snprintf(label, 32, "var%zu", reg->index);
+ snprintf(label, 32, "%s%zu", reg->name, reg->index);
g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, label, strlen(label), RTT_RAW);
}
@@ -169,6 +170,26 @@ static void g_pseudo_register_print(const GPseudoRegister *reg, GCodeBuffer *buf
/******************************************************************************
* *
+* Paramètres : reg = expression représentant un pseudo-registre à traiter. *
+* name = désignation générale à associer au pseudo-registre. *
+* *
+* Description : Définit un nom général pour un pseudo-registre donné. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_pseudo_register_set_basename(GPseudoRegister *reg, const char *name)
+{
+ reg->name = strdup(name);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : reg = expression représentant un pseudo-registre à traiter.*
* index = indice à associer au pseudo-registre. *
* *
diff --git a/src/decomp/expr/pseudo.h b/src/decomp/expr/pseudo.h
index dce6337..a465b41 100644
--- a/src/decomp/expr/pseudo.h
+++ b/src/decomp/expr/pseudo.h
@@ -55,6 +55,9 @@ GType g_pseudo_register_get_type(void);
/* Assigne le contenu d'une expression dans une autre. */
GDecInstruction *g_pseudo_register_new(void);
+/* Définit un nom général pour un pseudo-registre donné. */
+void g_pseudo_register_set_basename(GPseudoRegister *, const char *);
+
/* Définit un indice unique pour un pseudo-registre donné. */
void g_pseudo_register_set_index(GPseudoRegister *, size_t);