builtin-attrs.def 12.4 KB
Newer Older
Jakub Jelinek committed
1
/* Copyright (C) 2001-2015 Free Software Foundation, Inc.
2 3 4 5 6 7
   Contributed by Joseph Myers <jsm28@cam.ac.uk>.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
8
Software Foundation; either version 3, or (at your option) any later
9 10 11 12 13 14 15 16
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
17 18
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

/* This header provides a declarative way of describing the attributes
   that are applied to some functions by default.

   Before including this header, you must define the following macros.
   In each case where there is an ENUM, it is an identifier used to
   reference the tree in subsequent definitions.

   DEF_ATTR_NULL_TREE (ENUM)

     Constructs a NULL_TREE.

   DEF_ATTR_INT (ENUM, VALUE)

     Constructs an INTEGER_CST with value VALUE (an integer representable
     in HOST_WIDE_INT).

   DEF_ATTR_IDENT (ENUM, STRING)

     Constructs an IDENTIFIER_NODE for STRING.

   DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN)

     Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given
43
     as previous ENUM names).  */
44 45 46 47 48

DEF_ATTR_NULL_TREE (ATTR_NULL)

/* Construct a tree for a given integer and a list containing it.  */
#define DEF_ATTR_FOR_INT(VALUE)					\
49 50 51
  DEF_ATTR_INT (ATTR_##VALUE, VALUE)			\
  DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE, ATTR_NULL,	\
		      ATTR_##VALUE, ATTR_NULL)
52 53 54 55 56
DEF_ATTR_FOR_INT (0)
DEF_ATTR_FOR_INT (1)
DEF_ATTR_FOR_INT (2)
DEF_ATTR_FOR_INT (3)
DEF_ATTR_FOR_INT (4)
57 58
DEF_ATTR_FOR_INT (5)
DEF_ATTR_FOR_INT (6)
59 60
#undef DEF_ATTR_FOR_INT

61 62 63 64 65 66 67 68
/* Construct a tree for a given string and a list containing it.  */
#define DEF_ATTR_FOR_STRING(ENUM, VALUE)					\
  DEF_ATTR_STRING (ATTR_##ENUM, VALUE)			\
  DEF_ATTR_TREE_LIST (ATTR_LIST_##ENUM, ATTR_NULL,	\
		      ATTR_##ENUM, ATTR_NULL)
DEF_ATTR_FOR_STRING (STR1, "1")
#undef DEF_ATTR_FOR_STRING

69 70
/* Construct a tree for a list of two integers.  */
#define DEF_LIST_INT_INT(VALUE1, VALUE2)				 \
71 72
  DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2, ATTR_NULL,		 \
		      ATTR_##VALUE1, ATTR_LIST_##VALUE2)
73 74 75 76 77 78
DEF_LIST_INT_INT (1,0)
DEF_LIST_INT_INT (1,2)
DEF_LIST_INT_INT (2,0)
DEF_LIST_INT_INT (2,3)
DEF_LIST_INT_INT (3,0)
DEF_LIST_INT_INT (3,4)
79 80 81 82
DEF_LIST_INT_INT (4,0)
DEF_LIST_INT_INT (4,5)
DEF_LIST_INT_INT (5,0)
DEF_LIST_INT_INT (5,6)
83 84
#undef DEF_LIST_INT_INT

Mike Stump committed
85
/* Construct trees for identifiers.  */
Marek Polacek committed
86
DEF_ATTR_IDENT (ATTR_COLD, "cold")
87 88 89 90 91 92 93
DEF_ATTR_IDENT (ATTR_CONST, "const")
DEF_ATTR_IDENT (ATTR_FORMAT, "format")
DEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")
DEF_ATTR_IDENT (ATTR_MALLOC, "malloc")
DEF_ATTR_IDENT (ATTR_NONNULL, "nonnull")
DEF_ATTR_IDENT (ATTR_NORETURN, "noreturn")
DEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow")
94
DEF_ATTR_IDENT (ATTR_LEAF, "leaf")
95
DEF_ATTR_IDENT (ATTR_FNSPEC, "fn spec")
96
DEF_ATTR_IDENT (ATTR_PRINTF, "printf")
97
DEF_ATTR_IDENT (ATTR_ASM_FPRINTF, "asm_fprintf")
98 99 100
DEF_ATTR_IDENT (ATTR_GCC_DIAG, "gcc_diag")
DEF_ATTR_IDENT (ATTR_GCC_CDIAG, "gcc_cdiag")
DEF_ATTR_IDENT (ATTR_GCC_CXXDIAG, "gcc_cxxdiag")
101
DEF_ATTR_IDENT (ATTR_PURE, "pure")
102
DEF_ATTR_IDENT (ATTR_NOVOPS, "no vops")
103
DEF_ATTR_IDENT (ATTR_SCANF, "scanf")
104
DEF_ATTR_IDENT (ATTR_SENTINEL, "sentinel")
105
DEF_ATTR_IDENT (ATTR_STRFMON, "strfmon")
106
DEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
107
DEF_ATTR_IDENT (ATTR_TYPEGENERIC, "type generic")
108 109
DEF_ATTR_IDENT (ATTR_TM_REGPARM, "*tm regparm")
DEF_ATTR_IDENT (ATTR_TM_TMPURE, "transaction_pure")
110
DEF_ATTR_IDENT (ATTR_RETURNS_TWICE, "returns_twice")
111

112 113
DEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST, ATTR_NOVOPS, ATTR_NULL, ATTR_NULL)

114 115 116 117
DEF_ATTR_TREE_LIST (ATTR_NOVOPS_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOVOPS_LIST)

DEF_ATTR_TREE_LIST (ATTR_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NULL)

118
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL)
119

120 121
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOTHROW_LIST)

