]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/builtin-attrs.def
Merge ubsan into trunk.
[thirdparty/gcc.git] / gcc / builtin-attrs.def
CommitLineData
711789cc 1/* Copyright (C) 2001-2013 Free Software Foundation, Inc.
7d3b509a 2 Contributed by Joseph Myers <jsm28@cam.ac.uk>.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8c4c00c1 8Software Foundation; either version 3, or (at your option) any later
7d3b509a 9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
8c4c00c1 17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
7d3b509a 19
20/* This header provides a declarative way of describing the attributes
21 that are applied to some functions by default.
22
23 Before including this header, you must define the following macros.
24 In each case where there is an ENUM, it is an identifier used to
25 reference the tree in subsequent definitions.
26
27 DEF_ATTR_NULL_TREE (ENUM)
28
29 Constructs a NULL_TREE.
30
31 DEF_ATTR_INT (ENUM, VALUE)
32
33 Constructs an INTEGER_CST with value VALUE (an integer representable
34 in HOST_WIDE_INT).
35
36 DEF_ATTR_IDENT (ENUM, STRING)
37
38 Constructs an IDENTIFIER_NODE for STRING.
39
40 DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN)
41
42 Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given
b9b15671 43 as previous ENUM names). */
7d3b509a 44
45DEF_ATTR_NULL_TREE (ATTR_NULL)
46
7d3b509a 47/* Construct a tree for a given integer and a list containing it. */
48#define DEF_ATTR_FOR_INT(VALUE) \
18e43155 49 DEF_ATTR_INT (ATTR_##VALUE, VALUE) \
50 DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE, ATTR_NULL, \
51 ATTR_##VALUE, ATTR_NULL)
7d3b509a 52DEF_ATTR_FOR_INT (0)
53DEF_ATTR_FOR_INT (1)
54DEF_ATTR_FOR_INT (2)
55DEF_ATTR_FOR_INT (3)
56DEF_ATTR_FOR_INT (4)
0a39fd54 57DEF_ATTR_FOR_INT (5)
58DEF_ATTR_FOR_INT (6)
7d3b509a 59#undef DEF_ATTR_FOR_INT
60
c8010b80 61/* Construct a tree for a given string and a list containing it. */
62#define DEF_ATTR_FOR_STRING(ENUM, VALUE) \
63 DEF_ATTR_STRING (ATTR_##ENUM, VALUE) \
64 DEF_ATTR_TREE_LIST (ATTR_LIST_##ENUM, ATTR_NULL, \
65 ATTR_##ENUM, ATTR_NULL)
66DEF_ATTR_FOR_STRING (STR1, "1")
67#undef DEF_ATTR_FOR_STRING
68
7d3b509a 69/* Construct a tree for a list of two integers. */
70#define DEF_LIST_INT_INT(VALUE1, VALUE2) \
18e43155 71 DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2, ATTR_NULL, \
72 ATTR_##VALUE1, ATTR_LIST_##VALUE2)
7d3b509a 73DEF_LIST_INT_INT (1,0)
74DEF_LIST_INT_INT (1,2)
75DEF_LIST_INT_INT (2,0)
76DEF_LIST_INT_INT (2,3)
77DEF_LIST_INT_INT (3,0)
78DEF_LIST_INT_INT (3,4)
0a39fd54 79DEF_LIST_INT_INT (4,0)
80DEF_LIST_INT_INT (4,5)
81DEF_LIST_INT_INT (5,0)
82DEF_LIST_INT_INT (5,6)
7d3b509a 83#undef DEF_LIST_INT_INT
84
8ea0b203 85/* Construct trees for identifiers. */
9e46467d 86DEF_ATTR_IDENT (ATTR_COLD, "cold")
8fe4a266 87DEF_ATTR_IDENT (ATTR_CONST, "const")
88DEF_ATTR_IDENT (ATTR_FORMAT, "format")
89DEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")
90DEF_ATTR_IDENT (ATTR_MALLOC, "malloc")
91DEF_ATTR_IDENT (ATTR_NONNULL, "nonnull")
92DEF_ATTR_IDENT (ATTR_NORETURN, "noreturn")
93DEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow")
4a68fd3c 94DEF_ATTR_IDENT (ATTR_LEAF, "leaf")
c8010b80 95DEF_ATTR_IDENT (ATTR_FNSPEC, "fn spec")
7d3b509a 96DEF_ATTR_IDENT (ATTR_PRINTF, "printf")
c54d077b 97DEF_ATTR_IDENT (ATTR_ASM_FPRINTF, "asm_fprintf")
3e038b9d 98DEF_ATTR_IDENT (ATTR_GCC_DIAG, "gcc_diag")
99DEF_ATTR_IDENT (ATTR_GCC_CDIAG, "gcc_cdiag")
100DEF_ATTR_IDENT (ATTR_GCC_CXXDIAG, "gcc_cxxdiag")
8fe4a266 101DEF_ATTR_IDENT (ATTR_PURE, "pure")
fc09b200 102DEF_ATTR_IDENT (ATTR_NOVOPS, "no vops")
7d3b509a 103DEF_ATTR_IDENT (ATTR_SCANF, "scanf")
bf6c8de0 104DEF_ATTR_IDENT (ATTR_SENTINEL, "sentinel")
7d3b509a 105DEF_ATTR_IDENT (ATTR_STRFMON, "strfmon")
8fe4a266 106DEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
b5c26b42 107DEF_ATTR_IDENT (ATTR_TYPEGENERIC, "type generic")
4c0315d0 108DEF_ATTR_IDENT (ATTR_TM_REGPARM, "*tm regparm")
109DEF_ATTR_IDENT (ATTR_TM_TMPURE, "transaction_pure")
aa848e47 110DEF_ATTR_IDENT (ATTR_RETURNS_TWICE, "returns_twice")
7d3b509a 111
fc09b200 112DEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST, ATTR_NOVOPS, ATTR_NULL, ATTR_NULL)
113
4a68fd3c 114DEF_ATTR_TREE_LIST (ATTR_NOVOPS_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOVOPS_LIST)
115
116DEF_ATTR_TREE_LIST (ATTR_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NULL)
117
8fe4a266 118DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL)
7d3b509a 119
4a68fd3c 120DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOTHROW_LIST)
121
8fe4a266 122DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST, \
123 ATTR_NULL, ATTR_NOTHROW_LIST)
4a68fd3c 124DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LEAF_LIST, ATTR_CONST, \
125 ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
8fe4a266 126DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE, \
127 ATTR_NULL, ATTR_NOTHROW_LIST)
4a68fd3c 128DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LEAF_LIST, ATTR_PURE, \
129 ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
8fe4a266 130DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN, \
131 ATTR_NULL, ATTR_NOTHROW_LIST)
4a68fd3c 132DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LEAF_LIST, ATTR_NORETURN,\
133 ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
9e46467d 134DEF_ATTR_TREE_LIST (ATTR_COLD_NOTHROW_LEAF_LIST, ATTR_COLD,\
135 ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
136DEF_ATTR_TREE_LIST (ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST, ATTR_COLD,\
137 ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
bc3fb84f 138DEF_ATTR_TREE_LIST (ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST, ATTR_CONST,\
139 ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
8fe4a266 140DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC, \
141 ATTR_NULL, ATTR_NOTHROW_LIST)
4a68fd3c 142DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LEAF_LIST, ATTR_MALLOC, \
143 ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
bf6c8de0 144DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL, \
145 ATTR_NULL, ATTR_NOTHROW_LIST)
4a68fd3c 146DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LEAF_LIST, ATTR_SENTINEL, \
147 ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
314bd4cf 148
d89269e2 149/* Functions whose pointer parameter(s) are all nonnull. */
150DEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST, ATTR_NONNULL, ATTR_NULL, ATTR_NULL)
151/* Functions whose first parameter is a nonnull pointer. */
ffe86740 152DEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL)
d89269e2 153/* Functions whose second parameter is a nonnull pointer. */
ffe86740 154DEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL)
8b913960 155/* Functions whose third parameter is a nonnull pointer. */
156DEF_ATTR_TREE_LIST (ATTR_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, ATTR_NULL)
d89269e2 157/* Nothrow functions with the sentinel(1) attribute. */
50ca527f 158DEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \
159 ATTR_NOTHROW_LIST)
d89269e2 160/* Nothrow functions whose pointer parameter(s) are all nonnull. */
161DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL, ATTR_NONNULL, ATTR_NULL, \
162 ATTR_NOTHROW_LIST)
4a68fd3c 163/* Nothrow leaf functions whose pointer parameter(s) are all nonnull. */
164DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_LEAF, ATTR_NONNULL, ATTR_NULL, \
165 ATTR_NOTHROW_LEAF_LIST)
d89269e2 166/* Nothrow functions whose first parameter is a nonnull pointer. */
af16b3b2 167DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \
03901330 168 ATTR_NOTHROW_LIST)
d89269e2 169/* Nothrow functions whose second parameter is a nonnull pointer. */
af16b3b2 170DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, \
03901330 171 ATTR_NOTHROW_LIST)
d89269e2 172/* Nothrow functions whose third parameter is a nonnull pointer. */
af16b3b2 173DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, \
03901330 174 ATTR_NOTHROW_LIST)
0a39fd54 175/* Nothrow functions whose fourth parameter is a nonnull pointer. */
176DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4, ATTR_NONNULL, ATTR_LIST_4, \
177 ATTR_NOTHROW_LIST)
178/* Nothrow functions whose fifth parameter is a nonnull pointer. */
179DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5, ATTR_NONNULL, ATTR_LIST_5, \
180 ATTR_NOTHROW_LIST)
d89269e2 181/* Nothrow const functions whose pointer parameter(s) are all nonnull. */
182DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL, ATTR_CONST, ATTR_NULL, \
183 ATTR_NOTHROW_NONNULL)
c8010b80 184/* Nothrow leaf functions whose pointer parameter(s) are all nonnull,
185 and which return their first argument. */
186DEF_ATTR_TREE_LIST (ATTR_RET1_NOTHROW_NONNULL_LEAF, ATTR_FNSPEC, ATTR_LIST_STR1, \
187 ATTR_NOTHROW_NONNULL_LEAF)
4a68fd3c 188/* Nothrow const leaf functions whose pointer parameter(s) are all nonnull. */
189DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL_LEAF, ATTR_CONST, ATTR_NULL, \
190 ATTR_NOTHROW_NONNULL_LEAF)
b5c26b42 191/* Nothrow const functions which are type-generic. */
192DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC, ATTR_TYPEGENERIC, ATTR_NULL, \
193 ATTR_CONST_NOTHROW_LIST)
4a68fd3c 194/* Nothrow const leaf functions which are type-generic. */
195DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF, ATTR_TYPEGENERIC, ATTR_NULL, \
196 ATTR_CONST_NOTHROW_LEAF_LIST)
d89269e2 197/* Nothrow pure functions whose pointer parameter(s) are all nonnull. */
198DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL, ATTR_PURE, ATTR_NULL, \
199 ATTR_NOTHROW_NONNULL)
4a68fd3c 200/* Nothrow pure leaf functions whose pointer parameter(s) are all nonnull. */
201DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_LEAF, ATTR_PURE, ATTR_NULL, \
202 ATTR_NOTHROW_NONNULL_LEAF)
d89269e2 203/* Nothrow malloc functions whose pointer parameter(s) are all nonnull. */
204DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL, ATTR_MALLOC, ATTR_NULL, \
205 ATTR_NOTHROW_NONNULL)
4a68fd3c 206/* Nothrow malloc leaf functions whose pointer parameter(s) are all nonnull. */
207DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL_LEAF, ATTR_MALLOC, ATTR_NULL, \
208 ATTR_NOTHROW_NONNULL_LEAF)
314bd4cf 209
7d3b509a 210/* Construct a tree for a format attribute. */
314bd4cf 211#define DEF_FORMAT_ATTRIBUTE(TYPE, FA, VALUES) \
18e43155 212 DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \
213 ATTR_##TYPE, ATTR_LIST_##VALUES) \
214 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT, \
8b913960 215 ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA)
216#define DEF_FORMAT_ATTRIBUTE_NOTHROW(TYPE, FA, VALUES) \
217 DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \
218 ATTR_##TYPE, ATTR_LIST_##VALUES) \
219 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\
220 ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA)
221#define DEF_FORMAT_ATTRIBUTE_BOTH(TYPE, FA, VALUES) \
222 DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \
223 ATTR_##TYPE, ATTR_LIST_##VALUES) \
224 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT, \
225 ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA) \
226 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\
18e43155 227 ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA)
314bd4cf 228DEF_FORMAT_ATTRIBUTE(PRINTF,1,1_0)
229DEF_FORMAT_ATTRIBUTE(PRINTF,1,1_2)
8b913960 230DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_0)
231DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_3)
232DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_0)
233DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_4)
234DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_0)
235DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_5)
236DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_0)
237DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_6)
314bd4cf 238DEF_FORMAT_ATTRIBUTE(SCANF,1,1_0)
239DEF_FORMAT_ATTRIBUTE(SCANF,1,1_2)
8b913960 240DEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_0)
241DEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_3)
242DEF_FORMAT_ATTRIBUTE_NOTHROW(STRFTIME,3,3_0)
243DEF_FORMAT_ATTRIBUTE_NOTHROW(STRFMON,3,3_4)
7d3b509a 244#undef DEF_FORMAT_ATTRIBUTE
8b913960 245#undef DEF_FORMAT_ATTRIBUTE_NOTHROW
246#undef DEF_FORMAT_ATTRIBUTE_BOTH
7d3b509a 247
4c0315d0 248/* Transactional memory variants of the above. */
249
250DEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_LIST,
251 ATTR_TM_REGPARM, ATTR_NULL, ATTR_NOTHROW_LIST)
252DEF_ATTR_TREE_LIST (ATTR_TM_TMPURE_NOTHROW_LIST,
253 ATTR_TM_TMPURE, ATTR_NULL, ATTR_TM_NOTHROW_LIST)
254DEF_ATTR_TREE_LIST (ATTR_TM_PURE_TMPURE_NOTHROW_LIST,
255 ATTR_PURE, ATTR_NULL, ATTR_TM_TMPURE_NOTHROW_LIST)
256DEF_ATTR_TREE_LIST (ATTR_TM_NORETURN_NOTHROW_LIST,
257 ATTR_TM_REGPARM, ATTR_NULL, ATTR_NORETURN_NOTHROW_LIST)
258DEF_ATTR_TREE_LIST (ATTR_TM_CONST_NOTHROW_LIST,
259 ATTR_TM_REGPARM, ATTR_NULL, ATTR_CONST_NOTHROW_LIST)
aa848e47 260DEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_RT_LIST,
261 ATTR_RETURNS_TWICE, ATTR_NULL, ATTR_TM_NOTHROW_LIST)
4c0315d0 262
263/* Same attributes used for BUILT_IN_MALLOC except with TM_PURE thrown in. */
264DEF_ATTR_TREE_LIST (ATTR_TMPURE_MALLOC_NOTHROW_LIST,
265 ATTR_TM_TMPURE, ATTR_NULL, ATTR_MALLOC_NOTHROW_LIST)
266/* Same attributes used for BUILT_IN_FREE except with TM_PURE thrown in. */
267DEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LIST,
268 ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LIST)
269
c2901651 270DEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LEAF_LIST,
271 ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
272DEF_ATTR_TREE_LIST (ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST,
273 ATTR_TM_TMPURE, ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
274
314bd4cf 275/* Construct a tree for a format_arg attribute. */
276#define DEF_FORMAT_ARG_ATTRIBUTE(FA) \
18e43155 277 DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA, ATTR_FORMAT_ARG, \
278 ATTR_LIST_##FA, ATTR_NOTHROW_NONNULL_##FA)
314bd4cf 279DEF_FORMAT_ARG_ATTRIBUTE(1)
280DEF_FORMAT_ARG_ATTRIBUTE(2)
281#undef DEF_FORMAT_ARG_ATTRIBUTE
7d3b509a 282