diff options
Diffstat (limited to 'src/decomp')
-rwxr-xr-x | src/decomp/Makefile.am | 1 | ||||
-rw-r--r-- | src/decomp/context-int.h | 68 | ||||
-rw-r--r-- | src/decomp/context.c | 54 | ||||
-rw-r--r-- | src/decomp/context.h | 2 | ||||
-rw-r--r-- | src/decomp/expr/pseudo.c | 23 | ||||
-rw-r--r-- | src/decomp/expr/pseudo.h | 3 |
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); |