summaryrefslogtreecommitdiff
path: root/src/arch/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/link.c')
-rw-r--r--src/arch/link.c34
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));
+ }
}