From e7a85861ba8bcd00ceb7bf9e47f4eadccd48ce3f Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 10 Mar 2013 21:56:51 +0000
Subject: Extended and improved some parts of instructions.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@344 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                  |  7 ++++++
 src/arch/instruction-int.h |  3 ++-
 src/arch/instruction.c     | 58 +++++++++++++++++++++++++++++++++++-----------
 src/arch/instruction.h     |  3 +++
 4 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f60da41..5f72869 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+13-03-10  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/arch/instruction.c:
+	* src/arch/instruction.h:
+	* src/arch/instruction-int.h:
+	Extend and improve some parts of instructions.
+
 13-03-01  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/gtkext/gtkdockstation.c:
diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h
index d7da215..4a38eb5 100644
--- a/src/arch/instruction-int.h
+++ b/src/arch/instruction-int.h
@@ -64,9 +64,10 @@ struct _GArchInstruction
     size_t operands_count;                  /* Nbre. d'opérandes utilisées */
 
     GArchInstruction **from;                /* Origines des références     */
+    InstructionLinkType *from_types;        /* Type des liens de dest.     */
     size_t from_count;                      /* Nombre de ces origines      */
     GArchInstruction **to;                  /* Eventuelles lignes visées   */
-    InstructionLinkType *links_type;        /* Type des liens de dest.     */
+    InstructionLinkType *to_types;          /* Type des liens de dest.     */
     link_extra_info *links_info;            /* Informations complémentaires*/
     size_t to_count;                        /* Nombre de ces destinations  */
 
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index 20b5f3a..c40ff51 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -363,35 +363,41 @@ bool g_arch_instruction_is_return(const GArchInstruction *instr)
 
 void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *dest, InstructionLinkType type, ...)
 {
+    size_t count;                           /* Raccourci pour la lecture   */
     va_list ap;                             /* Gestion des variations      */
 
     /* Côté destination */
 
+    count = ++dest->from_count;
+
     dest->from = (GArchInstruction **)realloc(dest->from,
-                                              ++dest->from_count * sizeof(GArchInstruction *));
+                                              count * sizeof(GArchInstruction *));
+    dest->from_types = (InstructionLinkType *)realloc(dest->from_types,
+                                                      count * sizeof(InstructionLinkType));
 
-    dest->from[dest->from_count - 1] = instr;
+    dest->from[count - 1] = instr;
+    dest->from_types[count - 1] = type;
 
     /* Côté point de départ */
 
-    instr->to_count++;
+    count = ++instr->to_count;
 
     instr->to = (GArchInstruction **)realloc(instr->to,
-                                             instr->to_count * sizeof(GArchInstruction *));
-    instr->links_type = (InstructionLinkType *)realloc(instr->links_type,
-                                                       instr->to_count * sizeof(InstructionLinkType));
+                                             count * sizeof(GArchInstruction *));
+    instr->to_types = (InstructionLinkType *)realloc(instr->to_types,
+                                                     count * sizeof(InstructionLinkType));
     instr->links_info = (link_extra_info *)realloc(instr->links_info,
-                                                   instr->to_count * sizeof(link_extra_info));
+                                                   count * sizeof(link_extra_info));
 
-    instr->to[instr->to_count - 1] = dest;
-    instr->links_type[instr->to_count - 1] = type;
+    instr->to[count - 1] = dest;
+    instr->to_types[count - 1] = type;
 
     va_start(ap, type);
 
     switch (type)
     {
         case ILT_CASE_JUMP:
-            instr->links_info[instr->to_count - 1].imm = va_arg(ap, GImmOperand *);
+            instr->links_info[count - 1].imm = va_arg(ap, GImmOperand *);
             break;
         default:
             break;
@@ -424,6 +430,32 @@ bool g_arch_instruction_has_sources(const GArchInstruction *instr)
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : instr = instruction dont les informations sont à consulter.  *
+*                dests = liste des instructions de destination. [OUT]         *
+*                types = liste des types de liens présents. [OUT]             *
+*                                                                             *
+*  Description : Fournit les origines d'une instruction donnée.               *
+*                                                                             *
+*  Retour      : Nombre de ces destinations.                                  *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+size_t g_arch_instruction_get_sources(const GArchInstruction *instr, GArchInstruction ***dests, InstructionLinkType **types)
+{
+    *dests = instr->from;
+
+    if (types != NULL)
+        *types = instr->from_types;
+
+    return instr->from_count;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : instr = instruction dont les informations sont à consulter.  *
 *                                                                             *
 *  Description : Indique si l'instruction a une suite autre que la suivante.  *
 *                                                                             *
@@ -436,7 +468,7 @@ bool g_arch_instruction_has_sources(const GArchInstruction *instr)
 bool g_arch_instruction_has_destinations(const GArchInstruction *instr)
 {
     /* FIXME !? */
-    //return (instr->to_count > 1 || (instr->to_count == 1 && instr->links_type[0] != ILT_CALL));
+    //return (instr->to_count > 1 || (instr->to_count == 1 && instr->to_types[0] != ILT_CALL));
     return (instr->to_count > 0);
 
 }
@@ -462,7 +494,7 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchI
     *dests = instr->to;
 
     if (types != NULL)
-        *types = instr->links_type;
+        *types = instr->to_types;
 
     if (info != NULL)
         *info = instr->links_info;
@@ -493,7 +525,7 @@ GArchInstruction *g_arch_instruction_get_given_destination(const GArchInstructio
     result = NULL;
 
     for (i = 0; i < instr->to_count && result == NULL; i++)
-        if (instr->links_type[i] == type)
+        if (instr->to_types[i] == type)
             result = instr->to[i];
 
     return result;
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index 59577dc..c4b704e 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -118,6 +118,9 @@ void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, Instru
 /* Indique si l'instruction a une ou plusieurs origines. */
 bool g_arch_instruction_has_sources(const GArchInstruction *);
 
+/* Fournit les origines d'une instruction donnée. */
+size_t g_arch_instruction_get_sources(const GArchInstruction *, GArchInstruction ***, InstructionLinkType **);
+
 /* Indique si l'instruction a une suite autre que la suivante. */
 bool g_arch_instruction_has_destinations(const GArchInstruction *);
 
-- 
cgit v0.11.2-87-g4458