mirror of
https://github.com/frida/tinycc
synced 2024-11-24 00:29:38 +03:00
revert complicated & broken flexible array member handling
This commit is contained in:
parent
4062d787da
commit
06a7c415a9
4
tcc.h
4
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))
|
||||
|
||||
|
22
tccgen.c
22
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
|
||||
|
Loading…
Reference in New Issue
Block a user