revert complicated & broken flexible array member handling

This commit is contained in:
Joe Soroka 2011-03-18 17:47:35 -07:00
parent 4062d787da
commit 06a7c415a9
2 changed files with 5 additions and 21 deletions

4
tcc.h
View File

@ -282,8 +282,7 @@ typedef struct AttributeDef {
func_args : 5, func_args : 5,
mode : 4, mode : 4,
weak : 1, weak : 1,
resize : 1, fill : 11;
fill : 10;
struct Section *section; struct Section *section;
int alias_target; /* token */ int alias_target; /* token */
} AttributeDef; } AttributeDef;
@ -295,7 +294,6 @@ typedef struct AttributeDef {
#define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args) #define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args)
#define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned) #define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned)
#define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed) #define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed)
#define ARRAY_RESIZE(r) (((AttributeDef*)&(r))->resize)
#define ATTR_MODE(r) (((AttributeDef*)&(r))->mode) #define ATTR_MODE(r) (((AttributeDef*)&(r))->mode)
#define INT_ATTR(ad) (*(int*)(ad)) #define INT_ATTR(ad) (*(int*)(ad))

View File

@ -1958,7 +1958,7 @@ ST_FUNC int type_size(CType *type, int *a)
if (bt == VT_STRUCT) { if (bt == VT_STRUCT) {
/* struct/union */ /* struct/union */
s = type->ref; s = type->ref;
*a = s->r & 0xffffff; *a = s->r;
return s->c; return s->c;
} else if (bt == VT_PTR) { } else if (bt == VT_PTR) {
if (type->t & VT_ARRAY) { if (type->t & VT_ARRAY) {
@ -2610,7 +2610,7 @@ static void parse_attribute(AttributeDef *ad)
static void struct_decl(CType *type, int u) static void struct_decl(CType *type, int u)
{ {
int a, v, size, align, maxalign, c, offset; 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; Sym *s, *ss, *ass, **ps;
AttributeDef ad; AttributeDef ad;
CType type1, btype; CType type1, btype;
@ -2671,7 +2671,6 @@ static void struct_decl(CType *type, int u)
} }
skip('}'); skip('}');
} else { } else {
resize = 0;
maxalign = 1; maxalign = 1;
ps = &s->next; ps = &s->next;
prevbt = VT_INT; prevbt = VT_INT;
@ -2762,8 +2761,6 @@ static void struct_decl(CType *type, int u)
offset = c; offset = c;
if (size > 0) if (size > 0)
c += size; c += size;
if (size < 0)
resize = 1;
} else { } else {
offset = 0; offset = 0;
if (size > c) if (size > c)
@ -2804,7 +2801,7 @@ static void struct_decl(CType *type, int u)
skip('}'); skip('}');
/* store size and alignment */ /* store size and alignment */
s->c = (c + maxalign - 1) & -maxalign; 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 /* we push a anonymous symbol which will contain the array
element type */ element type */
s = sym_push(SYM_FIELD, type, 0, n); s = sym_push(SYM_FIELD, type, 0, n);
if (n < 0)
ARRAY_RESIZE(s->r) = 1;
type->t = t1 | VT_ARRAY | VT_PTR; type->t = t1 | VT_ARRAY | VT_PTR;
type->ref = s; type->ref = s;
} }
@ -4884,8 +4879,6 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c,
} }
} else { } else {
index = 0; index = 0;
if (ARRAY_RESIZE(s->r))
n = -1;
while (tok != '}') { while (tok != '}') {
decl_designator(type, sec, c, &index, NULL, size_only); decl_designator(type, sec, c, &index, NULL, size_only);
if (n >= 0 && index >= n) if (n >= 0 && index >= n)
@ -4959,8 +4952,6 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c,
array_length = 0; array_length = 0;
index = 0; index = 0;
n = s->c; n = s->c;
if (s->r & (1<<31))
n = -1;
while (tok != '}') { while (tok != '}') {
decl_designator(type, sec, c, NULL, &f, size_only); decl_designator(type, sec, c, NULL, &f, size_only);
index = f->c; index = f->c;
@ -4997,7 +4988,7 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c,
skip(','); skip(',');
} }
/* put zeros at the end */ /* 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, init_putz(type, sec, c + array_length,
n - array_length); n - array_length);
} }
@ -5007,8 +4998,6 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c,
skip(')'); skip(')');
par_count--; par_count--;
} }
if (n < 0)
s->c = array_length;
} else if (tok == '{') { } else if (tok == '{') {
next(); next();
decl_initializer(type, sec, c, first, size_only); 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; TokenString init_str;
Section *sec; 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); size = type_size(type, &align);
/* If unknown size, we must evaluate it before /* If unknown size, we must evaluate it before
evaluating initializers because evaluating initializers because