122 123
DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST,	\
			ATTR_NULL, ATTR_NOTHROW_LIST)
124 125
DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LEAF_LIST, ATTR_CONST,	\
			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
126 127
DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE,		\
			ATTR_NULL, ATTR_NOTHROW_LIST)
128 129
DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LEAF_LIST, ATTR_PURE,	\
			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
130 131
DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN,	\
			ATTR_NULL, ATTR_NOTHROW_LIST)
132 133
DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LEAF_LIST, ATTR_NORETURN,\
			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
Marek Polacek committed
134 135 136 137
DEF_ATTR_TREE_LIST (ATTR_COLD_NOTHROW_LEAF_LIST, ATTR_COLD,\
			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
DEF_ATTR_TREE_LIST (ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST, ATTR_COLD,\
			ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
138 139
DEF_ATTR_TREE_LIST (ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST, ATTR_CONST,\
			ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)
140 141
DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC,	\
			ATTR_NULL, ATTR_NOTHROW_LIST)
142 143
DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LEAF_LIST, ATTR_MALLOC,	\
			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
144 145
DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL,	\
			ATTR_NULL, ATTR_NOTHROW_LIST)
146 147
DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LEAF_LIST, ATTR_SENTINEL,	\
			ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
148 149
DEF_ATTR_TREE_LIST (ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST, ATTR_CONST,\
			ATTR_NULL, ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST)
150

151 152 153
/* Functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST, ATTR_NONNULL, ATTR_NULL, ATTR_NULL)
/* Functions whose first parameter is a nonnull pointer.  */
154
DEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL)
155
/* Functions whose second parameter is a nonnull pointer.  */
156
DEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL)
157 158
/* Functions whose third parameter is a nonnull pointer.  */
DEF_ATTR_TREE_LIST (ATTR_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, ATTR_NULL)
159
/* Nothrow functions with the sentinel(1) attribute. */
160 161
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \
			ATTR_NOTHROW_LIST)
162 163 164
/* Nothrow functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL, ATTR_NONNULL, ATTR_NULL, \
			ATTR_NOTHROW_LIST)
165 166 167
/* Nothrow leaf functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_LEAF, ATTR_NONNULL, ATTR_NULL, \
			ATTR_NOTHROW_LEAF_LIST)
168
/* Nothrow functions whose first parameter is a nonnull pointer.  */
169
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \
170
			ATTR_NOTHROW_LIST)
171
/* Nothrow functions whose second parameter is a nonnull pointer.  */
172
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, \
173
			ATTR_NOTHROW_LIST)
174
/* Nothrow functions whose third parameter is a nonnull pointer.  */
175
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, \
176
			ATTR_NOTHROW_LIST)
177 178 179 180 181 182
/* Nothrow functions whose fourth parameter is a nonnull pointer.  */
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4, ATTR_NONNULL, ATTR_LIST_4, \
			ATTR_NOTHROW_LIST)
/* Nothrow functions whose fifth parameter is a nonnull pointer.  */
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5, ATTR_NONNULL, ATTR_LIST_5, \
			ATTR_NOTHROW_LIST)
183 184 185
/* Nothrow leaf functions which are type-generic.  */
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_TYPEGENERIC_LEAF, ATTR_TYPEGENERIC, ATTR_NULL, \
			ATTR_NOTHROW_LEAF_LIST)
186 187 188
/* Nothrow const functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL, ATTR_CONST, ATTR_NULL, \
			ATTR_NOTHROW_NONNULL)
189 190 191 192
/* Nothrow leaf functions whose pointer parameter(s) are all nonnull,
   and which return their first argument.  */
DEF_ATTR_TREE_LIST (ATTR_RET1_NOTHROW_NONNULL_LEAF, ATTR_FNSPEC, ATTR_LIST_STR1, \
			ATTR_NOTHROW_NONNULL_LEAF)
193 194 195
/* Nothrow const leaf functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL_LEAF, ATTR_CONST, ATTR_NULL, \
			ATTR_NOTHROW_NONNULL_LEAF)
196 197 198
/* Nothrow const functions which are type-generic.  */
DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC, ATTR_TYPEGENERIC, ATTR_NULL, \
			ATTR_CONST_NOTHROW_LIST)
199 200 201
/* Nothrow const leaf functions which are type-generic.  */
DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF, ATTR_TYPEGENERIC, ATTR_NULL, \
			ATTR_CONST_NOTHROW_LEAF_LIST)
