diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-03-15 18:16:07 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-03-15 18:16:07 (GMT) |
commit | 4d15e46e5b401b3237eec380e9c80735b1f24db3 (patch) | |
tree | 6ce7882de933a51edf921092f53cc17734e37eba /src | |
parent | f2f54bba0c4db6f5fff3746b40be174617ce693f (diff) |
Referenced all provided registers from operands.
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/arm/v7/fetch.c | 16 | ||||
-rw-r--r-- | src/arch/arm/v7/link.c | 2 | ||||
-rw-r--r-- | src/arch/register.c | 2 |
3 files changed, 16 insertions, 4 deletions
diff --git a/src/arch/arm/v7/fetch.c b/src/arch/arm/v7/fetch.c index 6675706..84319cc 100644 --- a/src/arch/arm/v7/fetch.c +++ b/src/arch/arm/v7/fetch.c @@ -237,20 +237,24 @@ void help_fetching_with_instruction_bx_with_orig(GArchInstruction *instr, GArchP { GArchOperand *op; /* Opérande numérique en place */ GArmRegister *reg; /* Registre matériel manipulé */ + bool is_pc; /* Nature de ce même registre */ const mrange_t *range; /* Emplacementt d'instruction */ virt_t pc; /* Position dans l'exécution */ op = g_arch_instruction_get_operand(instr, 0); assert(G_IS_REGISTER_OPERAND(op)); - reg = G_ARM_REGISTER(g_register_operand_get_register(G_REGISTER_OPERAND(op))); - /** * On ne sait agir qu'avec le seul contenu facilement prédictible : pc ! */ - if (g_arm_register_get_index(reg) != 15 /* pc */) - return; + reg = G_ARM_REGISTER(g_register_operand_get_register(G_REGISTER_OPERAND(op))); + + is_pc = (g_arm_register_get_index(reg) == 15 /* pc */); + + g_object_unref(G_OBJECT(reg)); + + if (!is_pc) goto hfwibwo_no_pc; /** * On bascule alors le mode de décodage à cette adresse... @@ -277,6 +281,10 @@ void help_fetching_with_instruction_bx_with_orig(GArchInstruction *instr, GArchP break; } + hfwibwo_no_pc: + + ; + } diff --git a/src/arch/arm/v7/link.c b/src/arch/arm/v7/link.c index 24b56c6..63fb3ae 100644 --- a/src/arch/arm/v7/link.c +++ b/src/arch/arm/v7/link.c @@ -63,6 +63,8 @@ void handle_armv7_conditional_branch_from_register(GArchInstruction *instr, GArc else g_arch_instruction_set_flag(instr, AIF_RETURN_POINT); /* FIXME : jump inconnu ! */ + g_object_unref(G_OBJECT(reg)); + } diff --git a/src/arch/register.c b/src/arch/register.c index 6e18b45..519ecdd 100644 --- a/src/arch/register.c +++ b/src/arch/register.c @@ -555,6 +555,8 @@ GArchOperand *g_register_operand_new(GArchRegister *reg) GArchRegister *g_register_operand_get_register(const GRegisterOperand *operand) { + g_object_ref(G_OBJECT(operand->reg)); + return operand->reg; } |