diff --git a/tcc.h b/tcc.h
index b4819817..59384b42 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 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);