diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2017-05-21 16:48:11 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2017-05-21 16:48:11 (GMT) | 
| commit | acd355c4c5ae25fb9cac64b8dc17407a2bcc979b (patch) | |
| tree | d5b43201049116cd9734ff554e61ed8a7e0084cc /src/arch/arm/v7/register.c | |
| parent | 4691a434a34a19317156a761967f719e408b73bb (diff) | |
Refined the whole share system for operands.
Diffstat (limited to 'src/arch/arm/v7/register.c')
| -rw-r--r-- | src/arch/arm/v7/register.c | 157 | 
1 files changed, 148 insertions, 9 deletions
| diff --git a/src/arch/arm/v7/register.c b/src/arch/arm/v7/register.c index 1e76764..7a873b5 100644 --- a/src/arch/arm/v7/register.c +++ b/src/arch/arm/v7/register.c @@ -31,6 +31,9 @@ +/* ------------------------- ENCADREMENT DE REGISTRES BRUTS ------------------------- */ + +  /* Représentation d'un registre ARMv7 (instance) */  struct _GArmV7Register  { @@ -62,11 +65,31 @@ static void g_armv7_register_dispose(GArmV7Register *);  /* Procède à la libération totale de la mémoire. */  static void g_armv7_register_finalize(GArmV7Register *); +/* Réalise une copie minimale d'un contenu partagé. */ +static void g_armv7_register_define_template(const GArmV7Register *, GArmV7Register *); +  /* Traduit un registre en version humainement lisible. */  static void g_armv7_register_print(const GArmV7Register *, GBufferLine *, AsmSyntax); +/* -------------------------- PARTAGES DE CONTENUS UNIQUES -------------------------- */ + + +/* Gestionnaire des partages d'instances */ +static GShareManager *_armv7_register_manager = NULL; + + +/* Fournit le gestionnaire de partages attribué à un type. */ +static GShareManager *get_armv7_register_share_manager(void); + + + +/* ---------------------------------------------------------------------------------- */ +/*                           ENCADREMENT DE REGISTRES BRUTS                           */ +/* ---------------------------------------------------------------------------------- */ + +  /* Indique le type défini pour une représentation d'un registre ARMv7. */  G_DEFINE_TYPE(GArmV7Register, g_armv7_register, G_TYPE_ARM_REGISTER); @@ -94,6 +117,10 @@ static void g_armv7_register_class_init(GArmV7RegisterClass *klass)      object_class->dispose = (GObjectFinalizeFunc/* ! */)g_armv7_register_dispose;      object_class->finalize = (GObjectFinalizeFunc)g_armv7_register_finalize; +    reg_class->get_manager = (get_register_manager_fc)get_armv7_register_share_manager; + +    reg_class->define_template = (define_register_template_fc)g_armv7_register_define_template; +      reg_class->print = (reg_print_fc)g_armv7_register_print;  } @@ -157,25 +184,26 @@ static void g_armv7_register_finalize(GArmV7Register *reg)  /******************************************************************************  *                                                                             * -*  Paramètres  : index = indice du registre correspondant.                    * +*  Paramètres  : reg      = objet partagé à consulter.                        * +*                template = informations à retrouver intégralement.           *  *                                                                             * -*  Description : Crée une réprésentation de registre ARMv7.                   * +*  Description : Réalise une copie minimale d'un contenu partagé.             *  *                                                                             * -*  Retour      : Adresse de la structure mise en place.                       * +*  Retour      : -                                                            *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -GArmV7Register *g_armv7_register_new(uint8_t index) +static void g_armv7_register_define_template(const GArmV7Register *reg, GArmV7Register *template)  { -    GArmV7Register *result;                 /* Structure à retourner       */ +    GArmRegister *areg;                     /* Version parente #1          */ +    GArmRegister *treg;                     /* Version parente #2          */ -    result = g_object_new(G_TYPE_ARMV7_REGISTER, NULL); +    areg = (GArmRegister *)reg; +    treg = (GArmRegister *)template; -    G_ARM_REGISTER(result)->index = index; - -    return result; +    treg->index = areg->index;  } @@ -227,3 +255,114 @@ static void g_armv7_register_print(const GArmV7Register *reg, GBufferLine *line,      g_buffer_line_append_text(line, BLC_ASSEMBLY, key, klen, RTT_REGISTER, NULL);  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : index = indice du registre correspondant.                    * +*                                                                             * +*  Description : Crée une réprésentation de registre ARMv7.                   * +*                                                                             * +*  Retour      : Adresse de la structure mise en place.                       * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GArmV7Register *g_armv7_register_new(uint8_t index) +{ +    GArmV7Register *result;                 /* Structure à retourner       */ +    GArmRegister template;                  /* Transport d'informations    */ + +    template.index = index; + +    result = G_ARMV7_REGISTER(g_share_manager_build(_armv7_register_manager, (GSharedInstance *)&template)); + +    return result; + +} + + + +/* ---------------------------------------------------------------------------------- */ +/*                            PARTAGES DE CONTENUS UNIQUES                            */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : -                                                            * +*                                                                             * +*  Description : Fournit le gestionnaire de partages attribué à un type.      * +*                                                                             * +*  Retour      : Gestionnaire de partages en place.                           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static GShareManager *get_armv7_register_share_manager(void) +{ +    return _armv7_register_manager; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : -                                                            * +*                                                                             * +*  Description : Met en place les mécanismes de partage des registres ARMv7.  * +*                                                                             * +*  Retour      : Bilan de l'opération.                                        * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +bool init_armv7_register_sharing(void) +{ +    _armv7_register_manager = g_share_manager_new(G_TYPE_ARMV7_REGISTER); + +    return true; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : -                                                            * +*                                                                             * +*  Description : Imprime des statistiques quant aux partages dans l'archi.    * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ +#ifdef DEBUG_DUMP_STATS +void dump_armv7_register_share_stats(void) +{ +    g_share_manager_dump_stats(_armv7_register_manager); + +} +#endif + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : -                                                            * +*                                                                             * +*  Description : Supprime les mécanismes de partage des registres ARMv7.      * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void exit_armv7_register_sharing(void) +{ +    g_object_unref(G_OBJECT(_armv7_register_manager)); + +} | 
