diff --git a/src/utils.h b/src/utils.h index 0f4a388..04fb9c5 100644 --- a/src/utils.h +++ b/src/utils.h @@ -206,4 +206,10 @@ unmap_file(const char *str, size_t size); # define ATTR_NULL_SENTINEL #endif /* GNUC >= 4 */ +#if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 295) +#define ATTR_PACKED __attribute__((__packed__)) +#else +#define ATTR_PACKED +#endif + #endif /* UTILS_H */ diff --git a/src/xkbcomp/ast.h b/src/xkbcomp/ast.h index 36f777a..489b331 100644 --- a/src/xkbcomp/ast.h +++ b/src/xkbcomp/ast.h @@ -143,9 +143,11 @@ expr_op_type_to_string(enum expr_op_type type); const char * expr_value_type_to_string(enum expr_value_type type); -typedef struct _ParseCommon { - enum stmt_type type; +/* This struct contains fields common to all other AST nodes. It is only + * ever embedded in other structs, so save some memory by packing it. */ +typedef struct ATTR_PACKED _ParseCommon { struct _ParseCommon *next; + enum stmt_type type; } ParseCommon; typedef struct _IncludeStmt {