summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/instruction.c62
-rw-r--r--src/arch/instruction.h3
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 *);