summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2021-08-14 19:54:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2021-08-14 19:54:31 (GMT)
commita6c0351774988094a51c9502f2a8e07633956263 (patch)
treedcaad9d00b6ce130d9af012286899ab877cc82cb /src/analysis
parent0daed1fa6212eb83b65ccd10c9f2c80bf12c6d27 (diff)
Improve the object padding exploitation for operands.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/type-int.h66
-rw-r--r--src/analysis/type.c78
-rw-r--r--src/analysis/type.h2
-rw-r--r--src/analysis/types/proto.c6
4 files changed, 81 insertions, 71 deletions
diff --git a/src/analysis/type-int.h b/src/analysis/type-int.h
index 6c77954..8999b19 100644
--- a/src/analysis/type-int.h
+++ b/src/analysis/type-int.h
@@ -60,27 +60,34 @@ typedef bool (* type_is_reference_fc) (const GDataType *);
/* Informations glissées dans la structure GObject de GBinSymbol */
-typedef union _type_obj_extra
+typedef struct _type_extra_data_t
{
- struct
- {
- TypeQualifier qualifiers; /* Eventuels qualificatifs */
- char ns_sep[2]; /* Séparateur d'éléments */
- TypeFlag flags; /* Propriétés du type */
+ char ns_sep[2]; /* Séparateur d'éléments */
+ TypeFlag flags; /* Propriétés du type */
- };
+ /**
+ * Afin de ne pas dépasser une taille de 31 bits, le champ de type
+ * TypeQualifier suivant est ramené à un champs de bits.
+ */
+
+ unsigned int qualifiers : 2; /* Eventuels qualificatifs */
+
+} type_extra_data_t;
+
+/* Encapsulation avec un verrou d'accès */
+typedef union _type_obj_extra_t
+{
+ type_extra_data_t data; /* Données embarquées */
+ lockable_obj_extra_t lockable; /* Gestion d'accès aux fanions */
- gint lock; /* Gestion d'accès aux fanions */
+} type_obj_extra_t;
-} type_obj_extra;
/* Description de type quelconque (instance) */
struct _GDataType
{
GObject parent; /* A laisser en premier */
- GDataType *namespace; /* Espace de noms / classe */
-
#if __SIZEOF_INT__ == __SIZEOF_LONG__
/**
@@ -90,29 +97,13 @@ struct _GDataType
* ce dernier.
*/
- type_obj_extra extra; /* Externalisation embarquée */
+ type_obj_extra_t extra; /* Externalisation embarquée */
#endif
-};
-
-/**
- * Accès aux informations éventuellement déportées.
- */
-
-#if __SIZEOF_INT__ == __SIZEOF_LONG__
-
-# define INIT_DATA_TYPE_EXTRA(tp) tp->extra.lock = 0
-
-# define GET_DATA_TYPE_EXTRA(tp) &tp->extra
-
-#else
-
-# define INIT_DATA_TYPE_EXTRA(tp) INIT_GOBJECT_EXTRA(G_OBJECT(tp))
-
-# define GET_DATA_TYPE_EXTRA(tp) GET_GOBJECT_EXTRA(G_OBJECT(tp), type_obj_extra)
+ GDataType *namespace; /* Espace de noms / classe */
-#endif
+};
/* Description de type quelconque (classe) */
struct _GDataTypeClass
@@ -133,5 +124,20 @@ struct _GDataTypeClass
};
+/**
+ * Accès aux informations éventuellement déportées.
+ */
+
+#if __SIZEOF_INT__ == __SIZEOF_LONG__
+
+# define GET_DATA_TYPE_EXTRA(tp) (type_extra_data_t *)&tp->extra
+
+#else
+
+# define GET_DATA_TYPE_EXTRA(tp) GET_GOBJECT_EXTRA(G_OBJECT(tp), type_extra_data_t)
+
+#endif
+
+
#endif /* _ANALYSIS_TYPE_INT_H */
diff --git a/src/analysis/type.c b/src/analysis/type.c
index ca14fdc..f05b9a8 100644
--- a/src/analysis/type.c
+++ b/src/analysis/type.c
@@ -111,7 +111,11 @@ static void g_data_type_class_init(GDataTypeClass *klass)
static void g_data_type_init(GDataType *type)
{
- INIT_DATA_TYPE_EXTRA(type);
+ type_extra_data_t *extra; /* Données insérées à modifier */
+
+ extra = GET_DATA_TYPE_EXTRA(type);
+
+ INIT_GOBJECT_EXTRA_LOCK(extra);
g_data_type_set_qualifiers(type, TQF_NONE);
@@ -280,7 +284,7 @@ static bool g_data_type_load(GDataType *type, GObjectStorage *storage, packed_bu
static bool _g_data_type_store(const GDataType *type, GObjectStorage *storage, packed_buffer_t *pbuf)
{
bool result; /* Bilan à retourner */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
result = pack_uleb128((uleb128_t []){ g_data_type_get_qualifiers(type) }, pbuf);
if (!result) goto exit;
@@ -290,7 +294,7 @@ static bool _g_data_type_store(const GDataType *type, GObjectStorage *storage, p
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = extend_packed_buffer(pbuf, extra->ns_sep, 2 * sizeof(char), false);
if (!result) goto unlocking_exit;
@@ -306,7 +310,7 @@ static bool _g_data_type_store(const GDataType *type, GObjectStorage *storage, p
unlocking_exit:
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
exit:
@@ -390,7 +394,7 @@ GDataType *g_data_type_dup(const GDataType *type)
{
GDataType *result; /* Copie à retourner */
GDataTypeClass *class; /* Classe du type */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
GDataType *ns; /* Eventuel espace de noms */
bool status; /* Bilan d'un rattachement */
@@ -404,7 +408,7 @@ GDataType *g_data_type_dup(const GDataType *type)
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
if (extra->ns_sep[0] != '\0')
{
@@ -422,7 +426,7 @@ GDataType *g_data_type_dup(const GDataType *type)
}
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -446,7 +450,7 @@ char *g_data_type_to_string(const GDataType *type, bool include)
{
char *result; /* Chaîne à retourner */
GDataTypeClass *class; /* Classe du type */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
char *namespace; /* Groupe d'appartenance */
TypeQualifier qualifiers; /* Qualificatifs du type */
@@ -461,7 +465,7 @@ char *g_data_type_to_string(const GDataType *type, bool include)
{
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
if (type->namespace != NULL && g_data_type_handle_namespaces(type))
{
@@ -474,7 +478,7 @@ char *g_data_type_to_string(const GDataType *type, bool include)
}
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -509,15 +513,15 @@ char *g_data_type_to_string(const GDataType *type, bool include)
void g_data_type_set_qualifiers(GDataType *type, TypeQualifier qualifiers)
{
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
extra->qualifiers = qualifiers;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -537,15 +541,15 @@ void g_data_type_set_qualifiers(GDataType *type, TypeQualifier qualifiers)
void g_data_type_add_qualifier(GDataType *type, TypeQualifier qualifier)
{
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
extra->qualifiers |= qualifier;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -565,15 +569,15 @@ void g_data_type_add_qualifier(GDataType *type, TypeQualifier qualifier)
TypeQualifier g_data_type_get_qualifiers(const GDataType *type)
{
TypeQualifier result; /* Qualificatifs à renvoyer */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = extra->qualifiers;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -597,7 +601,7 @@ TypeQualifier g_data_type_get_qualifiers(const GDataType *type)
bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char *sep)
{
bool result; /* Bilan à retourner */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
result = ((namespace == NULL && sep == NULL) || (namespace != NULL && sep != NULL && sep[0] != '\0'));
@@ -605,7 +609,7 @@ bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char
{
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
if (sep == NULL)
{
@@ -625,7 +629,7 @@ bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char
g_object_ref(G_OBJECT(namespace));
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -649,18 +653,18 @@ bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char
GDataType *g_data_type_get_namespace(const GDataType *type)
{
GDataType *result; /* Espace à renvoyer */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = type->namespace;
if (result != NULL)
g_object_ref(G_OBJECT(result));
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -682,11 +686,11 @@ GDataType *g_data_type_get_namespace(const GDataType *type)
char *g_data_type_get_namespace_separator(const GDataType *type)
{
char *result; /* Séparateur à retourner */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
if (extra->ns_sep[0] == '\0')
result = NULL;
@@ -697,7 +701,7 @@ char *g_data_type_get_namespace_separator(const GDataType *type)
else
result = strndup(extra->ns_sep, 2);
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -748,15 +752,15 @@ bool g_data_type_handle_namespaces(const GDataType *type)
void g_data_type_set_flags(GDataType *type, TypeFlag flags)
{
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
extra->flags = flags;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -776,15 +780,15 @@ void g_data_type_set_flags(GDataType *type, TypeFlag flags)
void g_data_type_add_flag(GDataType *type, TypeFlag flag)
{
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
extra->flags |= flag;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -804,15 +808,15 @@ void g_data_type_add_flag(GDataType *type, TypeFlag flag)
TypeFlag g_data_type_get_flags(const GDataType *type)
{
TypeFlag result; /* Propriétés à renvoyer */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_DATA_TYPE_EXTRA(type);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = extra->flags;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
diff --git a/src/analysis/type.h b/src/analysis/type.h
index 819af38..f5cc242 100644
--- a/src/analysis/type.h
+++ b/src/analysis/type.h
@@ -65,7 +65,7 @@ typedef enum _TypeFlag
TFL_SINGLETON = (1 << 1), /* Singleton effectif */
TFL_USER_LOW_BIT = (1 << 2), /* Premier bit libre */
- TFL_USER_HIGH_BIT = (1 << 6) /* Dernier bit libre */
+ TFL_USER_HIGH_BIT = (1 << 7) /* Dernier bit libre */
} TypeFlag;
diff --git a/src/analysis/types/proto.c b/src/analysis/types/proto.c
index aad073a..3cb074a 100644
--- a/src/analysis/types/proto.c
+++ b/src/analysis/types/proto.c
@@ -400,7 +400,7 @@ static char *g_proto_type_to_string(const GProtoType *type, bool include)
{
char *result; /* Valeur à renvoyer */
GDataType *base; /* Version d'instance parente */
- type_obj_extra *extra; /* Données insérées à modifier */
+ type_extra_data_t *extra; /* Données insérées à modifier */
char *namespace; /* Groupe d'appartenance */
size_t i; /* Boucle de parcours */
char *arg; /* Argument à décrire */
@@ -424,7 +424,7 @@ static char *g_proto_type_to_string(const GProtoType *type, bool include)
{
extra = GET_DATA_TYPE_EXTRA(base);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
if (base->namespace != NULL)
{
@@ -438,7 +438,7 @@ static char *g_proto_type_to_string(const GProtoType *type, bool include)
}
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}