diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2021-08-14 19:54:31 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2021-08-14 19:54:31 (GMT) |
commit | a6c0351774988094a51c9502f2a8e07633956263 (patch) | |
tree | dcaad9d00b6ce130d9af012286899ab877cc82cb /src/format | |
parent | 0daed1fa6212eb83b65ccd10c9f2c80bf12c6d27 (diff) |
Improve the object padding exploitation for operands.
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/format-int.h | 75 | ||||
-rw-r--r-- | src/format/format.c | 30 | ||||
-rw-r--r-- | src/format/symbol-int.h | 60 | ||||
-rw-r--r-- | src/format/symbol.c | 66 |
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); } |