summaryrefslogtreecommitdiff
path: root/src/arch/instruction.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-12-20 00:28:36 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-12-20 00:28:36 (GMT)
commit56deaf395c65658102ef0111cfc072d65335331a (patch)
treeba6d6fd0dbc781e9ad3b3cf6b2eb529a7d7a6aa3 /src/arch/instruction.c
parentd9fdfcf887a7a596a68db2500bb5e4d0b692abb6 (diff)
Begun to clean the code by moving the disassembling process into disass/.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@202 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/instruction.c')
-rw-r--r--src/arch/instruction.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index dd43e14..cfc8ace 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -424,6 +424,12 @@ char *g_arch_instruction_get_text(const GArchInstruction *instr, const GExeForma
}
+
+/* ---------------------------------------------------------------------------------- */
+/* DEFINITION DES LIAISONS ENTRE INSTRUCTIONS */
+/* ---------------------------------------------------------------------------------- */
+
+
/******************************************************************************
* *
* Paramètres : instr = instruction à consulter. *
@@ -465,6 +471,113 @@ bool g_arch_instruction_is_return(const GArchInstruction *instr)
/******************************************************************************
* *
+* Paramètres : instr = instruction dont les informations sont à consulter. *
+* dest = ligne visée par la liaison (côté destination). *
+* type = type de lien à construire. *
+* *
+* Description : Etablit un lien entre deux instructions. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *dest, InstructionLinkType type)
+{
+ /* Côté destination */
+
+ dest->from = (GArchInstruction **)realloc(dest->from,
+ ++dest->from_count * sizeof(GArchInstruction *));
+
+ dest->from[dest->from_count - 1] = instr;
+
+ /* Côté point de départ */
+
+ 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));
+
+ instr->to[instr->to_count - 1] = dest;
+ instr->links_type[instr->to_count - 1] = type;
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : instr = instruction dont les informations sont à consulter. *
+* *
+* Description : Indique si l'instruction a une ou plusieurs origines. *
+* *
+* Retour : Bilan de la consultation. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_arch_instruction_has_sources(const GArchInstruction *instr)
+{
+ return (instr->from_count > 0);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : instr = instruction dont les informations sont à consulter. *
+* *
+* Description : Indique si l'instruction a une suite autre que la suivante. *
+* *
+* Retour : Bilan de la consultation. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_arch_instruction_has_destinations(const GArchInstruction *instr)
+{
+ return (instr->to_count > 1 || (instr->to_count == 1 && instr->links_type[0] != ILT_CALL));
+
+}
+
+
+/******************************************************************************
+* *
+* 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 destinations d'une instruction donnée. *
+* *
+* Retour : Nombre de ces destinations. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchInstruction ***dests, InstructionLinkType **types)
+{
+ *dests = instr->to;
+ *types = instr->links_type;
+
+ return instr->to_count;
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* CONVERSIONS DU FORMAT DES INSTRUCTIONS */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+* *
* Paramètres : instr = instruction d'origine à convertir. *
* ctx = contexte de la phase de décompilation. *
* *