@@ -733,6 +733,18 @@ static int bits_in_type128 = 128;
#define MOD_ESIGNED (MOD_SIGNED | MOD_EXPLICITLY_SIGNED)
#define MOD_LL (MOD_LONG | MOD_LONGLONG)
#define MOD_LLL MOD_LONGLONGLONG
+
+#define T_BASETYPE SYM_BASETYPE, 0, NULL, NULL, NULL
+#define T_INT(R, S, M) SYM_BASETYPE, (R|M), &bits_in_##S, &max_int_alignment, &int_type
+#define T__INT(R, S) T_INT(R, S, MOD_SIGNED)
+#define T_SINT(R, S) T_INT(R, S, MOD_ESIGNED)
+#define T_UINT(R, S) T_INT(R, S, MOD_UNSIGNED)
+#define T_FLOAT_(R,S,A) SYM_BASETYPE, R, &bits_in_##S, A, &fp_type
+#define T_FLOAT(R, S) T_FLOAT_(R, S, &max_fp_alignment)
+#define T_PTR(B) SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, B
+#define T_NODE(M,B,S,A) SYM_NODE, M, S, A, B
+#define T_CONST(B,S,A) T_NODE(MOD_CONST, B, S, A)
+
static const struct ctype_declare {
struct symbol *ptr;
enum type type;
@@ -741,57 +753,57 @@ static const struct ctype_declare {
int *maxalign;
struct symbol *base_type;
} ctype_declaration[] = {
- { &bool_ctype, SYM_BASETYPE, MOD_UNSIGNED, &bits_in_bool, &max_int_alignment, &int_type },
- { &void_ctype, SYM_BASETYPE, 0, NULL, NULL, NULL },
- { &type_ctype, SYM_BASETYPE, 0, NULL, NULL, NULL },
- { &incomplete_ctype,SYM_BASETYPE, 0, NULL, NULL, NULL },
- { &bad_ctype, SYM_BASETYPE, 0, NULL, NULL, NULL },
-
- { &char_ctype, SYM_BASETYPE, MOD_SIGNED | MOD_CHAR, &bits_in_char, &max_int_alignment, &int_type },
- { &schar_ctype, SYM_BASETYPE, MOD_ESIGNED | MOD_CHAR, &bits_in_char, &max_int_alignment, &int_type },
- { &uchar_ctype, SYM_BASETYPE, MOD_UNSIGNED | MOD_CHAR, &bits_in_char, &max_int_alignment, &int_type },
- { &short_ctype, SYM_BASETYPE, MOD_SIGNED | MOD_SHORT, &bits_in_short, &max_int_alignment, &int_type },
- { &sshort_ctype, SYM_BASETYPE, MOD_ESIGNED | MOD_SHORT, &bits_in_short, &max_int_alignment, &int_type },
- { &ushort_ctype, SYM_BASETYPE, MOD_UNSIGNED | MOD_SHORT, &bits_in_short, &max_int_alignment, &int_type },
- { &int_ctype, SYM_BASETYPE, MOD_SIGNED, &bits_in_int, &max_int_alignment, &int_type },
- { &sint_ctype, SYM_BASETYPE, MOD_ESIGNED, &bits_in_int, &max_int_alignment, &int_type },
- { &uint_ctype, SYM_BASETYPE, MOD_UNSIGNED, &bits_in_int, &max_int_alignment, &int_type },
- { &long_ctype, SYM_BASETYPE, MOD_SIGNED | MOD_LONG, &bits_in_long, &max_int_alignment, &int_type },
- { &slong_ctype, SYM_BASETYPE, MOD_ESIGNED | MOD_LONG, &bits_in_long, &max_int_alignment, &int_type },
- { &ulong_ctype, SYM_BASETYPE, MOD_UNSIGNED | MOD_LONG, &bits_in_long, &max_int_alignment, &int_type },
- { &llong_ctype, SYM_BASETYPE, MOD_SIGNED | MOD_LL, &bits_in_llong, &max_int_alignment, &int_type },
- { &sllong_ctype, SYM_BASETYPE, MOD_ESIGNED | MOD_LL, &bits_in_llong, &max_int_alignment, &int_type },
- { &ullong_ctype, SYM_BASETYPE, MOD_UNSIGNED | MOD_LL, &bits_in_llong, &max_int_alignment, &int_type },
- { &lllong_ctype, SYM_BASETYPE, MOD_SIGNED | MOD_LLL, &bits_in_lllong, &max_int_alignment, &int_type },
- { &slllong_ctype, SYM_BASETYPE, MOD_ESIGNED | MOD_LLL, &bits_in_lllong, &max_int_alignment, &int_type },
- { &ulllong_ctype, SYM_BASETYPE, MOD_UNSIGNED | MOD_LLL, &bits_in_lllong, &max_int_alignment, &int_type },
-
- { &float_ctype, SYM_BASETYPE, 0, &bits_in_float, &max_fp_alignment, &fp_type },
- { &double_ctype, SYM_BASETYPE, MOD_LONG, &bits_in_double, &max_fp_alignment, &fp_type },
- { &ldouble_ctype, SYM_BASETYPE, MOD_LONG | MOD_LONGLONG, &bits_in_ldouble, &max_fp_alignment, &fp_type },
-
- { &float32_ctype, SYM_BASETYPE, 0, &bits_in_type32, &max_fp_alignment, &fp_type },
- { &float32x_ctype, SYM_BASETYPE, MOD_LONG, &bits_in_double, &max_fp_alignment, &fp_type },
- { &float64_ctype, SYM_BASETYPE, 0, &bits_in_type64, &max_fp_alignment, &fp_type },
- { &float64x_ctype, SYM_BASETYPE, MOD_LONG | MOD_LONGLONG, &bits_in_ldouble, &max_fp_alignment, &fp_type },
- { &float128_ctype, SYM_BASETYPE, 0, &bits_in_type128, &max_alignment, &fp_type },
-
- { &string_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &char_ctype },
- { &ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &void_ctype },
- { &null_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &void_ctype },
- { &label_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &void_ctype },
- { &lazy_ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &void_ctype },
- { &int_ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &int_ctype },
- { &uint_ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &uint_ctype },
- { &long_ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &long_ctype },
- { &ulong_ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &ulong_ctype },
- { &llong_ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &llong_ctype },
- { &ullong_ptr_ctype,SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &ullong_ctype },
-
- { &const_void_ctype, SYM_NODE, MOD_CONST, NULL, NULL, &void_ctype },
- { &const_char_ctype, SYM_NODE, MOD_CONST, &bits_in_char, &max_int_alignment, &char_ctype },
- { &const_ptr_ctype, SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &const_void_ctype },
- { &const_string_ctype,SYM_PTR, 0, &bits_in_pointer, &pointer_alignment, &const_char_ctype },
+ { &bool_ctype, T_INT(0, bool, MOD_UNSIGNED) },
+ { &void_ctype, T_BASETYPE },
+ { &type_ctype, T_BASETYPE },
+ { &incomplete_ctype, T_BASETYPE },
+ { &bad_ctype, T_BASETYPE },
+
+ { &char_ctype, T__INT(MOD_CHAR, char) },
+ { &schar_ctype, T_SINT(MOD_CHAR, char) },
+ { &uchar_ctype, T_UINT(MOD_CHAR, char) },
+ { &short_ctype, T__INT(MOD_SHORT, short) },
+ { &sshort_ctype, T_SINT(MOD_SHORT, short) },
+ { &ushort_ctype, T_UINT(MOD_SHORT, short) },
+ { &int_ctype, T__INT(0, int) },
+ { &sint_ctype, T_SINT(0, int) },
+ { &uint_ctype, T_UINT(0, int) },
+ { &long_ctype, T__INT(MOD_LONG, long) },
+ { &slong_ctype, T_SINT(MOD_LONG, long) },
+ { &ulong_ctype, T_UINT(MOD_LONG, long) },
+ { &llong_ctype, T__INT(MOD_LL, llong) },
+ { &sllong_ctype, T_SINT(MOD_LL, llong) },
+ { &ullong_ctype, T_UINT(MOD_LL, llong) },
+ { &lllong_ctype, T__INT(MOD_LLL, lllong) },
+ { &slllong_ctype, T_SINT(MOD_LLL, lllong) },
+ { &ulllong_ctype, T_UINT(MOD_LLL, lllong) },
+
+ { &float_ctype, T_FLOAT(0, float) },
+ { &double_ctype, T_FLOAT(MOD_LONG, double) },
+ { &ldouble_ctype, T_FLOAT(MOD_LL, ldouble) },
+
+ { &float32_ctype, T_FLOAT(0, type32) },
+ { &float32x_ctype, T_FLOAT(MOD_LONG, double) },
+ { &float64_ctype, T_FLOAT(MOD_LONG, type64) },
+ { &float64x_ctype, T_FLOAT(MOD_LONG, ldouble) },
+ { &float128_ctype, T_FLOAT_(MOD_LL, type128, &max_alignment) },
+
+ { &string_ctype, T_PTR(&char_ctype) },
+ { &ptr_ctype, T_PTR(&void_ctype) },
+ { &null_ctype, T_PTR(&void_ctype) },
+ { &label_ctype, T_PTR(&void_ctype) },
+ { &lazy_ptr_ctype, T_PTR(&void_ctype) },
+ { &int_ptr_ctype, T_PTR(&int_ctype) },
+ { &uint_ptr_ctype, T_PTR(&uint_ctype) },
+ { &long_ptr_ctype, T_PTR(&long_ctype) },
+ { &ulong_ptr_ctype, T_PTR(&ulong_ctype) },
+ { &llong_ptr_ctype, T_PTR(&llong_ctype) },
+ { &ullong_ptr_ctype, T_PTR(&ullong_ctype) },
+ { &const_ptr_ctype, T_PTR(&const_void_ctype) },
+ { &const_string_ctype, T_PTR(&const_char_ctype) },
+
+ { &const_void_ctype, T_CONST(&void_ctype, NULL, NULL) },
+ { &const_char_ctype, T_CONST(&char_ctype, &bits_in_char, &max_int_alignment)},
{ NULL, }
};
#undef MOD_LLL
The table ctype_declare[] is used to initialize the builtin types. It contains quite a bit information and is thus quite large and is difficult to read. Fix this by using some macros to abstract the specificities of the different kind of types, making the table narrower and much more readable. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- symbol.c | 114 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 51 deletions(-)