aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrischka <grischka>2009-12-06 17:37:33 +0100
committergrischka <grischka>2009-12-06 17:37:33 +0100
commit56d6abdb3dfa6dd51934164969123c07296ef6af (patch)
tree542fc84920a1402ae7498a6a6c6d40758dd8c175
parentc0620c8a00f760765da802dc11e4863193e357e8 (diff)
downloadtinycc-56d6abdb3dfa6dd51934164969123c07296ef6af.tar.gz
tinycc-56d6abdb3dfa6dd51934164969123c07296ef6af.tar.bz2
tccgen: propagate alignment from typedef
Store (part of) the AttributeDef structure in the (int)sym-r field of the typedef symbol (kludgy).
-rw-r--r--tcc.h41
-rw-r--r--tccgen.c31
2 files changed, 34 insertions, 38 deletions
diff --git a/tcc.h b/tcc.h
index b481981..59384b4 100644
--- a/tcc.h
+++ b/tcc.h
@@ -46,9 +46,6 @@
#include <direct.h> /* 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 38b0912..58d0d89 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);