summaryrefslogtreecommitdiff
path: root/src/arch/arm/v7/register.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-05-21 16:48:11 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-05-21 16:48:11 (GMT)
commitacd355c4c5ae25fb9cac64b8dc17407a2bcc979b (patch)
treed5b43201049116cd9734ff554e61ed8a7e0084cc /src/arch/arm/v7/register.c
parent4691a434a34a19317156a761967f719e408b73bb (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.c157
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));
+
+}