Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/xlint/lint1 understand __attribute__((__packed__)) a...



details:   https://anonhg.NetBSD.org/src/rev/ee61e30bb847
branches:  trunk
changeset: 747789:ee61e30bb847
user:      christos <christos%NetBSD.org@localhost>
date:      Fri Oct 02 15:03:45 2009 +0000

description:
understand __attribute__((__packed__)) and __packed.

diffstat:

 usr.bin/xlint/lint1/cgram.y    |  37 ++++++++++++++++++++++++++++++-
 usr.bin/xlint/lint1/decl.c     |  48 +++++++++++++++++++++++++++++++++++------
 usr.bin/xlint/lint1/err.c      |   5 ++-
 usr.bin/xlint/lint1/externs1.h |   3 +-
 usr.bin/xlint/lint1/lint1.h    |   3 +-
 usr.bin/xlint/lint1/scan.l     |  21 +++++++++++++++--
 6 files changed, 101 insertions(+), 16 deletions(-)

diffs (286 lines):

diff -r c26f7125eec2 -r ee61e30bb847 usr.bin/xlint/lint1/cgram.y
--- a/usr.bin/xlint/lint1/cgram.y       Fri Oct 02 14:40:36 2009 +0000
+++ b/usr.bin/xlint/lint1/cgram.y       Fri Oct 02 15:03:45 2009 +0000
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.44 2009/05/02 16:10:49 christos Exp $ */
+/* $NetBSD: cgram.y,v 1.45 2009/10/02 15:03:45 christos Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.44 2009/05/02 16:10:49 christos Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.45 2009/10/02 15:03:45 christos Exp $");
 #endif
 
 #include <stdlib.h>
@@ -182,6 +182,18 @@
 %token                 T_RETURN
 %token                 T_ASM
 %token                 T_SYMBOLRENAME
+%token                 T_PACKED
+/* Type Attributes */
+%token <y_type>                T_ATTRIBUTE
+%token <y_type>                T_AT_ALIGNED
+%token <y_type>                T_AT_DEPRECATED
+%token <y_type>                T_AT_MAY_ALIAS
+%token <y_type>                T_AT_PACKED
+%token <y_type>                T_AT_TUINION
+%token <y_type>                T_AT_TUNION
+%token <y_type>                T_AT_UNUSED
+
+
 
 %left  T_COMMA
 %right T_ASSIGN T_OPASS
@@ -212,6 +224,8 @@
 %type  <y_type>        notype_typespec
 %type  <y_type>        struct_spec
 %type  <y_type>        enum_spec
+%type  <y_type>        type_attribute
+%type  <y_type>        type_attribute_spec
 %type  <y_sym>         struct_tag
 %type  <y_sym>         enum_tag
 %type  <y_tspec>       struct
@@ -454,6 +468,24 @@
        | error T_SEMI
        ;
 
