summaryrefslogtreecommitdiff
path: root/src/analysis/decomp/decompiler.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-11-28 09:43:50 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-11-28 09:43:50 (GMT)
commitf95598b68b98f6eda701f8f02bc09cb13f65fc72 (patch)
treeeefee33963448a1ce53a7eb80dacabbcdce8fc21 /src/analysis/decomp/decompiler.c
parentfbb4b6f53d2189ba9f61c1fd149534d8aef82dcd (diff)
Followed the excution flow to decompile instructions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@293 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
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);