diff options
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/arm/v7/instruction.c | 35 | ||||
| -rw-r--r-- | src/arch/instruction-int.h | 7 | ||||
| -rw-r--r-- | src/arch/instruction.c | 39 | ||||
| -rw-r--r-- | src/arch/instruction.h | 6 | ||||
| -rw-r--r-- | src/arch/raw.c | 33 | 
5 files changed, 120 insertions, 0 deletions
diff --git a/src/arch/arm/v7/instruction.c b/src/arch/arm/v7/instruction.c index de81056..d485dbc 100644 --- a/src/arch/arm/v7/instruction.c +++ b/src/arch/arm/v7/instruction.c @@ -58,6 +58,8 @@ static void g_armv7_instruction_dispose(GArmV7Instruction *);  /* Procède à la libération totale de la mémoire. */  static void g_armv7_instruction_finalize(GArmV7Instruction *); +/* Indique l'encodage d'une instruction de façon détaillée. */ +static const char *g_armv7_instruction_get_encoding(const GArmV7Instruction *);  /* Indique le type défini pour une représentation d'une instruction ARMv7. */ @@ -79,12 +81,16 @@ G_DEFINE_TYPE(GArmV7Instruction, g_armv7_instruction, G_TYPE_ARM_INSTRUCTION);  static void g_armv7_instruction_class_init(GArmV7InstructionClass *klass)  {      GObjectClass *object_class;             /* Autre version de la classe  */ +    GArchInstructionClass *instr;           /* Encore une autre vision...  */      object_class = G_OBJECT_CLASS(klass); +    instr = G_ARCH_INSTRUCTION_CLASS(klass);      object_class->dispose = (GObjectFinalizeFunc/* ! */)g_armv7_instruction_dispose;      object_class->finalize = (GObjectFinalizeFunc)g_armv7_instruction_finalize; +    instr->get_encoding = (get_instruction_encoding_fc)g_armv7_instruction_get_encoding; +  } @@ -171,6 +177,35 @@ GArchInstruction *g_armv7_instruction_new(const char *keyword)  /******************************************************************************  *                                                                             * +*  Paramètres  : instr = instruction quelconque à consulter.                  * +*                                                                             * +*  Description : Indique l'encodage d'une instruction de façon détaillée.     * +*                                                                             * +*  Retour      : Description humaine de l'encodage utilisé.                   * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static const char *g_armv7_instruction_get_encoding(const GArmV7Instruction *instr) +{ +    const char *result;                     /* Description à retourner     */ +    const char *raw;                        /* Description brute d'origine */ + +    raw = G_ARCH_INSTRUCTION(instr)->encoding; + +    if (raw[0] == 'T' || raw[0] == 't') +        result = "Thumb"; +    else +        result = "ARM"; + +    return result; + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : instr = instruction ARMv7 à mettre à jour.                   *  *                set   = statut à enregistrer.                                *  *                                                                             * diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h index 6b2b5c7..2d3a6a6 100644 --- a/src/arch/instruction-int.h +++ b/src/arch/instruction-int.h @@ -35,6 +35,9 @@  /* Liste les registres lus et écrits par l'instruction. */  typedef void (* get_instruction_rw_regs_fc) (const GArchInstruction *, GArchRegister ***, size_t *, GArchRegister ***, size_t *); +/* Indique l'encodage d'une instruction de façon détaillée. */ +typedef const char * (* get_instruction_encoding_fc) (const GArchInstruction *); +  /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */  typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const GBinContent *, AsmSyntax); @@ -52,6 +55,8 @@ struct _GArchInstruction      DL_LIST_ITEM(flow);                     /* Maillon de liste chaînée    */ +    const char *encoding;                   /* Encodage de l'instruction   */ +      const char *suffix;                     /* Complément au nom affiché   */      char *cached_keyword;                   /* Désignation complète        */ @@ -97,6 +102,8 @@ struct _GArchInstructionClass  {      GObjectClass parent;                    /* A laisser en premier        */ +    get_instruction_encoding_fc get_encoding; /* Obtention de l'encodage   */ +      print_instruction_fc print;             /* Imprime l'ensemble          */      build_instruction_keyword_fc build_key; /* Texte humain équivalent     */ diff --git a/src/arch/instruction.c b/src/arch/instruction.c index c3c32dc..184d98c 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -150,6 +150,45 @@ static void g_arch_instruction_finalize(GArchInstruction *instr)  /******************************************************************************  *                                                                             * +*  Paramètres  : instr = instruction quelconque à consulter.                  * +*                                                                             * +*  Description : Indique l'encodage d'une instruction de façon détaillée.     * +*                                                                             * +*  Retour      : Description humaine de l'encodage utilisé.                   * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +const char *g_arch_instruction_get_encoding(const GArchInstruction *instr) +{ +    return G_ARCH_INSTRUCTION_GET_CLASS(instr)->get_encoding(instr); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : instr    = instruction quelconque à modifier.                * +*                encoding = encodage de l'instruction.                        * +*                                                                             * +*  Description : Précise l'encodage d'une instruction de façon détaillée.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void g_arch_instruction_set_encoding(GArchInstruction *instr, const char *encoding) +{ +    instr->encoding = encoding; + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : instr  = instruction quelconque à modifier.                  *  *                suffix = chaîne de caractères fournie en complément.         *  *                                                                             * diff --git a/src/arch/instruction.h b/src/arch/instruction.h index baeee2e..0db68c7 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -59,6 +59,12 @@ typedef struct _GArchInstructionClass GArchInstructionClass;  /* Indique le type défini pour une instruction d'architecture. */  GType g_arch_instruction_get_type(void); +/* Indique l'encodage d'une instruction de façon détaillée. */ +const char *g_arch_instruction_get_encoding(const GArchInstruction *); + +/* Précise l'encodage d'une instruction de façon détaillée. */ +void g_arch_instruction_set_encoding(GArchInstruction *, const char *); +  /* Etend la désignation d'un nom d'instruction. */  void g_arch_instruction_append_suffix(GArchInstruction *, const char *); diff --git a/src/arch/raw.c b/src/arch/raw.c index a9fc3df..57860c0 100644 --- a/src/arch/raw.c +++ b/src/arch/raw.c @@ -29,6 +29,9 @@  #include <string.h> +#include <i18n.h> + +  #include "immediate.h"  #include "instruction-int.h"  #include "target.h" @@ -68,6 +71,9 @@ static void g_raw_instruction_dispose(GRawInstruction *);  /* Procède à la libération totale de la mémoire. */  static void g_raw_instruction_finalize(GRawInstruction *); +/* Indique l'encodage d'une instruction de façon détaillée. */ +static const char *g_raw_instruction_get_encoding(const GRawInstruction *); +  /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */  static GBufferLine *g_raw_instruction_print(const GRawInstruction *, GCodeBuffer *, MemoryDataSize, const GBinContent *, AsmSyntax); @@ -109,6 +115,7 @@ static void g_raw_instruction_class_init(GRawInstructionClass *klass)      instr = G_ARCH_INSTRUCTION_CLASS(klass); +    instr->get_encoding = (get_instruction_encoding_fc)g_raw_instruction_get_encoding;      instr->print = (print_instruction_fc)g_raw_instruction_print;      instr->build_key = (build_instruction_keyword_fc)g_raw_instruction_build_keyword; @@ -299,6 +306,32 @@ GArchInstruction *g_raw_instruction_new_array(const GBinContent *content, Memory  /******************************************************************************  *                                                                             * +*  Paramètres  : instr = instruction quelconque à consulter.                  * +*                                                                             * +*  Description : Indique l'encodage d'une instruction de façon détaillée.     * +*                                                                             * +*  Retour      : Description humaine de l'encodage utilisé.                   * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static const char *g_raw_instruction_get_encoding(const GRawInstruction *instr) +{ +    const char *result;                     /* Description à retourner     */ + +    if (instr->is_string) +        result = _("String"); +    else +        result = _("Raw"); + +    return result; + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : instr  = instruction d'assemblage à représenter.             *  *                buffer = espace où placer ledit contenu.                     *  *                msize   = taille idéale des positions et adresses;           *  | 
