xref: /dflybsd-src/contrib/gcc-8.0/gcc/builtin-attrs.def (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj/* Copyright (C) 2001-2018 Free Software Foundation, Inc.
2*38fd1498Szrj   Contributed by Joseph Myers <jsm28@cam.ac.uk>.
3*38fd1498Szrj
4*38fd1498SzrjThis file is part of GCC.
5*38fd1498Szrj
6*38fd1498SzrjGCC is free software; you can redistribute it and/or modify it under
7*38fd1498Szrjthe terms of the GNU General Public License as published by the Free
8*38fd1498SzrjSoftware Foundation; either version 3, or (at your option) any later
9*38fd1498Szrjversion.
10*38fd1498Szrj
11*38fd1498SzrjGCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*38fd1498SzrjWARRANTY; without even the implied warranty of MERCHANTABILITY or
13*38fd1498SzrjFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*38fd1498Szrjfor more details.
15*38fd1498Szrj
16*38fd1498SzrjYou should have received a copy of the GNU General Public License
17*38fd1498Szrjalong with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj<http://www.gnu.org/licenses/>.  */
19*38fd1498Szrj
20*38fd1498Szrj/* This header provides a declarative way of describing the attributes
21*38fd1498Szrj   that are applied to some built-in functions by default.  Attributes
22*38fd1498Szrj   that are meant to be used by user-defined functions but aren't used
23*38fd1498Szrj   by any built-ins, or attributes that apply to types or variables
24*38fd1498Szrj   but not to functions need not and should not be defined here.
25*38fd1498Szrj
26*38fd1498Szrj   Before including this header, you must define the following macros.
27*38fd1498Szrj   In each case where there is an ENUM, it is an identifier used to
28*38fd1498Szrj   reference the tree in subsequent definitions.
29*38fd1498Szrj
30*38fd1498Szrj   DEF_ATTR_NULL_TREE (ENUM)
31*38fd1498Szrj
32*38fd1498Szrj     Constructs a NULL_TREE.
33*38fd1498Szrj
34*38fd1498Szrj   DEF_ATTR_INT (ENUM, VALUE)
35*38fd1498Szrj
36*38fd1498Szrj     Constructs an INTEGER_CST with value VALUE (an integer representable
37*38fd1498Szrj     in HOST_WIDE_INT).
38*38fd1498Szrj
39*38fd1498Szrj   DEF_ATTR_IDENT (ENUM, STRING)
40*38fd1498Szrj
41*38fd1498Szrj     Constructs an IDENTIFIER_NODE for STRING.
42*38fd1498Szrj
43*38fd1498Szrj   DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN)
44*38fd1498Szrj
45*38fd1498Szrj     Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given
46*38fd1498Szrj     as previous ENUM names).  */
47*38fd1498Szrj
48*38fd1498SzrjDEF_ATTR_NULL_TREE (ATTR_NULL)
49*38fd1498Szrj
50*38fd1498Szrj/* Construct a tree for a given integer and a list containing it.  */
51*38fd1498Szrj#define DEF_ATTR_FOR_INT(VALUE)					\
52*38fd1498Szrj  DEF_ATTR_INT (ATTR_##VALUE, VALUE)			\
53*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE, ATTR_NULL,	\
54*38fd1498Szrj		      ATTR_##VALUE, ATTR_NULL)
55*38fd1498SzrjDEF_ATTR_FOR_INT (0)
56*38fd1498SzrjDEF_ATTR_FOR_INT (1)
57*38fd1498SzrjDEF_ATTR_FOR_INT (2)
58*38fd1498SzrjDEF_ATTR_FOR_INT (3)
59*38fd1498SzrjDEF_ATTR_FOR_INT (4)
60*38fd1498SzrjDEF_ATTR_FOR_INT (5)
61*38fd1498SzrjDEF_ATTR_FOR_INT (6)
62*38fd1498Szrj#undef DEF_ATTR_FOR_INT
63*38fd1498Szrj
64*38fd1498Szrj/* Construct a tree for a given string and a list containing it.  */
65*38fd1498Szrj#define DEF_ATTR_FOR_STRING(ENUM, VALUE)					\
66*38fd1498Szrj  DEF_ATTR_STRING (ATTR_##ENUM, VALUE)			\
67*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_LIST_##ENUM, ATTR_NULL,	\
68*38fd1498Szrj		      ATTR_##ENUM, ATTR_NULL)
69*38fd1498SzrjDEF_ATTR_FOR_STRING (STR1, "1")
70*38fd1498Szrj#undef DEF_ATTR_FOR_STRING
71*38fd1498Szrj
72*38fd1498Szrj/* Construct a tree for a list of two integers.  */
73*38fd1498Szrj#define DEF_LIST_INT_INT(VALUE1, VALUE2)				 \
74*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2, ATTR_NULL,		 \
75*38fd1498Szrj		      ATTR_##VALUE1, ATTR_LIST_##VALUE2)
76*38fd1498SzrjDEF_LIST_INT_INT (1,0)
77*38fd1498SzrjDEF_LIST_INT_INT (1,2)
78*38fd1498SzrjDEF_LIST_INT_INT (1,3)
79*38fd1498SzrjDEF_LIST_INT_INT (1,4)
80*38fd1498SzrjDEF_LIST_INT_INT (1,5)
81*38fd1498SzrjDEF_LIST_INT_INT (2,0)
82*38fd1498SzrjDEF_LIST_INT_INT (2,3)
83*38fd1498SzrjDEF_LIST_INT_INT (3,0)
84*38fd1498SzrjDEF_LIST_INT_INT (3,4)
85*38fd1498SzrjDEF_LIST_INT_INT (4,0)
86*38fd1498SzrjDEF_LIST_INT_INT (4,5)
87*38fd1498SzrjDEF_LIST_INT_INT (5,0)
88*38fd1498SzrjDEF_LIST_INT_INT (5,6)
89*38fd1498Szrj#undef DEF_LIST_INT_INT
90*38fd1498Szrj
91*38fd1498Szrj/* Construct trees for identifiers used in built-in function attributes.
92*38fd1498Szrj   The construction contributes to startup costs so only attributes that
93*38fd1498Szrj   are used to define built-ins should be defined here.  */
94*38fd1498SzrjDEF_ATTR_IDENT (ATTR_ALLOC_SIZE, "alloc_size")
95*38fd1498SzrjDEF_ATTR_IDENT (ATTR_COLD, "cold")
96*38fd1498SzrjDEF_ATTR_IDENT (ATTR_CONST, "const")
97*38fd1498SzrjDEF_ATTR_IDENT (ATTR_FORMAT, "format")
98*38fd1498SzrjDEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")
99*38fd1498SzrjDEF_ATTR_IDENT (ATTR_MALLOC, "malloc")
100*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NONNULL, "nonnull")
101*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NORETURN, "noreturn")
102*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow")
103*38fd1498SzrjDEF_ATTR_IDENT (ATTR_LEAF, "leaf")
104*38fd1498SzrjDEF_ATTR_IDENT (ATTR_FNSPEC, "fn spec")
105*38fd1498SzrjDEF_ATTR_IDENT (ATTR_PRINTF, "printf")
106*38fd1498SzrjDEF_ATTR_IDENT (ATTR_ASM_FPRINTF, "asm_fprintf")
107*38fd1498SzrjDEF_ATTR_IDENT (ATTR_GCC_DIAG, "gcc_diag")
108*38fd1498SzrjDEF_ATTR_IDENT (ATTR_GCC_CDIAG, "gcc_cdiag")
109*38fd1498SzrjDEF_ATTR_IDENT (ATTR_GCC_CXXDIAG, "gcc_cxxdiag")
110*38fd1498SzrjDEF_ATTR_IDENT (ATTR_PURE, "pure")
111*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NOVOPS, "no vops")
112*38fd1498SzrjDEF_ATTR_IDENT (ATTR_SCANF, "scanf")
113*38fd1498SzrjDEF_ATTR_IDENT (ATTR_SENTINEL, "sentinel")
114*38fd1498SzrjDEF_ATTR_IDENT (ATTR_STRFMON, "strfmon")
115*38fd1498SzrjDEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
116*38fd1498SzrjDEF_ATTR_IDENT (ATTR_TYPEGENERIC, "type generic")
117*38fd1498SzrjDEF_ATTR_IDENT (ATTR_TM_REGPARM, "*tm regparm")
118*38fd1498SzrjDEF_ATTR_IDENT (ATTR_TM_TMPURE, "transaction_pure")
119*38fd1498SzrjDEF_ATTR_IDENT (ATTR_RETURNS_TWICE, "returns_twice")
120*38fd1498SzrjDEF_ATTR_IDENT (ATTR_RETURNS_NONNULL, "returns_nonnull")
121*38fd1498Szrj
122*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST, ATTR_NOVOPS, ATTR_NULL, ATTR_NULL)
123*38fd1498Szrj
124*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOVOPS_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOVOPS_LIST)
125*38fd1498Szrj
126*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NULL)
127*38fd1498Szrj
128*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL)
129*38fd1498Szrj
130*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOTHROW_LIST)
131*38fd1498Szrj
132*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST,	\
133*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LIST)
134*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LEAF_LIST, ATTR_CONST,	\
135*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
136*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE,		\
137*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LIST)
138*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LEAF_LIST, ATTR_PURE,	\
139*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
140*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN,	\
141*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LIST)
142*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LEAF_LIST, ATTR_NORETURN,\
143*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
144*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LEAF_COLD_LIST, ATTR_COLD,\
145*38fd1498Szrj			ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
146*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_RT_NOTHROW_LEAF_LIST, ATTR_RETURNS_TWICE,\
147*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
148*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_COLD_NOTHROW_LEAF_LIST, ATTR_COLD,\
149*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
150*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST, ATTR_COLD,\
151*38fd1498Szrj			ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
152*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST, ATTR_CONST,\
153*38fd1498Szrj			ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
154*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NORETURN_NOTHROW_LEAF_COLD_LIST, ATTR_COLD,\
155*38fd1498Szrj			ATTR_NULL, ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST)
156*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC,	\
157*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LIST)
158*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LEAF_LIST, ATTR_MALLOC,	\
159*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
160*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL,	\
161*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LIST)
162*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LEAF_LIST, ATTR_SENTINEL,	\
163*38fd1498Szrj			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
164*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST, ATTR_CONST,\
165*38fd1498Szrj			ATTR_NULL, ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST)
166*38fd1498Szrj
167*38fd1498Szrj/* Allocation functions like malloc and realloc whose first argument
168*38fd1498Szrj   with _SIZE_1, or second argument with _SIZE_2, specifies the size
169*38fd1498Szrj   of the allocated object.  */
170*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_SIZE_1_NOTHROW_LIST, ATTR_ALLOC_SIZE,	\
171*38fd1498Szrj			ATTR_LIST_1, ATTR_MALLOC_NOTHROW_LIST)
172*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_ALLOC_SIZE_2_NOTHROW_LIST, ATTR_ALLOC_SIZE,	\
173*38fd1498Szrj			ATTR_LIST_2, ATTR_MALLOC_NOTHROW_LIST)
174*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_SIZE_1_NOTHROW_LEAF_LIST, ATTR_ALLOC_SIZE, \
175*38fd1498Szrj		        ATTR_LIST_1, ATTR_MALLOC_NOTHROW_LEAF_LIST)
176*38fd1498Szrj/* Alloca is just like malloc except that it never returns null.  */
177*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_ALLOCA_SIZE_1_NOTHROW_LEAF_LIST, ATTR_RETURNS_NONNULL,
178*38fd1498Szrj		    ATTR_NULL, ATTR_MALLOC_SIZE_1_NOTHROW_LEAF_LIST)
179*38fd1498Szrj
180*38fd1498Szrj/* Allocation functions like calloc the product of whose first two arguments
181*38fd1498Szrj   specifies the size of the allocated object.  */
182*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_SIZE_1_2_NOTHROW_LEAF_LIST, ATTR_ALLOC_SIZE, \
183*38fd1498Szrj		        ATTR_LIST_1_2, ATTR_MALLOC_NOTHROW_LEAF_LIST)
184*38fd1498Szrj
185*38fd1498Szrj/* Allocation functions like realloc whose second argument specifies
186*38fd1498Szrj   the size of the allocated object.  */
187*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_ALLOC_SIZE_2_NOTHROW_LEAF_LIST, ATTR_ALLOC_SIZE, \
188*38fd1498Szrj		        ATTR_LIST_2, ATTR_NOTHROW_LEAF_LIST)
189*38fd1498Szrj
190*38fd1498Szrj/* Functions whose pointer parameter(s) are all nonnull.  */
191*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST, ATTR_NONNULL, ATTR_NULL, ATTR_NULL)
192*38fd1498Szrj/* Functions whose first parameter is a nonnull pointer.  */
193*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL)
194*38fd1498Szrj/* Functions whose second parameter is a nonnull pointer.  */
195*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL)
196*38fd1498Szrj/* Functions whose third parameter is a nonnull pointer.  */
197*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, ATTR_NULL)
198*38fd1498Szrj/* Nothrow functions with the sentinel(1) attribute. */
199*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \
200*38fd1498Szrj			ATTR_NOTHROW_LIST)
201*38fd1498Szrj/* Nothrow functions whose pointer parameter(s) are all nonnull.  */
202*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL, ATTR_NONNULL, ATTR_NULL, \
203*38fd1498Szrj			ATTR_NOTHROW_LIST)
204*38fd1498Szrj/* Nothrow leaf functions whose pointer parameter(s) are all nonnull.  */
205*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_LEAF, ATTR_NONNULL, ATTR_NULL, \
206*38fd1498Szrj			ATTR_NOTHROW_LEAF_LIST)
207*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOTHROW_NONNULL_LEAF)
208*38fd1498Szrj/* Nothrow functions whose first parameter is a nonnull pointer.  */
209*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \
210*38fd1498Szrj			ATTR_NOTHROW_LIST)
211*38fd1498Szrj/* Nothrow functions whose second parameter is a nonnull pointer.  */
212*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, \
213*38fd1498Szrj			ATTR_NOTHROW_LIST)
214*38fd1498Szrj/* Nothrow functions whose third parameter is a nonnull pointer.  */
215*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, \
216*38fd1498Szrj			ATTR_NOTHROW_LIST)
217*38fd1498Szrj/* Nothrow functions whose fourth parameter is a nonnull pointer.  */
218*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4, ATTR_NONNULL, ATTR_LIST_4, \
219*38fd1498Szrj			ATTR_NOTHROW_LIST)
220*38fd1498Szrj/* Nothrow functions whose fifth parameter is a nonnull pointer.  */
221*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5, ATTR_NONNULL, ATTR_LIST_5, \
222*38fd1498Szrj			ATTR_NOTHROW_LIST)
223*38fd1498Szrj
224*38fd1498Szrj/* Same as ATTR_NONNULL_1.  */
225*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL)
226*38fd1498Szrj/* Functions like {v,}fprintf whose first and second parameters are
227*38fd1498Szrj   nonnull pointers.  As cancellation points the functions are not
228*38fd1498Szrj   nothrow.  */
229*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_2, ATTR_NONNULL, ATTR_LIST_1_2, ATTR_NULL)
230*38fd1498Szrj/* The following don't have {v,}fprintf forms.  They exist only to
231*38fd1498Szrj   make it possible to declare {v,}{f,s}printf attributes using
232*38fd1498Szrj   the same macro.  */
233*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_3, ATTR_NONNULL, ATTR_LIST_1_3, ATTR_NULL)
234*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_4, ATTR_NONNULL, ATTR_LIST_1_4, ATTR_NULL)
235*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_5, ATTR_NONNULL, ATTR_LIST_1_5, ATTR_NULL)
236*38fd1498Szrj
237*38fd1498Szrj/* Same as ATTR_NOTHROW_NONNULL_1.  */
238*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_1, ATTR_NONNULL, ATTR_LIST_1,
239*38fd1498Szrj		    ATTR_NOTHROW_LIST)
240*38fd1498Szrj/* Nothrow functions like {v,}sprintf whose first and second parameters
241*38fd1498Szrj   are nonnull pointers.  */
242*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_2, ATTR_NONNULL, ATTR_LIST_1_2, \
243*38fd1498Szrj		    ATTR_NOTHROW_LIST)
244*38fd1498Szrj/* Nothrow functions like {v,}snprintf whose first and third parameters
245*38fd1498Szrj   are nonnull pointers.  */
246*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_3, ATTR_NONNULL, ATTR_LIST_1_3, \
247*38fd1498Szrj		    ATTR_NOTHROW_LIST)
248*38fd1498Szrj/* Nothrow functions like {v,}sprintf_chk whose first and fourth parameters
249*38fd1498Szrj   are nonnull pointers.  */
250*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_4, ATTR_NONNULL, ATTR_LIST_1_4, \
251*38fd1498Szrj		    ATTR_NOTHROW_LIST)
252*38fd1498Szrj/* Nothrow functions like {v,}snprintf_chk whose first and fifth parameters
253*38fd1498Szrj   are nonnull pointers.  */
254*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_5, ATTR_NONNULL, ATTR_LIST_1_5, \
255*38fd1498Szrj		    ATTR_NOTHROW_LIST)
256*38fd1498Szrj
257*38fd1498Szrj/* Nothrow leaf functions which are type-generic.  */
258*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_TYPEGENERIC_LEAF, ATTR_TYPEGENERIC, ATTR_NULL, \
259*38fd1498Szrj			ATTR_NOTHROW_LEAF_LIST)
260*38fd1498Szrj/* Nothrow nonnull leaf functions that are type-generic.  */
261*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_TYPEGENERIC_LEAF,
262*38fd1498Szrj		    ATTR_TYPEGENERIC, ATTR_NULL,
263*38fd1498Szrj		    ATTR_NOTHROW_NONNULL_LEAF)
264*38fd1498Szrj/* Nothrow const functions whose pointer parameter(s) are all nonnull.  */
265*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL, ATTR_CONST, ATTR_NULL, \
266*38fd1498Szrj			ATTR_NOTHROW_NONNULL)
267*38fd1498Szrj/* Nothrow leaf functions whose pointer parameter(s) are all nonnull,
268*38fd1498Szrj   and which return their first argument.  */
269*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_RET1_NOTHROW_NONNULL_LEAF, ATTR_FNSPEC, ATTR_LIST_STR1, \
270*38fd1498Szrj			ATTR_NOTHROW_NONNULL_LEAF)
271*38fd1498Szrj/* Nothrow leaf functions whose pointer parameter(s) are all nonnull,
272*38fd1498Szrj   and return value is also nonnull.  */
273*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_RETNONNULL_NOTHROW_LEAF, ATTR_RETURNS_NONNULL, ATTR_NULL, \
274*38fd1498Szrj			ATTR_NOTHROW_NONNULL_LEAF)
275*38fd1498Szrj/* Nothrow const leaf functions whose pointer parameter(s) are all nonnull.  */
276*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL_LEAF, ATTR_CONST, ATTR_NULL, \
277*38fd1498Szrj			ATTR_NOTHROW_NONNULL_LEAF)
278*38fd1498Szrj/* Nothrow const functions which are type-generic.  */
279*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC, ATTR_TYPEGENERIC, ATTR_NULL, \
280*38fd1498Szrj			ATTR_CONST_NOTHROW_LIST)
281*38fd1498Szrj/* Nothrow const leaf functions which are type-generic.  */
282*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF, ATTR_TYPEGENERIC, ATTR_NULL, \
283*38fd1498Szrj			ATTR_CONST_NOTHROW_LEAF_LIST)
284*38fd1498Szrj/* Nothrow pure functions whose pointer parameter(s) are all nonnull.  */
285*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL, ATTR_PURE, ATTR_NULL, \
286*38fd1498Szrj			ATTR_NOTHROW_NONNULL)
287*38fd1498Szrj/* Nothrow pure leaf functions whose pointer parameter(s) are all nonnull.  */
288*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_LEAF, ATTR_PURE, ATTR_NULL, \
289*38fd1498Szrj			ATTR_NOTHROW_NONNULL_LEAF)
290*38fd1498Szrj/* Nothrow malloc functions whose pointer parameter(s) are all nonnull.  */
291*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL, ATTR_MALLOC, ATTR_NULL, \
292*38fd1498Szrj			ATTR_NOTHROW_NONNULL)
293*38fd1498Szrj/* Nothrow malloc leaf functions whose pointer parameter(s) are all nonnull.  */
294*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL_LEAF, ATTR_MALLOC, ATTR_NULL, \
295*38fd1498Szrj			ATTR_NOTHROW_NONNULL_LEAF)
296*38fd1498Szrj
297*38fd1498Szrj/* Construct a tree for the format attribute (and implicitly nonnull).  */
298*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE(TYPE, FA, VALUES)				 \
299*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL,		 \
300*38fd1498Szrj		      ATTR_##TYPE, ATTR_LIST_##VALUES)			 \
301*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT,	 \
302*38fd1498Szrj		      ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA)
303*38fd1498Szrj
304*38fd1498Szrj/* Construct a tree for the format and nothrow attributes (format
305*38fd1498Szrj   implies nonnull).  */
306*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE_NOTHROW(TYPE, FA, VALUES)			 \
307*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL,		 \
308*38fd1498Szrj		      ATTR_##TYPE, ATTR_LIST_##VALUES)			 \
309*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\
310*38fd1498Szrj		      ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA)
311*38fd1498Szrj
312*38fd1498Szrj/* Construct one tree for the format attribute and another for the format
313*38fd1498Szrj   and nothrow attributes (in both cases format implies nonnull).  */
314*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE_BOTH(TYPE, FA, VALUES)			 \
315*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL,		 \
316*38fd1498Szrj		      ATTR_##TYPE, ATTR_LIST_##VALUES)			 \
317*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT,	 \
318*38fd1498Szrj		      ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA)	 \
319*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\
320*38fd1498Szrj		      ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA)
321*38fd1498Szrj
322*38fd1498Szrj/* Construct a pair of trees for the nonnull attribute for the first
323*38fd1498Szrj   argument, plus format printf attribute (format implies nonnull):
324*38fd1498Szrj   the first ordinary and the second nothrow.  */
325*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE_NONNULL(TYPE, FA, VALUES)			 \
326*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_NONNULL_1_FORMAT_##TYPE##_##VALUES,   	 \
327*38fd1498Szrj  		      ATTR_FORMAT, ATTR_##TYPE##_##VALUES, 	 	 \
328*38fd1498Szrj		      ATTR_NONNULL_1_##FA)				 \
329*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_FORMAT_##TYPE##_##VALUES,   \
330*38fd1498Szrj  		      ATTR_FORMAT, ATTR_##TYPE##_##VALUES, 	 	 \
331*38fd1498Szrj		      ATTR_NOTHROW_NONNULL_1_##FA)
332*38fd1498Szrj
333*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_0)
334*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_2)
335*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_0)
336*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_3)
337*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_0)
338*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_4)
339*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_0)
340*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_5)
341*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_0)
342*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_6)
343*38fd1498Szrj
344*38fd1498Szrj/* Attributes for fprintf(f, f, va).  */
345*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,1,1_2)
346*38fd1498Szrj/* Attributes for v{f,s}printf(d, f, va).  vsprintf is nothrow, vfprintf
347*38fd1498Szrj   is not.  */
348*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,2,2_0)
349*38fd1498Szrj/* Attributes for {f,s}printf(d, f, ...).  sprintf is nothrow, fprintf
350*38fd1498Szrj   is not.  */
351*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,2,2_3)
352*38fd1498Szrj/* Attributes for vprintf_chk.  */
353*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,3,3_0)
354*38fd1498Szrj/* Attributes for printf_chk.  */
355*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,3,3_4)
356*38fd1498Szrj/* Attributes for v{f,s}printf_chk(d, t, bos, f, va).  vsprintf_chk is
357*38fd1498Szrj   nothrow, vfprintf_chk is not.  */
358*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,4,4_0)
359*38fd1498Szrj/* Attributes for {f,s}printf_chk(d, t, bos, f, ...).  sprintf_chk is
360*38fd1498Szrj   nothrow, fprintf_chk is not.  */
361*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,4,4_5)
362*38fd1498Szrj
363*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(SCANF,1,1_0)
364*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(SCANF,1,1_2)
365*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_0)
366*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_3)
367*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(STRFTIME,3,3_0)
368*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(STRFMON,3,3_4)
369*38fd1498Szrj#undef DEF_FORMAT_ATTRIBUTE
370*38fd1498Szrj#undef DEF_FORMAT_ATTRIBUTE_NOTHROW
371*38fd1498Szrj#undef DEF_FORMAT_ATTRIBUTE_BOTH
372*38fd1498Szrj
373*38fd1498Szrj/* Transactional memory variants of the above.  */
374*38fd1498Szrj
375*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_LIST,
376*38fd1498Szrj		    ATTR_TM_REGPARM, ATTR_NULL, ATTR_NOTHROW_LIST)
377*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_TMPURE_NOTHROW_LIST,
378*38fd1498Szrj		    ATTR_TM_TMPURE, ATTR_NULL, ATTR_TM_NOTHROW_LIST)
379*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_PURE_TMPURE_NOTHROW_LIST,
380*38fd1498Szrj		    ATTR_PURE, ATTR_NULL, ATTR_TM_TMPURE_NOTHROW_LIST)
381*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_NORETURN_NOTHROW_LIST,
382*38fd1498Szrj		    ATTR_TM_REGPARM, ATTR_NULL, ATTR_NORETURN_NOTHROW_LIST)
383*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_CONST_NOTHROW_LIST,
384*38fd1498Szrj		    ATTR_TM_REGPARM, ATTR_NULL, ATTR_CONST_NOTHROW_LIST)
385*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_RT_LIST,
386*38fd1498Szrj		    ATTR_RETURNS_TWICE, ATTR_NULL, ATTR_TM_NOTHROW_LIST)
387*38fd1498Szrj
388*38fd1498Szrj/* Same attributes used for BUILT_IN_MALLOC except with TM_PURE thrown in.  */
389*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_MALLOC_NOTHROW_LIST,
390*38fd1498Szrj		   ATTR_TM_TMPURE, ATTR_NULL, ATTR_MALLOC_NOTHROW_LIST)
391*38fd1498Szrj/* Same attributes used for BUILT_IN_FREE except with TM_PURE thrown in.  */
392*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LIST,
393*38fd1498Szrj		   ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LIST)
394*38fd1498Szrj
395*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LEAF_LIST,
396*38fd1498Szrj		    ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
397*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST,
398*38fd1498Szrj		    ATTR_TM_TMPURE, ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
399*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NORETURN_NOTHROW_LEAF_COLD_LIST,
400*38fd1498Szrj		    ATTR_COLD, ATTR_NULL,
401*38fd1498Szrj		    ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
402*38fd1498Szrj
403*38fd1498Szrj/* Construct a tree for a format_arg attribute.  */
404*38fd1498Szrj#define DEF_FORMAT_ARG_ATTRIBUTE(FA)					\
405*38fd1498Szrj  DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA, ATTR_FORMAT_ARG,		\
406*38fd1498Szrj		      ATTR_LIST_##FA, ATTR_NOTHROW_NONNULL_##FA)
407*38fd1498SzrjDEF_FORMAT_ARG_ATTRIBUTE(1)
408*38fd1498SzrjDEF_FORMAT_ARG_ATTRIBUTE(2)
409*38fd1498Szrj#undef DEF_FORMAT_ARG_ATTRIBUTE
410*38fd1498Szrj
411