+type_attribute_spec:
+         T_AT_DEPRECATED
+       | T_AT_ALIGNED T_LPARN constant T_RPARN
+       | T_AT_MAY_ALIAS
+       | T_AT_PACKED {
+               addpacked();
+       }
+       | T_AT_TUNION
+       | T_AT_UNUSED
+       ;
+
+type_attribute:
+         T_ATTRIBUTE T_LPARN T_LPARN type_attribute_spec T_RPARN T_RPARN
+       | T_PACKED {
+               addpacked();
+       }
+       ;
+
 clrtyp:
          {
                clrtyp();
@@ -473,6 +505,7 @@
        | declmods typespec {
                addtype($2);
          }
+       | declspecs type_attribute
        | declspecs declmod
        | declspecs notype_typespec {
                addtype($2);
diff -r c26f7125eec2 -r ee61e30bb847 usr.bin/xlint/lint1/decl.c
--- a/usr.bin/xlint/lint1/decl.c        Fri Oct 02 14:40:36 2009 +0000
+++ b/usr.bin/xlint/lint1/decl.c        Fri Oct 02 15:03:45 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.46 2009/04/15 01:20:57 christos Exp $ */
+/* $NetBSD: decl.c,v 1.47 2009/10/02 15:03:45 christos Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: decl.c,v 1.46 2009/04/15 01:20:57 christos Exp $");
+__RCSID("$NetBSD: decl.c,v 1.47 2009/10/02 15:03:45 christos Exp $");
 #endif
 
 #include <sys/param.h>
@@ -484,6 +484,41 @@
        }
 }
 
+void
+addpacked(void)
+{
+       str_t *sp;
+       sym_t *mem;
+       type_t *tp = dcs->d_type;
+       char buf[256];
+
+       if (tp == NULL)
+               LERROR("no type attr");
+
+       tp->t_ispacked = 1;
+
+       switch (tp->t_tspec) {
+       case STRUCT:
+               sp = tp->t_str;
+               sp->size = 0;
+               for (mem = sp->memb; mem != NULL; mem = mem->s_nxt)
+                       sp->size += size(mem->s_type->t_tspec);
+               break;
+       case UNION:
+               sp = tp->t_str;
+               sp->size = 0;
+               for (mem = sp->memb; mem != NULL; mem = mem->s_nxt) {
+                       size_t x = size(mem->s_type->t_tspec);
+                       if (x > sp->size)
+                               sp->size = x;
+               }
+               break;
+       default:
+               warning(326, "packed", tyname(buf, sizeof(buf), tp));
+               break;
+       }
+}
+
 /*
  * Remember a qualifier which is part of the declaration specifiers
  * (and not the declarator) in the top element of the declaration stack.
@@ -522,15 +557,15 @@
 {
        dinfo_t *di;
 
-       if (dflag)
-               (void)printf("pushdecl(%d)\n", (int)sc);
-
        /* put a new element on the declaration stack */
        di = xcalloc(1, sizeof (dinfo_t));
        di->d_nxt = dcs;
        dcs = di;
        di->d_ctx = sc;
        di->d_ldlsym = &di->d_dlsyms;
+       if (dflag)
+               (void)printf("pushdecl(%p %d)\n", dcs, (int)sc);
+
 }
 
 /*
@@ -542,7 +577,7 @@
        dinfo_t *di;
 
        if (dflag)
-               (void)printf("popdecl(%d)\n", (int)dcs->d_ctx);
+               (void)printf("popdecl(%p %d)\n", dcs, (int)dcs->d_ctx);
 
        if (dcs->d_nxt == NULL)
                LERROR("popdecl()");
@@ -1617,7 +1652,6 @@
                /* ist unvollstaendiger Typ */
                setcompl(tp, 1);
        }
-
        return (tp);
 }
 
diff -r c26f7125eec2 -r ee61e30bb847 usr.bin/xlint/lint1/err.c
--- a/usr.bin/xlint/lint1/err.c Fri Oct 02 14:40:36 2009 +0000
+++ b/usr.bin/xlint/lint1/err.c Fri Oct 02 15:03:45 2009 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: err.c,v 1.42 2009/05/02 16:10:49 christos Exp $        */
+/*     $NetBSD: err.c,v 1.43 2009/10/02 15:03:45 christos Exp $        */
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: err.c,v 1.42 2009/05/02 16:10:49 christos Exp $");
+__RCSID("$NetBSD: err.c,v 1.43 2009/10/02 15:03:45 christos Exp $");
 #endif
 
 #include <sys/types.h>
@@ -385,6 +385,7 @@
        "continue in 'do ... while (0)' loop",                        /* 323 */
        "suggest cast from '%s' to '%s' on op %s to avoid overflow",  /* 324 */
        "variable declaration in for loop",                           /* 325 */
+       "%s attribute ignored for %s",                                /* 326 */
 };
 
 /*
diff -r c26f7125eec2 -r ee61e30bb847 usr.bin/xlint/lint1/externs1.h
--- a/usr.bin/xlint/lint1/externs1.h    Fri Oct 02 14:40:36 2009 +0000
+++ b/usr.bin/xlint/lint1/externs1.h    Fri Oct 02 15:03:45 2009 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: externs1.h,v 1.27 2009/05/02 16:10:49 christos Exp $   */
+/*     $NetBSD: externs1.h,v 1.28 2009/10/02 15:03:45 christos Exp $   */
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -141,6 +141,7 @@
 extern void    addscl(scl_t);
 extern void    addtype(type_t *);
 extern void    addqual(tqual_t);
+extern void    addpacked(void);
 extern void    pushdecl(scl_t);
 extern void    popdecl(void);
 extern void    setasm(void);
