Module Name:    src
Committed By:   christos
Date:           Sat May  2 16:10:49 UTC 2009

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

Log Message:
Add __alignof__.


To generate a diff of this commit:
cvs rdiff -u -r1.43 -r1.44 src/usr.bin/xlint/lint1/cgram.y \
    src/usr.bin/xlint/lint1/scan.l
cvs rdiff -u -r1.41 -r1.42 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.26 -r1.27 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.58 -r1.59 src/usr.bin/xlint/lint1/tree.c

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.43 src/usr.bin/xlint/lint1/cgram.y:1.44
--- src/usr.bin/xlint/lint1/cgram.y:1.43	Fri May  1 18:03:36 2009
+++ src/usr.bin/xlint/lint1/cgram.y	Sat May  2 12:10:49 2009
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.43 2009/05/01 22:03:36 christos Exp $ */
+/* $NetBSD: cgram.y,v 1.44 2009/05/02 16:10:49 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.43 2009/05/01 22:03:36 christos Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.44 2009/05/02 16:10:49 christos Exp $");
 #endif
 
 #include <stdlib.h>
@@ -130,6 +130,7 @@
 %token	<y_op>		T_UNOP
 %token	<y_op>		T_INCDEC
 %token			T_SIZEOF
+%token			T_ALIGNOF
 %token	<y_op>		T_MULT
 %token	<y_op>		T_DIVOP
 %token	<y_op>		T_ADDOP
@@ -195,7 +196,7 @@
 %left	T_SHFTOP
 %left	T_ADDOP
 %left	T_MULT T_DIVOP
-%right	T_UNOP T_INCDEC T_SIZEOF T_REAL T_IMAG
+%right	T_UNOP T_INCDEC T_SIZEOF T_ALIGNOF T_REAL T_IMAG
 %left	T_LPARN T_LBRACK T_STROP
 
 %token	<y_sb>		T_NAME
@@ -1694,6 +1695,9 @@
 	| T_SIZEOF T_LPARN type_name T_RPARN		%prec T_SIZEOF {
 		$$ = bldszof($3);
 	  }
+	| T_ALIGNOF T_LPARN type_name T_RPARN		%prec T_ALIGNOF {
+		$$ = bldalof($3);
+	  }
 	| T_LPARN type_name T_RPARN term		%prec T_UNOP {
 		$$ = cast($4, $2);
 	  }
Index: src/usr.bin/xlint/lint1/scan.l
diff -u src/usr.bin/xlint/lint1/scan.l:1.43 src/usr.bin/xlint/lint1/scan.l:1.44
--- src/usr.bin/xlint/lint1/scan.l:1.43	Tue Apr 14 21:20:57 2009
+++ src/usr.bin/xlint/lint1/scan.l	Sat May  2 12:10:49 2009
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: scan.l,v 1.43 2009/04/15 01:20:57 christos Exp $ */
+/* $NetBSD: scan.l,v 1.44 2009/05/02 16:10:49 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.43 2009/04/15 01:20:57 christos Exp $");
+__RCSID("$NetBSD: scan.l,v 1.44 2009/05/02 16:10:49 christos Exp $");
 #endif
 
 #include <stdlib.h>
@@ -193,6 +193,7 @@
 	u_int	kw_c99;		/* c99 keyword */
 	u_int	kw_gcc;		/* GCC keyword */
 } kwtab[] = {
+	{ "__alignof__",T_ALIGNOF,	0,	0,	0,	  0, 0, 0 },
 	{ "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 },

Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.41 src/usr.bin/xlint/lint1/err.c:1.42
--- src/usr.bin/xlint/lint1/err.c:1.41	Fri May  1 18:03:36 2009
+++ src/usr.bin/xlint/lint1/err.c	Sat May  2 12:10:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: err.c,v 1.41 2009/05/01 22:03:36 christos Exp $	*/
+/*	$NetBSD: err.c,v 1.42 2009/05/02 16:10:49 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.41 2009/05/01 22:03:36 christos Exp $");
+__RCSID("$NetBSD: err.c,v 1.42 2009/05/02 16:10:49 christos Exp $");
 #endif
 
 #include <sys/types.h>
@@ -202,10 +202,10 @@
 	"modulus by 0",						      /* 140 */
 	"integer overflow detected, op %s",			      /* 141 */
 	"floating point overflow detected, op %s",		      /* 142 */
-	"cannot take size of incomplete type",			      /* 143 */
-	"cannot take size of function",				      /* 144 */
-	"cannot take size of bit-field",			      /* 145 */
-	"cannot take size of void",				      /* 146 */
+	"cannot take size/alignment of incomplete type",	      /* 143 */
+	"cannot take size/alignment of function",		      /* 144 */
+	"cannot take size/alignment of bit-field",		      /* 145 */
+	"cannot take size/alignment of void",			      /* 146 */
 	"invalid cast expression",				      /* 147 */
 	"improper cast of void expression",			      /* 148 */
 	"illegal function",					      /* 149 */

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.26 src/usr.bin/xlint/lint1/externs1.h:1.27
--- src/usr.bin/xlint/lint1/externs1.h:1.26	Tue Apr 14 21:20:57 2009
+++ src/usr.bin/xlint/lint1/externs1.h	Sat May  2 12:10:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.26 2009/04/15 01:20:57 christos Exp $	*/
+/*	$NetBSD: externs1.h,v 1.27 2009/05/02 16:10:49 christos Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -200,6 +200,7 @@
 extern	tnode_t	*convert(op_t, int, type_t *, tnode_t *);
 extern	void	cvtcon(op_t, int, type_t *, val_t *, val_t *);
 extern	tnode_t	*bldszof(type_t *);
+extern	tnode_t	*bldalof(type_t *);
 extern	tnode_t	*cast(tnode_t *, type_t *);
 extern	tnode_t	*funcarg(tnode_t *, tnode_t *);
 extern	tnode_t	*funccall(tnode_t *, tnode_t *);

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.58 src/usr.bin/xlint/lint1/tree.c:1.59
--- src/usr.bin/xlint/lint1/tree.c:1.58	Mon Apr 27 11:08:10 2009
+++ src/usr.bin/xlint/lint1/tree.c	Sat May  2 12:10:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.58 2009/04/27 15:08:10 ginsbach Exp $	*/
+/*	$NetBSD: tree.c,v 1.59 2009/05/02 16:10:49 christos Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.58 2009/04/27 15:08:10 ginsbach Exp $");
+__RCSID("$NetBSD: tree.c,v 1.59 2009/05/02 16:10:49 christos Exp $");
 #endif
 
 #include <stdlib.h>
@@ -3098,6 +3098,55 @@
 }
 
 /*
+ */
+tnode_t *
+bldalof(type_t *tp)
+{
+	tspec_t	st;
+
+	switch (tp->t_tspec) {
+	case ARRAY:
+		break;
+
+	case FUNC:
+		/* cannot take align of function */
+		error(144);
+		return 0;
+
+	case STRUCT:
+	case UNION:
+		if (incompl(tp)) {
+			/* cannot take align of incomplete type */
+			error(143);
+			return 0;
+		}
+		break;
+	case ENUM:
+		break;
+	default:
+		if (tp->t_isfield) {
+			/* cannot take align of bit-field */
+			error(145);
+			return 0;
+		}
+		if (tp->t_tspec == VOID) {
+			/* cannot take alignsize of void */
+			error(146);
+			return 0;
+		}
+		break;
+	}
+
+#if SIZEOF_IS_ULONG
+	st = ULONG;
+#else
+	st = UINT;
+#endif
+
+	return getinode(st, (int64_t)getbound(tp));
+}
+
+/*
  * Type casts.
  */
 tnode_t *

Reply via email to