summaryrefslogtreecommitdiff
path: root/src/format
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/format
parent0daed1fa6212eb83b65ccd10c9f2c80bf12c6d27 (diff)
Improve the object padding exploitation for operands.
Diffstat (limited to 'src/format')
-rw-r--r--src/format/format-int.h75
-rw-r--r--src/format/format.c30
-rw-r--r--src/format/symbol-int.h60
-rw-r--r--src/format/symbol.c66
4 files changed, 120 insertions, 111 deletions
diff --git a/src/format/format-int.h b/src/format/format-int.h
index de29751..11505d0 100644
--- a/src/format/format-int.h
+++ b/src/format/format-int.h
@@ -45,18 +45,22 @@ typedef SourceEndian (* format_get_endian_fc) (const GBinFormat *);
/* Rythme des allocations pour les entrées de code */
#define EXTRA_POINT_BLOCK 20
-/* Informations glissées dans la structure GObject de GBinFormat */
-typedef union _fmt_obj_extra
+
+/* Informations glissées dans la structure GObject de GArchOperand */
+typedef struct _fmt_extra_data_t
{
- struct
- {
- FormatFlag flags; /* Informations complémentaires*/
+ FormatFlag flags; /* Informations complémentaires*/
+
+} fmt_extra_data_t;
- };
+/* Encapsulation avec un verrou d'accès */
+typedef union _fmt_obj_extra_t
+{
+ fmt_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 */
+} fmt_obj_extra_t;
-} fmt_obj_extra;
/* Description d'une erreur */
typedef struct _fmt_error
@@ -73,6 +77,19 @@ struct _GBinFormat
{
GKnownFormat parent; /* A laisser en premier */
+#if __SIZEOF_INT__ == __SIZEOF_LONG__
+
+ /**
+ * L'inclusion des informations suivantes dépend de l'architecture.
+ *
+ * Si la structure GObject possède un trou, on remplit de préférence
+ * ce dernier.
+ */
+
+ fmt_obj_extra_t extra; /* Externalisation embarquée */
+
+#endif
+
virt_t *start_points[DPL_COUNT]; /* Départ de désassemblage */
size_t pt_allocated[DPL_COUNT]; /* Taille d'inscription allouée*/
size_t pt_count[DPL_COUNT]; /* Nombre de points enregistrés*/
@@ -97,53 +114,37 @@ struct _GBinFormat
gint error_locked; /* Statut d'accès à la liste */
#endif
-#if __SIZEOF_INT__ == __SIZEOF_LONG__
+};
- /**
- * L'inclusion des informations suivantes dépend de l'architecture.
- *
- * Si la structure GObject possède un trou, on remplit de préférence
- * ce dernier.
- */
+/* Format binaire générique (classe) */
+struct _GBinFormatClass
+{
+ GKnownFormatClass parent; /* A laisser en premier */
- fmt_obj_extra extra; /* Externalisation embarquée */
+ format_get_endian_fc get_endian; /* Boutisme employé */
-#endif
+ /* Signaux */
+
+ void (* symbol_added) (GBinFormat *, GBinSymbol *);
+ void (* symbol_removed) (GBinFormat *, GBinSymbol *);
};
+
/**
* Accès aux informations éventuellement déportées.
*/
#if __SIZEOF_INT__ == __SIZEOF_LONG__
-# define INIT_BIN_FORMAT_EXTRA(fmt) fmt->extra.lock = 0
-
-# define GET_BIN_FORMAT_EXTRA(fmt) &fmt->extra
+# define GET_BIN_FORMAT_EXTRA(fmt) (fmt_extra_data_t *)&fmt->extra
#else
-# define INIT_BIN_FORMAT_EXTRA(fmt) INIT_GOBJECT_EXTRA(G_OBJECT(fmt))
-
-# define GET_BIN_FORMAT_EXTRA(fmt) GET_GOBJECT_EXTRA(G_OBJECT(fmt), fmt_obj_extra)
+# define GET_BIN_FORMAT_EXTRA(fmt) GET_GOBJECT_EXTRA(G_OBJECT(fmt), fmt_extra_data_t)
#endif
-/* Format binaire générique (classe) */
-struct _GBinFormatClass
-{
- GKnownFormatClass parent; /* A laisser en premier */
-
- format_get_endian_fc get_endian; /* Boutisme employé */
-
- /* Signaux */
-
- void (* symbol_added) (GBinFormat *, GBinSymbol *);
- void (* symbol_removed) (GBinFormat *, GBinSymbol *);
-
-};
-
/* ------------------------------ DECODAGE DE SYMBOLES ------------------------------ */
diff --git a/src/format/format.c b/src/format/format.c
index 045bc92..f8fe13a 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -123,7 +123,11 @@ static void g_binary_format_class_init(GBinFormatClass *klass)
static void g_binary_format_init(GBinFormat *format)
{
- INIT_BIN_FORMAT_EXTRA(format);
+ fmt_extra_data_t *extra; /* Données insérées à modifier */
+
+ extra = GET_BIN_FORMAT_EXTRA(format);
+
+ INIT_GOBJECT_EXTRA_LOCK(extra);
g_rw_lock_init(&format->pt_lock);
@@ -235,17 +239,17 @@ static void g_binary_format_finalize(GBinFormat *format)
bool g_binary_format_set_flag(GBinFormat *format, FormatFlag flag)
{
bool result; /* Bilan à retourner */
- fmt_obj_extra *extra; /* Données insérées à modifier */
+ fmt_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_FORMAT_EXTRA(format);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = !(extra->flags & flag);
extra->flags |= flag;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -268,17 +272,17 @@ bool g_binary_format_set_flag(GBinFormat *format, FormatFlag flag)
bool g_binary_format_unset_flag(GBinFormat *format, FormatFlag flag)
{
bool result; /* Bilan à retourner */
- fmt_obj_extra *extra; /* Données insérées à modifier */
+ fmt_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_FORMAT_EXTRA(format);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = (extra->flags & flag);
extra->flags &= ~flag;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -301,15 +305,15 @@ bool g_binary_format_unset_flag(GBinFormat *format, FormatFlag flag)
bool g_binary_format_has_flag(const GBinFormat *format, FormatFlag flag)
{
bool result; /* Bilan à retourner */
- fmt_obj_extra *extra; /* Données insérées à modifier */
+ fmt_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_FORMAT_EXTRA(format);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = (extra->flags & flag);
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -331,15 +335,15 @@ bool g_binary_format_has_flag(const GBinFormat *format, FormatFlag flag)
FormatFlag g_binary_format_get_flags(const GBinFormat *format)
{
FormatFlag result; /* Fanions à retourner */
- fmt_obj_extra *extra; /* Données insérées à modifier */
+ fmt_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_FORMAT_EXTRA(format);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = (extra->flags & FFL_MASK);
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
diff --git a/src/format/symbol-int.h b/src/format/symbol-int.h
index 99cee88..7f5807c 100644
--- a/src/format/symbol-int.h
+++ b/src/format/symbol-int.h
@@ -35,32 +35,31 @@ typedef char * (* get_symbol_label_fc) (const GBinSymbol *);
/* Informations glissées dans la structure GObject de GBinSymbol */
-typedef union _sym_obj_extra
+typedef struct _sym_extra_data_t
{
- struct
- {
- SymbolType stype; /* Type du symbole */
- SymbolStatus status; /* Visibilité du symbole */
+ SymbolType stype; /* Type du symbole */
+ SymbolStatus status; /* Visibilité du symbole */
- char nm_prefix; /* Eventuel préfixe "nm" */
+ char nm_prefix; /* Eventuel préfixe "nm" */
- SymbolFlag flags; /* Informations complémentaires*/
+ SymbolFlag flags; /* Informations complémentaires*/
- };
+} sym_extra_data_t;
- gint lock; /* Gestion d'accès aux fanions */
+/* Encapsulation avec un verrou d'accès */
+typedef union _symbol_obj_extra_t
+{
+ sym_extra_data_t data; /* Données embarquées */
+ lockable_obj_extra_t lockable; /* Gestion d'accès aux fanions */
+
+} symbol_obj_extra_t;
-} sym_obj_extra;
/* Symbole d'exécutable (instance) */
struct _GBinSymbol
{
GObject parent; /* A laisser en premier */
- mrange_t range; /* Couverture mémoire */
-
- char *alt; /* Nom alternatif */
-
#if __SIZEOF_INT__ == __SIZEOF_LONG__
/**
@@ -70,39 +69,40 @@ struct _GBinSymbol
* ce dernier.
*/
- sym_obj_extra extra; /* Externalisation embarquée */
+ symbol_obj_extra_t extra; /* Externalisation embarquée */
#endif
+ mrange_t range; /* Couverture mémoire */
+
+ char *alt; /* Nom alternatif */
+
};
+/* Symbole d'exécutable (classe) */
+struct _GBinSymbolClass
+{
+ GObjectClass parent; /* A laisser en premier */
+
+ get_symbol_label_fc get_label; /* Obtention d'une étiquette */
+
+};
+
+
/**
* Accès aux informations éventuellement déportées.
*/
#if __SIZEOF_INT__ == __SIZEOF_LONG__
-# define INIT_BIN_SYMBOL_EXTRA(sym) sym->extra.lock = 0
-
-# define GET_BIN_SYMBOL_EXTRA(sym) &sym->extra
+# define GET_BIN_SYMBOL_EXTRA(sym) (sym_extra_data_t *)&sym->extra
#else
-# define INIT_BIN_SYMBOL_EXTRA(sym) INIT_GOBJECT_EXTRA(G_OBJECT(sym))
-
-# define GET_BIN_SYMBOL_EXTRA(sym) GET_GOBJECT_EXTRA(G_OBJECT(sym), sym_obj_extra)
+# define GET_BIN_SYMBOL_EXTRA(sym) GET_GOBJECT_EXTRA(G_OBJECT(sym), sym_extra_data_t)
#endif
-/* Symbole d'exécutable (classe) */
-struct _GBinSymbolClass
-{
- GObjectClass parent; /* A laisser en premier */
-
- get_symbol_label_fc get_label; /* Obtention d'une étiquette */
-
-};
-
#endif /* _FORMAT_SYMBOL_INT_H */
diff --git a/src/format/symbol.c b/src/format/symbol.c
index eb61db8..d3d5285 100644
--- a/src/format/symbol.c
+++ b/src/format/symbol.c
@@ -124,7 +124,11 @@ static void g_binary_symbol_class_init(GBinSymbolClass *klass)
static void g_binary_symbol_init(GBinSymbol *symbol)
{
- INIT_BIN_SYMBOL_EXTRA(symbol);
+ sym_extra_data_t *extra; /* Données insérées à modifier */
+
+ extra = GET_BIN_SYMBOL_EXTRA(symbol);
+
+ INIT_GOBJECT_EXTRA_LOCK(extra);
g_binary_symbol_set_stype(symbol, STP_COUNT);
@@ -331,15 +335,15 @@ const mrange_t *g_binary_symbol_get_range(const GBinSymbol *symbol)
void g_binary_symbol_set_stype(GBinSymbol *symbol, SymbolType type)
{
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
extra->stype = type;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -359,15 +363,15 @@ void g_binary_symbol_set_stype(GBinSymbol *symbol, SymbolType type)
SymbolType g_binary_symbol_get_stype(const GBinSymbol *symbol)
{
SymbolType result; /* Type à retourner */
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = extra->stype;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -389,15 +393,15 @@ SymbolType g_binary_symbol_get_stype(const GBinSymbol *symbol)
void g_binary_symbol_set_status(GBinSymbol *symbol, SymbolStatus status)
{
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
extra->status = status;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}
@@ -417,15 +421,15 @@ void g_binary_symbol_set_status(GBinSymbol *symbol, SymbolStatus status)
SymbolStatus g_binary_symbol_get_status(const GBinSymbol *symbol)
{
SymbolStatus result; /* Visibilité à retourner */
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = extra->status;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -448,17 +452,17 @@ SymbolStatus g_binary_symbol_get_status(const GBinSymbol *symbol)
bool g_binary_symbol_set_flag(GBinSymbol *symbol, SymbolFlag flag)
{
bool result; /* Bilan à retourner */
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = !(extra->flags & flag);
extra->flags |= flag;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -481,17 +485,17 @@ bool g_binary_symbol_set_flag(GBinSymbol *symbol, SymbolFlag flag)
bool g_binary_symbol_unset_flag(GBinSymbol *symbol, SymbolFlag flag)
{
bool result; /* Bilan à retourner */
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = (extra->flags & flag);
extra->flags &= ~flag;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -514,15 +518,15 @@ bool g_binary_symbol_unset_flag(GBinSymbol *symbol, SymbolFlag flag)
bool g_binary_symbol_has_flag(const GBinSymbol *symbol, SymbolFlag flag)
{
bool result; /* Bilan à retourner */
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = (extra->flags & flag);
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -544,15 +548,15 @@ bool g_binary_symbol_has_flag(const GBinSymbol *symbol, SymbolFlag flag)
SymbolFlag g_binary_symbol_get_flags(const GBinSymbol *symbol)
{
SymbolFlag result; /* Fanions à retourner */
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- 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;
@@ -575,18 +579,18 @@ SymbolFlag g_binary_symbol_get_flags(const GBinSymbol *symbol)
bool g_binary_symbol_get_nm_prefix(const GBinSymbol *symbol, char *prefix)
{
bool result; /* Validité à retourner */
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
result = (extra->flags & SFL_HAS_NM_PREFIX);
if (result)
*prefix = extra->nm_prefix;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
return result;
@@ -607,16 +611,16 @@ bool g_binary_symbol_get_nm_prefix(const GBinSymbol *symbol, char *prefix)
void g_binary_symbol_set_nm_prefix(const GBinSymbol *symbol, char prefix)
{
- sym_obj_extra *extra; /* Données insérées à modifier */
+ sym_extra_data_t *extra; /* Données insérées à modifier */
extra = GET_BIN_SYMBOL_EXTRA(symbol);
- g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+ LOCK_GOBJECT_EXTRA(extra);
extra->nm_prefix = prefix;
extra->flags |= SFL_HAS_NM_PREFIX;
- g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+ UNLOCK_GOBJECT_EXTRA(extra);
}