diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/archbase.h | 3 | ||||
-rw-r--r-- | src/arch/instruction-int.h | 6 | ||||
-rw-r--r-- | src/arch/instruction.c | 113 | ||||
-rw-r--r-- | src/arch/instruction.h | 22 |
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 *); |