diff options
Diffstat (limited to 'src/arch/link.c')
-rw-r--r-- | src/arch/link.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/arch/link.c b/src/arch/link.c index c11fe54..f09621e 100644 --- a/src/arch/link.c +++ b/src/arch/link.c @@ -27,7 +27,7 @@ #include <assert.h> -#include "target.h" +#include "targetableop.h" @@ -99,11 +99,10 @@ void handle_jump_as_link(GArchInstruction *instr, GArchProcessor *proc, GProcCon void handle_branch_as_link(GArchInstruction *instr, GArchProcessor *proc, GProcContext *context, GExeFormat *format, size_t index) { GArchOperand *op; /* Opérande numérique en place */ + const mrange_t *range; /* Emplacement de l'instruction*/ bool defined; /* Adresse définie ? */ vmpa2t addr; /* Adresse de destination */ - virt_t virt; /* Adresse virtuelle */ GArchInstruction *target; /* Ligne visée par la référence*/ - const mrange_t *range; /* Emplacement d'instruction */ vmpa2t next; /* Position suivante */ g_arch_instruction_lock_operands(instr); @@ -114,20 +113,17 @@ void handle_branch_as_link(GArchInstruction *instr, GArchProcessor *proc, GProcC g_arch_instruction_unlock_operands(instr); - defined = false; - - if (G_IS_TARGET_OPERAND(op)) + if (G_IS_TARGETABLE_OPERAND(op)) { - g_target_operand_get_addr(G_TARGET_OPERAND(op), &addr); - defined = true; - } + range = g_arch_instruction_get_range(instr); - else if (G_IS_IMM_OPERAND(op)) - { - if (g_imm_operand_to_virt_t(G_IMM_OPERAND(op), &virt)) - defined = g_exe_format_translate_address_into_vmpa(format, virt, &addr); + defined = g_targetable_operand_get_addr(G_TARGETABLE_OPERAND(op), get_mrange_addr(range), + G_BIN_FORMAT(format), proc, &addr); } + else + defined = false; + g_object_unref(G_OBJECT(op)); if (defined) |