summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-04-05 23:12:13 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-04-05 23:12:13 (GMT)
commit40d624af29e752bb4255099ab3f1de64e3c96dd3 (patch)
tree3491d98e4358f9f8e84825478a3701d7fbb317ce /src/arch
parentfd679be33396b0ba85ba6617b33a66d221026d91 (diff)
Fixed various bugs in the graph layout.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@504 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
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 *);