1169689Skan/* Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
290075Sobrien   Contributed by Joseph Myers <jsm28@cam.ac.uk>.
390075Sobrien
490075SobrienThis file is part of GCC.
590075Sobrien
690075SobrienGCC is free software; you can redistribute it and/or modify it under
790075Sobrienthe terms of the GNU General Public License as published by the Free
890075SobrienSoftware Foundation; either version 2, or (at your option) any later
990075Sobrienversion.
1090075Sobrien
1190075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1290075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1390075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1490075Sobrienfor more details.
1590075Sobrien
1690075SobrienYou should have received a copy of the GNU General Public License
1790075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
18169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
19169689Skan02110-1301, USA.  */
2090075Sobrien
2190075Sobrien/* This header provides a declarative way of describing the attributes
2290075Sobrien   that are applied to some functions by default.
2390075Sobrien
2490075Sobrien   Before including this header, you must define the following macros.
2590075Sobrien   In each case where there is an ENUM, it is an identifier used to
2690075Sobrien   reference the tree in subsequent definitions.
2790075Sobrien
2890075Sobrien   DEF_ATTR_NULL_TREE (ENUM)
2990075Sobrien
3090075Sobrien     Constructs a NULL_TREE.
3190075Sobrien
3290075Sobrien   DEF_ATTR_INT (ENUM, VALUE)
3390075Sobrien
3490075Sobrien     Constructs an INTEGER_CST with value VALUE (an integer representable
3590075Sobrien     in HOST_WIDE_INT).
3690075Sobrien
3790075Sobrien   DEF_ATTR_IDENT (ENUM, STRING)
3890075Sobrien
3990075Sobrien     Constructs an IDENTIFIER_NODE for STRING.
4090075Sobrien
4190075Sobrien   DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN)
4290075Sobrien
4390075Sobrien     Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given
44132718Skan     as previous ENUM names).  */
4590075Sobrien
4690075SobrienDEF_ATTR_NULL_TREE (ATTR_NULL)
4790075Sobrien
4890075Sobrien/* Construct a tree for a given integer and a list containing it.  */
4990075Sobrien#define DEF_ATTR_FOR_INT(VALUE)					\
50132718Skan  DEF_ATTR_INT (ATTR_##VALUE, VALUE)			\
51132718Skan  DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE, ATTR_NULL,	\
52132718Skan		      ATTR_##VALUE, ATTR_NULL)
5390075SobrienDEF_ATTR_FOR_INT (0)
5490075SobrienDEF_ATTR_FOR_INT (1)
5590075SobrienDEF_ATTR_FOR_INT (2)
5690075SobrienDEF_ATTR_FOR_INT (3)
5790075SobrienDEF_ATTR_FOR_INT (4)
58169689SkanDEF_ATTR_FOR_INT (5)
59169689SkanDEF_ATTR_FOR_INT (6)
6090075Sobrien#undef DEF_ATTR_FOR_INT
6190075Sobrien
6290075Sobrien/* Construct a tree for a list of two integers.  */
6390075Sobrien#define DEF_LIST_INT_INT(VALUE1, VALUE2)				 \
64132718Skan  DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2, ATTR_NULL,		 \
65132718Skan		      ATTR_##VALUE1, ATTR_LIST_##VALUE2)
6690075SobrienDEF_LIST_INT_INT (1,0)
6790075SobrienDEF_LIST_INT_INT (1,2)
6890075SobrienDEF_LIST_INT_INT (2,0)
6990075SobrienDEF_LIST_INT_INT (2,3)
7090075SobrienDEF_LIST_INT_INT (3,0)
7190075SobrienDEF_LIST_INT_INT (3,4)
72169689SkanDEF_LIST_INT_INT (4,0)
73169689SkanDEF_LIST_INT_INT (4,5)
74169689SkanDEF_LIST_INT_INT (5,0)
75169689SkanDEF_LIST_INT_INT (5,6)
7690075Sobrien#undef DEF_LIST_INT_INT
7790075Sobrien
78169689Skan/* Construct trees for identifiers.  */
79117395SkanDEF_ATTR_IDENT (ATTR_CONST, "const")
80117395SkanDEF_ATTR_IDENT (ATTR_FORMAT, "format")
81117395SkanDEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")
82117395SkanDEF_ATTR_IDENT (ATTR_MALLOC, "malloc")
83117395SkanDEF_ATTR_IDENT (ATTR_NONNULL, "nonnull")
84117395SkanDEF_ATTR_IDENT (ATTR_NORETURN, "noreturn")
85117395SkanDEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow")
8690075SobrienDEF_ATTR_IDENT (ATTR_PRINTF, "printf")
87132718SkanDEF_ATTR_IDENT (ATTR_ASM_FPRINTF, "asm_fprintf")
88132718SkanDEF_ATTR_IDENT (ATTR_GCC_DIAG, "gcc_diag")
89132718SkanDEF_ATTR_IDENT (ATTR_GCC_CDIAG, "gcc_cdiag")
90132718SkanDEF_ATTR_IDENT (ATTR_GCC_CXXDIAG, "gcc_cxxdiag")
91117395SkanDEF_ATTR_IDENT (ATTR_PURE, "pure")
92169689SkanDEF_ATTR_IDENT (ATTR_NOVOPS, "no vops")
9390075SobrienDEF_ATTR_IDENT (ATTR_SCANF, "scanf")
94169689SkanDEF_ATTR_IDENT (ATTR_SENTINEL, "sentinel")
95117395SkanDEF_ATTR_IDENT (ATTR_STRFMON, "strfmon")
9690075SobrienDEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
9790075Sobrien
98169689SkanDEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST, ATTR_NOVOPS, ATTR_NULL, ATTR_NULL)
99169689Skan
100117395SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL)
10190075Sobrien
102117395SkanDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST,	\
103117395Skan			ATTR_NULL, ATTR_NOTHROW_LIST)
104117395SkanDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE,		\
105117395Skan			ATTR_NULL, ATTR_NOTHROW_LIST)
106169689SkanDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NOVOPS_LIST, ATTR_NOVOPS,	\
107169689Skan			ATTR_NULL, ATTR_PURE_NOTHROW_LIST)
108117395SkanDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN,	\
109117395Skan			ATTR_NULL, ATTR_NOTHROW_LIST)
110117395SkanDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC,	\
111117395Skan			ATTR_NULL, ATTR_NOTHROW_LIST)
112169689SkanDEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL,	\
113169689Skan			ATTR_NULL, ATTR_NOTHROW_LIST)
114117395Skan
115169689Skan/* Functions whose pointer parameter(s) are all nonnull.  */
116169689SkanDEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST, ATTR_NONNULL, ATTR_NULL, ATTR_NULL)
117169689Skan/* Functions whose first parameter is a nonnull pointer.  */
118169689SkanDEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL)
119169689Skan/* Functions whose second parameter is a nonnull pointer.  */
120169689SkanDEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL)
121169689Skan/* Nothrow functions with the sentinel(1) attribute. */
122169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \
123169689Skan			ATTR_NOTHROW_LIST)
124169689Skan/* Nothrow functions whose pointer parameter(s) are all nonnull.  */
125169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL, ATTR_NONNULL, ATTR_NULL, \
126169689Skan			ATTR_NOTHROW_LIST)
127169689Skan/* Nothrow functions whose first parameter is a nonnull pointer.  */
128132718SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \
129117395Skan			ATTR_NOTHROW_LIST)
130169689Skan/* Nothrow functions whose second parameter is a nonnull pointer.  */
131132718SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, \
132117395Skan			ATTR_NOTHROW_LIST)
133169689Skan/* Nothrow functions whose third parameter is a nonnull pointer.  */
134132718SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, \
135117395Skan			ATTR_NOTHROW_LIST)
136169689Skan/* Nothrow functions whose fourth parameter is a nonnull pointer.  */
137169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4, ATTR_NONNULL, ATTR_LIST_4, \
138169689Skan			ATTR_NOTHROW_LIST)
139169689Skan/* Nothrow functions whose fifth parameter is a nonnull pointer.  */
140169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5, ATTR_NONNULL, ATTR_LIST_5, \
141169689Skan			ATTR_NOTHROW_LIST)
142169689Skan/* Nothrow const functions whose pointer parameter(s) are all nonnull.  */
143169689SkanDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL, ATTR_CONST, ATTR_NULL, \
144169689Skan			ATTR_NOTHROW_NONNULL)
145169689Skan/* Nothrow pure functions whose pointer parameter(s) are all nonnull.  */
146169689SkanDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL, ATTR_PURE, ATTR_NULL, \
147169689Skan			ATTR_NOTHROW_NONNULL)
148169689Skan/* Nothrow malloc functions whose pointer parameter(s) are all nonnull.  */
149169689SkanDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL, ATTR_MALLOC, ATTR_NULL, \
150169689Skan			ATTR_NOTHROW_NONNULL)
151117395Skan
15290075Sobrien/* Construct a tree for a format attribute.  */
153117395Skan#define DEF_FORMAT_ATTRIBUTE(TYPE, FA, VALUES)				 \
154132718Skan  DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL,		 \
155132718Skan		      ATTR_##TYPE, ATTR_LIST_##VALUES)			 \
156132718Skan  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT,	 \
157132718Skan		      ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA)
158117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_0)
159117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_2)
160117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,2,2_0)
161117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,2,2_3)
162117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,3,3_0)
163117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,3,3_4)
164169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,4,4_0)
165169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,4,4_5)
166169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,5,5_0)
167169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,5,5_6)
168117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,1,1_0)
169117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,1,1_2)
170117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,2,2_0)
171117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,2,2_3)
172117395SkanDEF_FORMAT_ATTRIBUTE(STRFTIME,3,3_0)
173117395SkanDEF_FORMAT_ATTRIBUTE(STRFMON,3,3_4)
17490075Sobrien#undef DEF_FORMAT_ATTRIBUTE
17590075Sobrien
176117395Skan/* Construct a tree for a format_arg attribute.  */
177117395Skan#define DEF_FORMAT_ARG_ATTRIBUTE(FA)					\
178132718Skan  DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA, ATTR_FORMAT_ARG,		\
179132718Skan		      ATTR_LIST_##FA, ATTR_NOTHROW_NONNULL_##FA)
180117395SkanDEF_FORMAT_ARG_ATTRIBUTE(1)
181117395SkanDEF_FORMAT_ARG_ATTRIBUTE(2)
182117395Skan#undef DEF_FORMAT_ARG_ATTRIBUTE
18390075Sobrien
184