diff -r c26f7125eec2 -r ee61e30bb847 usr.bin/xlint/lint1/lint1.h
--- a/usr.bin/xlint/lint1/lint1.h       Fri Oct 02 14:40:36 2009 +0000
+++ b/usr.bin/xlint/lint1/lint1.h       Fri Oct 02 15:03:45 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.22 2008/12/10 16:12:39 joerg Exp $ */
+/* $NetBSD: lint1.h,v 1.23 2009/10/02 15:03:45 christos Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -143,6 +143,7 @@
        u_int   t_typedef : 1;  /* type defined with typedef */
        u_int   t_isfield : 1;  /* type is bitfield */
        u_int   t_isenum : 1;   /* type is (or was) enum (t_enum valid) */
+       u_int   t_ispacked : 1; /* type is packed */
        union {
                int     _t_dim;         /* dimension */
                str_t   *_t_str;        /* struct/union tag */
diff -r c26f7125eec2 -r ee61e30bb847 usr.bin/xlint/lint1/scan.l
--- a/usr.bin/xlint/lint1/scan.l        Fri Oct 02 14:40:36 2009 +0000
+++ b/usr.bin/xlint/lint1/scan.l        Fri Oct 02 15:03:45 2009 +0000
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: scan.l,v 1.44 2009/05/02 16:10:49 christos Exp $ */
+/* $NetBSD: scan.l,v 1.45 2009/10/02 15:03:45 christos Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: scan.l,v 1.44 2009/05/02 16:10:49 christos Exp $");
+__RCSID("$NetBSD: scan.l,v 1.45 2009/10/02 15:03:45 christos Exp $");
 #endif
 
 #include <stdlib.h>
@@ -193,7 +193,21 @@
        u_int   kw_c99;         /* c99 keyword */
        u_int   kw_gcc;         /* GCC keyword */
 } kwtab[] = {
-       { "__alignof__",T_ALIGNOF,      0,      0,      0,        0, 0, 0 },
+       { "__alignof__", T_ALIGNOF,     0,      0,      0,        0, 0, 0 },
+       { "__attribute__",T_ATTRIBUTE,  0,      0,      0,        0, 0, 1 },
+       { "attribute",  T_ATTRIBUTE,    0,      0,      0,        0, 0, 1 },
+       { "__packed__", T_AT_PACKED,    0,      0,      0,        0, 0, 1 },
+       { "packed",     T_AT_PACKED,    0,      0,      0,        0, 0, 1 },
+       { "__aligned__",T_AT_ALIGNED,   0,      0,      0,        0, 0, 1 },
+       { "aligned",    T_AT_ALIGNED,   0,      0,      0,        0, 0, 1 },
+       { "__transparent_union__",T_AT_TUNION,0,0,      0,        0, 0, 1 },
+       { "transparent_union",T_AT_TUNION,0,    0,      0,        0, 0, 1 },
+       { "__unused__", T_AT_UNUSED,    0,      0,      0,        0, 0, 1 },
+       { "unused",     T_AT_UNUSED,    0,      0,      0,        0, 0, 1 },
+       { "__deprecated__",T_AT_DEPRECATED,0,   0,      0,        0, 0, 1 },
+       { "deprecated", T_AT_DEPRECATED,0,      0,      0,        0, 0, 1 },
+       { "__may_alias__",T_AT_MAY_ALIAS,0,     0,      0,        0, 0, 1 },
+       { "may_alias",  T_AT_MAY_ALIAS, 0,      0,      0,        0, 0, 1 },
        { "asm",        T_ASM,          0,      0,      0,        0, 0, 1 },
        { "__asm",      T_ASM,          0,      0,      0,        0, 0, 0 },
        { "__asm__",    T_ASM,          0,      0,      0,        0, 0, 0 },
@@ -228,6 +242,7 @@
        { "register",   T_SCLASS,       REG,    0,      0,        0, 0, 0 },
        { "restrict",   T_QUAL,         0,      0,      RESTRICT, 0, 1, 0 },
        { "return",     T_RETURN,       0,      0,      0,        0, 0, 0 },
+       { "__packed",   T_PACKED,       0,      0,      0,        0, 0, 0 },
        { "short",      T_TYPE,         0,      SHORT,  0,        0, 0, 0 },
        { "signed",     T_TYPE,         0,      SIGNED, 0,        1, 0, 0 },
        { "__signed__", T_TYPE,         0,      SIGNED, 0,        0, 0, 0 },



Home | Main Index | Thread Index | Old Index