202 203 204
/* Nothrow pure functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL, ATTR_PURE, ATTR_NULL, \
			ATTR_NOTHROW_NONNULL)
205 206 207
/* Nothrow pure leaf functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_LEAF, ATTR_PURE, ATTR_NULL, \
			ATTR_NOTHROW_NONNULL_LEAF)
208 209 210
/* Nothrow malloc functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL, ATTR_MALLOC, ATTR_NULL, \
			ATTR_NOTHROW_NONNULL)
211 212 213
/* Nothrow malloc leaf functions whose pointer parameter(s) are all nonnull.  */
DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL_LEAF, ATTR_MALLOC, ATTR_NULL, \
			ATTR_NOTHROW_NONNULL_LEAF)
214

215
/* Construct a tree for a format attribute.  */
216
#define DEF_FORMAT_ATTRIBUTE(TYPE, FA, VALUES)				 \
217 218 219
  DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL,		 \
		      ATTR_##TYPE, ATTR_LIST_##VALUES)			 \
  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT,	 \
220 221 222 223 224 225 226 227 228 229 230 231
		      ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA)
#define DEF_FORMAT_ATTRIBUTE_NOTHROW(TYPE, FA, VALUES)			 \
  DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL,		 \
		      ATTR_##TYPE, ATTR_LIST_##VALUES)			 \
  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\
		      ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA)
#define DEF_FORMAT_ATTRIBUTE_BOTH(TYPE, FA, VALUES)			 \
  DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL,		 \
		      ATTR_##TYPE, ATTR_LIST_##VALUES)			 \
  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT,	 \
		      ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA)	 \
  DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\
232
		      ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA)
233 234
DEF_FORMAT_ATTRIBUTE(PRINTF,1,1_0)
DEF_FORMAT_ATTRIBUTE(PRINTF,1,1_2)
235 236 237 238 239 240 241 242
DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_0)
DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_3)
DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_0)
DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_4)
DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_0)
DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_5)
DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_0)
DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_6)
243 244
DEF_FORMAT_ATTRIBUTE(SCANF,1,1_0)
DEF_FORMAT_ATTRIBUTE(SCANF,1,1_2)
245 246 247 248
DEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_0)
DEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_3)
DEF_FORMAT_ATTRIBUTE_NOTHROW(STRFTIME,3,3_0)
DEF_FORMAT_ATTRIBUTE_NOTHROW(STRFMON,3,3_4)
249
#undef DEF_FORMAT_ATTRIBUTE
250 251
#undef DEF_FORMAT_ATTRIBUTE_NOTHROW
#undef DEF_FORMAT_ATTRIBUTE_BOTH
252

253 254 255 256 257 258 259 260 261 262 263 264
/* Transactional memory variants of the above.  */

DEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_LIST,
		    ATTR_TM_REGPARM, ATTR_NULL, ATTR_NOTHROW_LIST)
DEF_ATTR_TREE_LIST (ATTR_TM_TMPURE_NOTHROW_LIST,
		    ATTR_TM_TMPURE, ATTR_NULL, ATTR_TM_NOTHROW_LIST)
DEF_ATTR_TREE_LIST (ATTR_TM_PURE_TMPURE_NOTHROW_LIST,
		    ATTR_PURE, ATTR_NULL, ATTR_TM_TMPURE_NOTHROW_LIST)
DEF_ATTR_TREE_LIST (ATTR_TM_NORETURN_NOTHROW_LIST,
		    ATTR_TM_REGPARM, ATTR_NULL, ATTR_NORETURN_NOTHROW_LIST)
DEF_ATTR_TREE_LIST (ATTR_TM_CONST_NOTHROW_LIST,
		    ATTR_TM_REGPARM, ATTR_NULL, ATTR_CONST_NOTHROW_LIST)
265 266
DEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_RT_LIST,
		    ATTR_RETURNS_TWICE, ATTR_NULL, ATTR_TM_NOTHROW_LIST)
267 268 269 270 271 272 273 274

/* Same attributes used for BUILT_IN_MALLOC except with TM_PURE thrown in.  */
DEF_ATTR_TREE_LIST (ATTR_TMPURE_MALLOC_NOTHROW_LIST,
		   ATTR_TM_TMPURE, ATTR_NULL, ATTR_MALLOC_NOTHROW_LIST)
/* Same attributes used for BUILT_IN_FREE except with TM_PURE thrown in.  */
DEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LIST,
		   ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LIST)

275 276 277 278 279
DEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LEAF_LIST,
		    ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LEAF_LIST)
DEF_ATTR_TREE_LIST (ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST,
		    ATTR_TM_TMPURE, ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST)

280 281
/* Construct a tree for a format_arg attribute.  */
#define DEF_FORMAT_ARG_ATTRIBUTE(FA)					\
282 283
  DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA, ATTR_FORMAT_ARG,		\
		      ATTR_LIST_##FA, ATTR_NOTHROW_NONNULL_##FA)
284 285 286
DEF_FORMAT_ARG_ATTRIBUTE(1)
DEF_FORMAT_ARG_ATTRIBUTE(2)
#undef DEF_FORMAT_ARG_ATTRIBUTE
287