summaryrefslogtreecommitdiff
path: root/src/arch/link.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-19 19:00:34 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-19 19:00:34 (GMT)
commita4f40b1971fe208bd9c25adebaeff5614aee87ee (patch)
tree376d1832e345b0bf451cd8d06b97e0c2cd37fa86 /src/arch/link.c
parent5d94aa1a1e3af384307bb9d760410b61a33e7323 (diff)
Created an interface for jumping to addresses from operands.
Diffstat (limited to 'src/arch/link.c')
-rw-r--r--src/arch/link.c22
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)