Module Name:    src
Committed By:   christos
Date:           Fri Oct  2 15:03:45 UTC 2009

Modified Files:
        src/usr.bin/xlint/lint1: cgram.y decl.c err.c externs1.h lint1.h scan.l

Log Message:
understand __attribute__((__packed__)) and __packed.


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/usr.bin/xlint/lint1/cgram.y \
    src/usr.bin/xlint/lint1/scan.l
cvs rdiff -u -r1.46 -r1.47 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.42 -r1.43 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.27 -r1.28 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.22 -r1.23 src/usr.bin/xlint/lint1/lint1.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.44 src/usr.bin/xlint/lint1/cgram.y:1.45
--- src/usr.bin/xlint/lint1/cgram.y:1.44	Sat May  2 12:10:49 2009
+++ src/usr.bin/xlint/lint1/cgram.y	Fri Oct  2 11:03:45 2009
@@ -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);
Index: src/usr.bin/xlint/lint1/scan.l
diff -u src/usr.bin/xlint/lint1/scan.l:1.44 src/usr.bin/xlint/lint1/scan.l:1.45
--- src/usr.bin/xlint/lint1/scan.l:1.44	Sat May  2 12:10:49 2009
+++ src/usr.bin/xlint/lint1/scan.l	Fri Oct  2 11:03:45 2009
@@ -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 },

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.46 src/usr.bin/xlint/lint1/decl.c:1.47
--- src/usr.bin/xlint/lint1/decl.c:1.46	Tue Apr 14 21:20:57 2009
+++ src/usr.bin/xlint/lint1/decl.c	Fri Oct  2 11:03:45 2009
@@ -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);
 }
 

Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.42 src/usr.bin/xlint/lint1/err.c:1.43
--- src/usr.bin/xlint/lint1/err.c:1.42	Sat May  2 12:10:49 2009
+++ src/usr.bin/xlint/lint1/err.c	Fri Oct  2 11:03:45 2009
@@ -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 */
 };
 
 /*

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.27 src/usr.bin/xlint/lint1/externs1.h:1.28
--- src/usr.bin/xlint/lint1/externs1.h:1.27	Sat May  2 12:10:49 2009
+++ src/usr.bin/xlint/lint1/externs1.h	Fri Oct  2 11:03:45 2009
@@ -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);

Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.22 src/usr.bin/xlint/lint1/lint1.h:1.23
--- src/usr.bin/xlint/lint1/lint1.h:1.22	Wed Dec 10 11:12:39 2008
+++ src/usr.bin/xlint/lint1/lint1.h	Fri Oct  2 11:03:45 2009
@@ -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 */

Reply via email to