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)); + +} |