From 56d6abdb3dfa6dd51934164969123c07296ef6af Mon Sep 17 00:00:00 2001 From: grischka Date: Sun, 6 Dec 2009 17:37:33 +0100 Subject: [PATCH] tccgen: propagate alignment from typedef Store (part of) the AttributeDef structure in the (int)sym-r field of the typedef symbol (kludgy). --- tcc.h | 41 +++++++++++++++-------------------------- tccgen.c | 31 +++++++++++++++++++------------ 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/tcc.h b/tcc.h index b4819817..59384b42 100644 --- a/tcc.h +++ b/tcc.h @@ -46,9 +46,6 @@ #include /* getcwd */ #define inline __inline #define inp next_inp -#ifdef _MSC_VER -#define __aligned(n) __declspec(align(n)) -#endif #ifdef _WIN64 #define uplong unsigned long long #endif @@ -67,10 +64,6 @@ #define uplong unsigned long #endif -#ifndef __aligned -#define __aligned(n) __attribute__((aligned(n))) -#endif - #ifndef PAGESIZE #define PAGESIZE 4096 #endif @@ -263,26 +256,25 @@ typedef struct DLLReference { /* GNUC attribute definition */ typedef struct AttributeDef { - int aligned; - int packed; - Section *section; - int func_attr; /* calling convention, exports, ... */ + unsigned + packed : 1, + aligned : 5, /* alignement (0..16) */ + func_call : 3, /* calling convention (0..5), see below */ + func_export : 1, + func_import : 1, + func_args : 8; + struct Section *section; } AttributeDef; -/* -------------------------------------------------- */ /* gr: wrappers for casting sym->r for other purposes */ -typedef struct { - unsigned - func_call : 8, - func_args : 8, - func_export : 1, - func_import : 1; -} func_attr_t; +#define FUNC_CALL(r) (((AttributeDef*)&(r))->func_call) +#define FUNC_EXPORT(r) (((AttributeDef*)&(r))->func_export) +#define FUNC_IMPORT(r) (((AttributeDef*)&(r))->func_import) +#define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args) +#define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned) +#define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed) +#define INT_ATTR(ad) (*(int*)(ad)) -#define FUNC_CALL(r) (((func_attr_t*)&(r))->func_call) -#define FUNC_EXPORT(r) (((func_attr_t*)&(r))->func_export) -#define FUNC_IMPORT(r) (((func_attr_t*)&(r))->func_import) -#define FUNC_ARGS(r) (((func_attr_t*)&(r))->func_args) /* -------------------------------------------------- */ #define SYM_STRUCT 0x40000000 /* struct/union/enum symbol space */ @@ -480,9 +472,6 @@ struct TCCState { void *error_opaque; void (*error_func)(void *opaque, const char *msg); int error_set_jmp_enabled; -#ifdef _WIN64 - __aligned(16) -#endif jmp_buf error_jmp_buf; int nb_errors; diff --git a/tccgen.c b/tccgen.c index 38b0912a..58d0d89d 100644 --- a/tccgen.c +++ b/tccgen.c @@ -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);