diff --git a/tcc.h b/tcc.h index 6d378607..ae480475 100644 --- a/tcc.h +++ b/tcc.h @@ -282,8 +282,7 @@ typedef struct AttributeDef { func_args : 5, mode : 4, weak : 1, - resize : 1, - fill : 10; + fill : 11; struct Section *section; int alias_target; /* token */ } AttributeDef; @@ -295,7 +294,6 @@ typedef struct AttributeDef { #define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args) #define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned) #define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed) -#define ARRAY_RESIZE(r) (((AttributeDef*)&(r))->resize) #define ATTR_MODE(r) (((AttributeDef*)&(r))->mode) #define INT_ATTR(ad) (*(int*)(ad)) diff --git a/tccgen.c b/tccgen.c index 604f93c9..25babbb6 100644 --- a/tccgen.c +++ b/tccgen.c @@ -1958,7 +1958,7 @@ ST_FUNC int type_size(CType *type, int *a) if (bt == VT_STRUCT) { /* struct/union */ s = type->ref; - *a = s->r & 0xffffff; + *a = s->r; return s->c; } else if (bt == VT_PTR) { if (type->t & VT_ARRAY) { @@ -2610,7 +2610,7 @@ static void parse_attribute(AttributeDef *ad) static void struct_decl(CType *type, int u) { int a, v, size, align, maxalign, c, offset; - int bit_size, bit_pos, bsize, bt, lbit_pos, prevbt, resize; + int bit_size, bit_pos, bsize, bt, lbit_pos, prevbt; Sym *s, *ss, *ass, **ps; AttributeDef ad; CType type1, btype; @@ -2671,7 +2671,6 @@ static void struct_decl(CType *type, int u) } skip('}'); } else { - resize = 0; maxalign = 1; ps = &s->next; prevbt = VT_INT; @@ -2762,8 +2761,6 @@ static void struct_decl(CType *type, int u) offset = c; if (size > 0) c += size; - if (size < 0) - resize = 1; } else { offset = 0; if (size > c) @@ -2804,7 +2801,7 @@ static void struct_decl(CType *type, int u) skip('}'); /* store size and alignment */ s->c = (c + maxalign - 1) & -maxalign; - s->r = maxalign | (resize ? (1 << 31) : 0); + s->r = maxalign; } } } @@ -3147,8 +3144,6 @@ static void post_type(CType *type, AttributeDef *ad) /* we push a anonymous symbol which will contain the array element type */ s = sym_push(SYM_FIELD, type, 0, n); - if (n < 0) - ARRAY_RESIZE(s->r) = 1; type->t = t1 | VT_ARRAY | VT_PTR; type->ref = s; } @@ -4884,8 +4879,6 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, } } else { index = 0; - if (ARRAY_RESIZE(s->r)) - n = -1; while (tok != '}') { decl_designator(type, sec, c, &index, NULL, size_only); if (n >= 0 && index >= n) @@ -4959,8 +4952,6 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, array_length = 0; index = 0; n = s->c; - if (s->r & (1<<31)) - n = -1; while (tok != '}') { decl_designator(type, sec, c, NULL, &f, size_only); index = f->c; @@ -4997,7 +4988,7 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, skip(','); } /* put zeros at the end */ - if (!size_only && n >= 0 && array_length < n) { + if (!size_only && array_length < n) { init_putz(type, sec, c + array_length, n - array_length); } @@ -5007,8 +4998,6 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, skip(')'); par_count--; } - if (n < 0) - s->c = array_length; } else if (tok == '{') { next(); decl_initializer(type, sec, c, first, size_only); @@ -5056,9 +5045,6 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, TokenString init_str; Section *sec; - /* resize the struct */ - if ((type->t & VT_BTYPE) == VT_STRUCT && (type->ref->r & (1<<31)) != 0) - type->ref->c = -1; size = type_size(type, &align); /* If unknown size, we must evaluate it before evaluating initializers because