summaryrefslogtreecommitdiff
path: root/src/analysis/decomp/decompiler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/decomp/decompiler.c')
-rw-r--r--src/analysis/decomp/decompiler.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/analysis/decomp/decompiler.c b/src/analysis/decomp/decompiler.c
index 8e574c0..91a9163 100644
--- a/src/analysis/decomp/decompiler.c
+++ b/src/analysis/decomp/decompiler.c
@@ -2,7 +2,7 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
* decompiler.c - encadrement des phases de décompilation
*
- * Copyright (C) 2010 Cyrille Bagard
+ * Copyright (C) 2010-2012 Cyrille Bagard
*
* This file is part of OpenIDA.
*
@@ -32,7 +32,9 @@
#include <i18n.h>
+#include "il.h"
#include "../../decomp/output.h"
+#include "../../decomp/expr/block.h"
#include "../../decomp/lang/java.h" /* FIXME : remme ! */
#include "../../format/format.h"
@@ -138,7 +140,11 @@ static void prepare_all_routines_for_decomp(const GLoadedBinary *binary, const c
size_t i;
GDecContext *context; /* Contexte pour la décompil. */
- GDecInstruction *instr;
+ GDecInstruction *dinstrs;
+
+ GArchInstruction *instrs; /* Instructions natives */
+
+ vmpa_t max; /* Première adresse à écarter */
format = g_loaded_binary_get_format(binary);
proc = get_arch_processor_from_format(G_EXE_FORMAT(format));
@@ -152,7 +158,28 @@ static void prepare_all_routines_for_decomp(const GLoadedBinary *binary, const c
{
context = g_arch_processor_get_decomp_context(proc);
- instr = g_binary_format_decompile_routine(G_BIN_FORMAT(format), routines[i], context);
+ g_object_set_data(G_OBJECT(context), "format", format);
+ g_object_set_data(G_OBJECT(context), "routine", routines[i]);
+ g_dec_context_set_max_address(context, max);
+
+ instrs = g_binary_routine_get_instructions(routines[i]);
+
+ max = g_binary_routine_get_address(routines[i])
+ + g_binary_routine_get_size(routines[i]);
+
+ printf("##### DECOMPILE '%s' #####\n", g_binary_routine_to_string(routines[i]));
+
+ dinstrs = build_decompiled_block(instrs,
+ g_binary_routine_get_address(routines[i]),
+ max, VMPA_MAX, context);
+
+ //instr = g_binary_format_decompile_routine(G_BIN_FORMAT(format), routines[i], context);
+
+
+
+ g_binary_routine_set_decomp_instructions(routines[i], dinstrs);
+
+
if (context != NULL)
g_object_unref(context);