summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/archbase.h3
-rw-r--r--src/arch/instruction-int.h6
-rw-r--r--src/arch/instruction.c113
-rw-r--r--src/arch/instruction.h22
4 files changed, 143 insertions, 1 deletions
diff --git a/src/arch/archbase.h b/src/arch/archbase.h
index 61de861..0299227 100644
--- a/src/arch/archbase.h
+++ b/src/arch/archbase.h
@@ -37,7 +37,8 @@ typedef uint8_t bin_t;
typedef uint64_t vmpa_t;
-#define VMPA_MAX_SIZE 19
+#define VMPA_MAX 0xffffffffffffffffull
+#define VMPA_MAX_SIZE 19
/* Taille des données intégrées */
diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h
index 2a92bad..4eca0a5 100644
--- a/src/arch/instruction-int.h
+++ b/src/arch/instruction-int.h
@@ -58,6 +58,12 @@ struct _GArchInstruction
GArchOperand **operands; /* Liste des opérandes */
size_t operands_count; /* Nbre. d'opérandes utilisées */
+ GArchInstruction **from; /* Origines des références */
+ size_t from_count; /* Nombre de ces origines */
+ GArchInstruction **to; /* Eventuelles lignes visées */
+ InstructionLinkType *links_type; /* Type des liens de dest. */
+ size_t to_count; /* Nombre de ces destinations */
+
get_instruction_text_fc get_text; /* Texte humain équivalent */
get_instruction_link_fc get_link; /* Référence à une instruction */
is_instruction_return_fc is_return; /* Retour de fonction ou pas ? */
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. *
* *
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index 4dcba44..7932fdc 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -90,12 +90,34 @@ void g_arch_instruction_detach_operand(GArchInstruction *, GArchOperand *);
/* Traduit une instruction en version humainement lisible. */
char *g_arch_instruction_get_text(const GArchInstruction *, const GExeFormat *, AsmSyntax);
+
+
+/* ------------------- DEFINITION DES LIAISONS ENTRE INSTRUCTIONS ------------------- */
+
+
/* Informe sur une éventuelle référence à une autre instruction. */
InstructionLinkType g_arch_instruction_get_link(const GArchInstruction *, vmpa_t *);
/* Indique si l'instruction correspond à un retour de fonction. */
bool g_arch_instruction_is_return(const GArchInstruction *instr);
+/* Etablit un lien entre deux instructions. */
+void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, InstructionLinkType);
+
+/* Indique si l'instruction a une ou plusieurs origines. */
+bool g_arch_instruction_has_sources(const GArchInstruction *);
+
+/* Indique si l'instruction a une suite autre que la suivante. */
+bool g_arch_instruction_has_destinations(const GArchInstruction *);
+
+/* Fournit les destinations d'une instruction donnée. */
+size_t g_arch_instruction_get_destinations(const GArchInstruction *, GArchInstruction ***, InstructionLinkType **);
+
+
+
+/* --------------------- CONVERSIONS DU FORMAT DES INSTRUCTIONS --------------------- */
+
+
/* Décompile une instruction de façon générique. */
GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *, GDecContext *);