tccgen: propagate alignment from typedef

Store (part of) the AttributeDef structure in the (int)sym-r
field of the typedef symbol (kludgy).
This commit is contained in:
grischka
2009-12-06 17:37:33 +01:00
parent c0620c8a00
commit 56d6abdb3d
2 changed files with 34 additions and 38 deletions

View File

@ -2230,12 +2230,12 @@ static void parse_attribute(AttributeDef *ad)
case TOK_CDECL1:
case TOK_CDECL2:
case TOK_CDECL3:
FUNC_CALL(ad->func_attr) = FUNC_CDECL;
ad->func_call = FUNC_CDECL;
break;
case TOK_STDCALL1:
case TOK_STDCALL2:
case TOK_STDCALL3:
FUNC_CALL(ad->func_attr) = FUNC_STDCALL;
ad->func_call = FUNC_STDCALL;
break;
#ifdef TCC_TARGET_I386
case TOK_REGPARM1:
@ -2247,20 +2247,20 @@ static void parse_attribute(AttributeDef *ad)
else if (n < 0)
n = 0;
if (n > 0)
FUNC_CALL(ad->func_attr) = FUNC_FASTCALL1 + n - 1;
ad->func_call = FUNC_FASTCALL1 + n - 1;
skip(')');
break;
case TOK_FASTCALL1:
case TOK_FASTCALL2:
case TOK_FASTCALL3:
FUNC_CALL(ad->func_attr) = FUNC_FASTCALLW;
ad->func_call = FUNC_FASTCALLW;
break;
#endif
case TOK_DLLEXPORT:
FUNC_EXPORT(ad->func_attr) = 1;
ad->func_export = 1;
break;
case TOK_DLLIMPORT:
FUNC_IMPORT(ad->func_attr) = 1;
ad->func_import = 1;
break;
default:
if (tcc_state->warn_unsupported)
@ -2646,6 +2646,14 @@ static int parse_btype(CType *type, AttributeDef *ad)
typedef_found = 1;
t |= (s->type.t & ~VT_TYPEDEF);
type->ref = s->type.ref;
if (s->r) {
/* get attributes from typedef */
if (0 == ad->aligned)
ad->aligned = FUNC_ALIGN(s->r);
if (0 == ad->func_call)
ad->func_call = FUNC_CALL(s->r);
ad->packed |= FUNC_PACKED(s->r);
}
next();
typespec_found = 1;
break;
@ -2751,8 +2759,8 @@ static void post_type(CType *type, AttributeDef *ad)
type->t &= ~(VT_STORAGE | VT_CONSTANT);
post_type(type, ad);
/* we push a anonymous symbol which will contain the function prototype */
FUNC_ARGS(ad->func_attr) = arg_size;
s = sym_push(SYM_FIELD, type, ad->func_attr, l);
ad->func_args = arg_size;
s = sym_push(SYM_FIELD, type, INT_ATTR(ad), l);
s->next = first;
type->t = t1 | VT_FUNC;
type->ref = s;
@ -5115,13 +5123,12 @@ static void decl(int l)
if (btype.t & VT_TYPEDEF) {
/* save typedefed type */
/* XXX: test storage specifiers ? */
sym = sym_push(v, &type, 0, 0);
sym = sym_push(v, &type, INT_ATTR(&ad), 0);
sym->type.t |= VT_TYPEDEF;
} else if ((type.t & VT_BTYPE) == VT_FUNC) {
/* external function definition */
/* specific case for func_call attribute */
if (ad.func_attr)
type.ref->r = ad.func_attr;
type.ref->r = INT_ATTR(&ad);
external_sym(v, &type, 0);
} else {
/* not lvalue if array */
@ -5137,7 +5144,7 @@ static void decl(int l)
arrays of null size are considered as
extern */
#ifdef TCC_TARGET_PE
if (FUNC_IMPORT(ad.func_attr))
if (ad.func_import)
type.t |= VT_IMPORT;
#endif
external_sym(v, &type, r);