diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/instruction.c | 62 | ||||
-rw-r--r-- | src/arch/instruction.h | 3 |
2 files changed, 65 insertions, 0 deletions
diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 08256d1..475c038 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -624,6 +624,68 @@ void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *des /****************************************************************************** * * * Paramètres : instr = instruction dont les informations sont à consulter. * +* dest = ligne visée par la liaison (côté destination). * +* old = ancien type de lien construit. * +* new = nouveau type de lien à construire. * +* * +* Description : Change la nature d'un lien entre deux instructions. * +* * +* Retour : true pour une mise à jour réussie, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_arch_instruction_change_link(GArchInstruction *instr, GArchInstruction *dest, InstructionLinkType old, InstructionLinkType new) +{ + size_t count; /* Raccourci pour la lecture */ + size_t i; /* Boucle de parcours */ + size_t from_idx; /* Indice côté destination */ + size_t to_idx; /* Indice côté source */ + + /* Côté destination */ + + count = dest->from_count; + + for (i = 0; i < count; i++) + if (dest->from[i] == instr && dest->from_types[i] == old) + break; + + if (i == count) + return false; + else + from_idx = i; + + /* Côté point de départ */ + + count = instr->to_count; + + for (i = 0; i < count; i++) + if (instr->to[i] == dest && instr->to_types[i] == old) + break; + + if (i == count) + return false; + else + to_idx = i; + + /* Si les deux extrémités sont raccord... */ + + dest->from_types[from_idx] = new; + + instr->to_types[to_idx] = new; + + return true; + + + /* TODO : si les informations complémentaires restent en place, compléter ! */ + +} + + +/****************************************************************************** +* * +* Paramètres : instr = instruction dont les informations sont à consulter. * * * * Description : Indique si l'instruction a une ou plusieurs origines. * * * diff --git a/src/arch/instruction.h b/src/arch/instruction.h index 0198bb5..9123b6f 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -188,6 +188,9 @@ bool g_arch_instruction_is_return(const GArchInstruction *instr); /* Etablit un lien entre deux instructions. */ void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, InstructionLinkType, ...); +/* Change la nature d'un lien entre deux instructions. */ +void g_arch_instruction_change_link(GArchInstruction *, GArchInstruction *, InstructionLinkType, InstructionLinkType); + /* Indique si l'instruction a une ou plusieurs origines. */ bool g_arch_instruction_has_sources(const GArchInstruction *); |