diff options
Diffstat (limited to 'src/arch/link.c')
-rw-r--r-- | src/arch/link.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/arch/link.c b/src/arch/link.c index 4519bc5..e5406da 100644 --- a/src/arch/link.c +++ b/src/arch/link.c @@ -66,7 +66,10 @@ void handle_jump_as_link(GArchInstruction *instr, GArchProcessor *proc, GProcCon target = g_arch_processor_find_instr_by_address(proc, &addr); if (target != NULL) + { g_arch_instruction_link_with(instr, target, ILT_JUMP); + g_object_unref(G_OBJECT(target)); + } } @@ -94,8 +97,8 @@ void handle_branch_as_link(GArchInstruction *instr, GArchProcessor *proc, GProcC GArchOperand *op; /* Opérande numérique en place */ virt_t virt; /* Adresse virtuelle */ vmpa2t addr; /* Adresse de destination */ + instr_iter_t *iter; /* Parcours d'instructions */ GArchInstruction *target; /* Ligne visée par la référence*/ - GArchInstruction *list; /* Ensemble des instructions */ assert(g_arch_instruction_count_operands(instr) > index); @@ -114,24 +117,34 @@ void handle_branch_as_link(GArchInstruction *instr, GArchProcessor *proc, GProcC if (virt != VMPA_NO_VIRTUAL) { - /* TODO : utiliser format pour contruire une adresse avec une position physique, - * ce qui accélèrerait les recherches. - */ init_vmpa(&addr, VMPA_NO_PHYSICAL, virt); - target = g_arch_processor_find_instr_by_address(proc, &addr); + iter = g_arch_processor_get_iter_from_address(proc, &addr); - if (target != NULL) + if (iter != NULL) { - g_arch_instruction_link_with(instr, target, ILT_JUMP_IF_TRUE); + target = get_instruction_iterator_current(iter); + + if (target != NULL) + { + g_arch_instruction_link_with(instr, target, ILT_JUMP_IF_TRUE); - list = g_arch_processor_get_disassembled_instructions(proc); + g_object_unref(G_OBJECT(target)); - target = g_arch_instruction_get_next_iter(list, instr, ~0); + } + + target = get_instruction_iterator_next(iter); if (target != NULL) + { g_arch_instruction_link_with(instr, target, ILT_JUMP_IF_FALSE); + g_object_unref(G_OBJECT(target)); + + } + + delete_instruction_iterator(iter); + } } @@ -174,7 +187,10 @@ void handle_call_as_link(GArchInstruction *instr, GArchProcessor *proc, GProcCon target = g_arch_processor_find_instr_by_address(proc, &addr); if (target != NULL) + { g_arch_instruction_link_with(instr, target, ILT_CALL); + g_object_unref(G_OBJECT(target)); + } } |