diff options
Diffstat (limited to 'src/arch/dalvik/decomp')
| -rw-r--r-- | src/arch/dalvik/decomp/if.c | 29 | 
1 files changed, 17 insertions, 12 deletions
| diff --git a/src/arch/dalvik/decomp/if.c b/src/arch/dalvik/decomp/if.c index f7591b9..c82413d 100644 --- a/src/arch/dalvik/decomp/if.c +++ b/src/arch/dalvik/decomp/if.c @@ -25,6 +25,7 @@  #include "../instruction.h" +#include "../../../decomp/expr/comp.h"  #include "../../../decomp/expr/cond.h"  #include "../../../decomp/expr/immediate.h"  #include "../../../decomp/instr/ite.h" @@ -53,7 +54,8 @@ GDecInstruction *dalvik_decomp_instr_if(const GArchInstruction *instr, GDecConte      GDecInstruction *op1;                   /* Premier opérande utilisé    */      GDecInstruction *op2;                   /* Second opérande utilisé     */      vmpa_t jmp;                             /* Adresse de saut             */ -    GDecInstruction *cond;                  /* Comparaison à restituer     */ +    GDecInstruction *comp;                  /* Comparaison à restituer     */ +    GDecInstruction *cond;                  /* Transformation en condition */      switch (g_dalvik_instruction_get_opcode(G_DALVIK_INSTRUCTION(instr)))      { @@ -91,8 +93,9 @@ GDecInstruction *dalvik_decomp_instr_if(const GArchInstruction *instr, GDecConte      operand = g_arch_instruction_get_operand(instr, 2);      jmp = 0x1234ull;/*g_dec_context_convert_register(ctx, operand, addr);*/ -    cond = g_cond_expression_new(G_DEC_EXPRESSION(op1), sign, G_DEC_EXPRESSION(op2)); -    result = g_ite_instruction_new(G_DEC_EXPRESSION(cond), jmp, jmp); +    comp = g_comp_expression_new(G_DEC_EXPRESSION(op1), sign, G_DEC_EXPRESSION(op2)); +    cond = g_cond_expression_new(comp); +    result = g_ite_instruction_new(cond, jmp, jmp);      return result; @@ -122,26 +125,27 @@ GDecInstruction *dalvik_decomp_instr_if_zero(const GArchInstruction *instr, GDec      GDecInstruction *op1;                   /* Premier opérande utilisé    */      GDecInstruction *op2;                   /* Second opérande utilisé     */      vmpa_t jmp;                             /* Adresse de saut             */ -    GDecInstruction *cond;                  /* Comparaison à restituer     */ +    GDecInstruction *comp;                  /* Comparaison à restituer     */ +    GDecInstruction *cond;                  /* Transformation en condition */      switch (g_dalvik_instruction_get_opcode(G_DALVIK_INSTRUCTION(instr)))      { -        case DOP_IF_EQ: +        case DOP_IF_EQZ:              sign = CST_EQ;              break; -        case DOP_IF_NE: +        case DOP_IF_NEZ:              sign = CST_NE;              break; -        case DOP_IF_LT: +        case DOP_IF_LTZ:              sign = CST_LT;              break; -        case DOP_IF_GE: +        case DOP_IF_GEZ:              sign = CST_GE;              break; -        case DOP_IF_GT: +        case DOP_IF_GTZ:              sign = CST_GT;              break; -        case DOP_IF_LE: +        case DOP_IF_LEZ:              sign = CST_LE;              break;          default: @@ -160,8 +164,9 @@ GDecInstruction *dalvik_decomp_instr_if_zero(const GArchInstruction *instr, GDec      operand = g_arch_instruction_get_operand(instr, 2);      jmp = 0x1234ull;/*g_dec_context_convert_register(ctx, operand, addr);*/ -    cond = g_cond_expression_new(G_DEC_EXPRESSION(op1), sign, G_DEC_EXPRESSION(op2)); -    result = g_ite_instruction_new(G_DEC_EXPRESSION(cond), jmp, jmp); +    comp = g_comp_expression_new(G_DEC_EXPRESSION(op1), sign, G_DEC_EXPRESSION(op2)); +    cond = g_cond_expression_new(comp); +    result = g_ite_instruction_new(cond, jmp, jmp);      return result; | 
