1 /* Copyright (C
) 2001, 2002, 2004, 2005, 2007, 2010
2 Free Software Foundation
, Inc.
3 Contributed by Joseph Myers
<jsm28@cam.ac.uk
>.
5 This file is part of GCC.
7 GCC is free software
; you can redistribute it and
/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation
; either version
3, or (at your option
) any later
12 GCC is distributed in the hope that it will be useful
, but WITHOUT ANY
13 WARRANTY
; without even the implied warranty of MERCHANTABILITY or
14 FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC
; see the file COPYING3. If not see
19 <http
://www.gnu.org
/licenses
/>.
*/
21 /* This header provides a declarative way of describing the attributes
22 that are applied to some functions by default.
24 Before including this header
, you must define the following macros.
25 In each case where there is an ENUM
, it is an identifier used to
26 reference the tree in subsequent definitions.
28 DEF_ATTR_NULL_TREE (ENUM
)
30 Constructs a NULL_TREE.
32 DEF_ATTR_INT (ENUM
, VALUE
)
34 Constructs an INTEGER_CST with value
VALUE (an integer representable
37 DEF_ATTR_IDENT (ENUM
, STRING
)
39 Constructs an IDENTIFIER_NODE for STRING.
41 DEF_ATTR_TREE_LIST (ENUM
, PURPOSE
, VALUE
, CHAIN
)
43 Constructs a TREE_LIST with given PURPOSE
, VALUE and
CHAIN (given
44 as previous ENUM names
).
*/
46 DEF_ATTR_NULL_TREE (ATTR_NULL
)
48 /* Construct a tree for a given integer and a list containing it.
*/
49 #define
DEF_ATTR_FOR_INT(VALUE
) \
50 DEF_ATTR_INT (ATTR_##VALUE
, VALUE
) \
51 DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE
, ATTR_NULL
, \
52 ATTR_##VALUE
, ATTR_NULL
)
60 #undef DEF_ATTR_FOR_INT
62 /* Construct a tree for a list of two integers.
*/
63 #define
DEF_LIST_INT_INT(VALUE1
, VALUE2
) \
64 DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2
, ATTR_NULL
, \
65 ATTR_##VALUE1
, ATTR_LIST_##VALUE2
)
66 DEF_LIST_INT_INT (1,0)
67 DEF_LIST_INT_INT (1,2)
68 DEF_LIST_INT_INT (2,0)
69 DEF_LIST_INT_INT (2,3)
70 DEF_LIST_INT_INT (3,0)
71 DEF_LIST_INT_INT (3,4)
72 DEF_LIST_INT_INT (4,0)
73 DEF_LIST_INT_INT (4,5)
74 DEF_LIST_INT_INT (5,0)
75 DEF_LIST_INT_INT (5,6)
76 #undef DEF_LIST_INT_INT
78 /* Construct trees for identifiers.
*/
79 DEF_ATTR_IDENT (ATTR_CONST
, "const")
80 DEF_ATTR_IDENT (ATTR_FORMAT
, "format")
81 DEF_ATTR_IDENT (ATTR_FORMAT_ARG
, "format_arg")
82 DEF_ATTR_IDENT (ATTR_MALLOC
, "malloc")
83 DEF_ATTR_IDENT (ATTR_NONNULL
, "nonnull")
84 DEF_ATTR_IDENT (ATTR_NORETURN
, "noreturn")
85 DEF_ATTR_IDENT (ATTR_NOTHROW
, "nothrow")
86 DEF_ATTR_IDENT (ATTR_LEAF
, "leaf")
87 DEF_ATTR_IDENT (ATTR_PRINTF
, "printf")
88 DEF_ATTR_IDENT (ATTR_ASM_FPRINTF
, "asm_fprintf")
89 DEF_ATTR_IDENT (ATTR_GCC_DIAG
, "gcc_diag")
90 DEF_ATTR_IDENT (ATTR_GCC_CDIAG
, "gcc_cdiag")
91 DEF_ATTR_IDENT (ATTR_GCC_CXXDIAG
, "gcc_cxxdiag")
92 DEF_ATTR_IDENT (ATTR_PURE
, "pure")
93 DEF_ATTR_IDENT (ATTR_NOVOPS
, "no vops")
94 DEF_ATTR_IDENT (ATTR_SCANF
, "scanf")
95 DEF_ATTR_IDENT (ATTR_SENTINEL
, "sentinel")
96 DEF_ATTR_IDENT (ATTR_STRFMON
, "strfmon")
97 DEF_ATTR_IDENT (ATTR_STRFTIME
, "strftime")
98 DEF_ATTR_IDENT (ATTR_TYPEGENERIC
, "type generic")
99 DEF_ATTR_IDENT (ATTR_TM_REGPARM
, "*tm regparm")
100 DEF_ATTR_IDENT (ATTR_TM_TMPURE
, "transaction_pure")
101 DEF_ATTR_IDENT (ATTR_RETURNS_TWICE
, "returns_twice")
103 DEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST
, ATTR_NOVOPS
, ATTR_NULL
, ATTR_NULL
)
105 DEF_ATTR_TREE_LIST (ATTR_NOVOPS_LEAF_LIST
, ATTR_LEAF
, ATTR_NULL
, ATTR_NOVOPS_LIST
)
107 DEF_ATTR_TREE_LIST (ATTR_LEAF_LIST
, ATTR_LEAF
, ATTR_NULL
, ATTR_NULL
)
109 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST
, ATTR_NOTHROW
, ATTR_NULL
, ATTR_NULL
)
111 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LEAF_LIST
, ATTR_LEAF
, ATTR_NULL
, ATTR_NOTHROW_LIST
)
113 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST
, ATTR_CONST
, \
114 ATTR_NULL
, ATTR_NOTHROW_LIST
)
115 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LEAF_LIST
, ATTR_CONST
, \
116 ATTR_NULL
, ATTR_NOTHROW_LEAF_LIST
)
117 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST
, ATTR_PURE
, \
118 ATTR_NULL
, ATTR_NOTHROW_LIST
)
119 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LEAF_LIST
, ATTR_PURE
, \
120 ATTR_NULL
, ATTR_NOTHROW_LEAF_LIST
)
121 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NOVOPS_LIST
, ATTR_NOVOPS
, \
122 ATTR_NULL
, ATTR_PURE_NOTHROW_LIST
)
123 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NOVOPS_LEAF_LIST
, ATTR_NOVOPS
,\
124 ATTR_NULL
, ATTR_PURE_NOTHROW_LEAF_LIST
)
125 DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST
, ATTR_NORETURN
, \
126 ATTR_NULL
, ATTR_NOTHROW_LIST
)
127 DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LEAF_LIST
, ATTR_NORETURN
,\
128 ATTR_NULL
, ATTR_NOTHROW_LEAF_LIST
)
129 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST
, ATTR_MALLOC
, \
130 ATTR_NULL
, ATTR_NOTHROW_LIST
)
131 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LEAF_LIST
, ATTR_MALLOC
, \
132 ATTR_NULL
, ATTR_NOTHROW_LEAF_LIST
)
133 DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST
, ATTR_SENTINEL
, \
134 ATTR_NULL
, ATTR_NOTHROW_LIST
)
135 DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LEAF_LIST
, ATTR_SENTINEL
, \
136 ATTR_NULL
, ATTR_NOTHROW_LEAF_LIST
)
138 /* Functions whose pointer
parameter(s
) are all nonnull.
*/
139 DEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST
, ATTR_NONNULL
, ATTR_NULL
, ATTR_NULL
)
140 /* Functions whose first parameter is a nonnull pointer.
*/
141 DEF_ATTR_TREE_LIST (ATTR_NONNULL_1
, ATTR_NONNULL
, ATTR_LIST_1
, ATTR_NULL
)
142 /* Functions whose second parameter is a nonnull pointer.
*/
143 DEF_ATTR_TREE_LIST (ATTR_NONNULL_2
, ATTR_NONNULL
, ATTR_LIST_2
, ATTR_NULL
)
144 /* Functions whose third parameter is a nonnull pointer.
*/
145 DEF_ATTR_TREE_LIST (ATTR_NONNULL_3
, ATTR_NONNULL
, ATTR_LIST_3
, ATTR_NULL
)
146 /* Nothrow functions with the
sentinel(1) attribute.
*/
147 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1
, ATTR_SENTINEL
, ATTR_LIST_1
, \
149 /* Nothrow functions whose pointer
parameter(s
) are all nonnull.
*/
150 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL
, ATTR_NONNULL
, ATTR_NULL
, \
152 /* Nothrow leaf functions whose pointer
parameter(s
) are all nonnull.
*/
153 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_LEAF
, ATTR_NONNULL
, ATTR_NULL
, \
154 ATTR_NOTHROW_LEAF_LIST
)
155 /* Nothrow functions whose first parameter is a nonnull pointer.
*/
156 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1
, ATTR_NONNULL
, ATTR_LIST_1
, \
158 /* Nothrow functions whose second parameter is a nonnull pointer.
*/
159 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2
, ATTR_NONNULL
, ATTR_LIST_2
, \
161 /* Nothrow functions whose third parameter is a nonnull pointer.
*/
162 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3
, ATTR_NONNULL
, ATTR_LIST_3
, \
164 /* Nothrow functions whose fourth parameter is a nonnull pointer.
*/
165 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4
, ATTR_NONNULL
, ATTR_LIST_4
, \
167 /* Nothrow functions whose fifth parameter is a nonnull pointer.
*/
168 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5
, ATTR_NONNULL
, ATTR_LIST_5
, \
170 /* Nothrow const functions whose pointer
parameter(s
) are all nonnull.
*/
171 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL
, ATTR_CONST
, ATTR_NULL
, \
172 ATTR_NOTHROW_NONNULL
)
173 /* Nothrow const leaf functions whose pointer
parameter(s
) are all nonnull.
*/
174 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL_LEAF
, ATTR_CONST
, ATTR_NULL
, \
175 ATTR_NOTHROW_NONNULL_LEAF
)
176 /* Nothrow const functions which are type
-generic.
*/
177 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC
, ATTR_TYPEGENERIC
, ATTR_NULL
, \
178 ATTR_CONST_NOTHROW_LIST
)
179 /* Nothrow const leaf functions which are type
-generic.
*/
180 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF
, ATTR_TYPEGENERIC
, ATTR_NULL
, \
181 ATTR_CONST_NOTHROW_LEAF_LIST
)
182 /* Nothrow pure functions whose pointer
parameter(s
) are all nonnull.
*/
183 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL
, ATTR_PURE
, ATTR_NULL
, \
184 ATTR_NOTHROW_NONNULL
)
185 /* Nothrow pure leaf functions whose pointer
parameter(s
) are all nonnull.
*/
186 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_LEAF
, ATTR_PURE
, ATTR_NULL
, \
187 ATTR_NOTHROW_NONNULL_LEAF
)
188 /* Nothrow malloc functions whose pointer
parameter(s
) are all nonnull.
*/
189 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL
, ATTR_MALLOC
, ATTR_NULL
, \
190 ATTR_NOTHROW_NONNULL
)
191 /* Nothrow malloc leaf functions whose pointer
parameter(s
) are all nonnull.
*/
192 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL_LEAF
, ATTR_MALLOC
, ATTR_NULL
, \
193 ATTR_NOTHROW_NONNULL_LEAF
)
195 /* Construct a tree for a format attribute.
*/
196 #define
DEF_FORMAT_ATTRIBUTE(TYPE, FA
, VALUES
) \
197 DEF_ATTR_TREE_LIST (ATTR_##
TYPE##_##VALUES
, ATTR_NULL
, \
198 ATTR_##
TYPE, ATTR_LIST_##VALUES
) \
199 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##
TYPE##_##VALUES
, ATTR_FORMAT
, \
200 ATTR_##
TYPE##_##VALUES
, ATTR_NONNULL_##FA
)
201 #define
DEF_FORMAT_ATTRIBUTE_NOTHROW(TYPE, FA
, VALUES
) \
202 DEF_ATTR_TREE_LIST (ATTR_##
TYPE##_##VALUES
, ATTR_NULL
, \
203 ATTR_##
TYPE, ATTR_LIST_##VALUES
) \
204 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##
TYPE##_NOTHROW_##VALUES
, ATTR_FORMAT
,\
205 ATTR_##
TYPE##_##VALUES
, ATTR_NOTHROW_NONNULL_##FA
)
206 #define
DEF_FORMAT_ATTRIBUTE_BOTH(TYPE, FA
, VALUES
) \
207 DEF_ATTR_TREE_LIST (ATTR_##
TYPE##_##VALUES
, ATTR_NULL
, \
208 ATTR_##
TYPE, ATTR_LIST_##VALUES
) \
209 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##
TYPE##_##VALUES
, ATTR_FORMAT
, \
210 ATTR_##
TYPE##_##VALUES
, ATTR_NONNULL_##FA
) \
211 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##
TYPE##_NOTHROW_##VALUES
, ATTR_FORMAT
,\
212 ATTR_##
TYPE##_##VALUES
, ATTR_NOTHROW_NONNULL_##FA
)
213 DEF_FORMAT_ATTRIBUTE(PRINTF
,1,1_0
)
214 DEF_FORMAT_ATTRIBUTE(PRINTF
,1,1_2
)
215 DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF
,2,2_0
)
216 DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF
,2,2_3
)
217 DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF
,3,3_0
)
218 DEF_FORMAT_ATTRIBUTE_BOTH(PRINTF
,3,3_4
)
219 DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF
,4,4_0
)
220 DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF
,4,4_5
)
221 DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF
,5,5_0
)
222 DEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF
,5,5_6
)
223 DEF_FORMAT_ATTRIBUTE(SCANF
,1,1_0
)
224 DEF_FORMAT_ATTRIBUTE(SCANF
,1,1_2
)
225 DEF_FORMAT_ATTRIBUTE_BOTH(SCANF
,2,2_0
)
226 DEF_FORMAT_ATTRIBUTE_BOTH(SCANF
,2,2_3
)
227 DEF_FORMAT_ATTRIBUTE_NOTHROW(STRFTIME
,3,3_0
)
228 DEF_FORMAT_ATTRIBUTE_NOTHROW(STRFMON
,3,3_4
)
229 #undef DEF_FORMAT_ATTRIBUTE
230 #undef DEF_FORMAT_ATTRIBUTE_NOTHROW
231 #undef DEF_FORMAT_ATTRIBUTE_BOTH
233 /* Transactional memory variants of the above.
*/
235 DEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_LIST
,
236 ATTR_TM_REGPARM
, ATTR_NULL
, ATTR_NOTHROW_LIST
)
237 DEF_ATTR_TREE_LIST (ATTR_TM_TMPURE_NOTHROW_LIST
,
238 ATTR_TM_TMPURE
, ATTR_NULL
, ATTR_TM_NOTHROW_LIST
)
239 DEF_ATTR_TREE_LIST (ATTR_TM_PURE_TMPURE_NOTHROW_LIST
,
240 ATTR_PURE
, ATTR_NULL
, ATTR_TM_TMPURE_NOTHROW_LIST
)
241 DEF_ATTR_TREE_LIST (ATTR_TM_NORETURN_NOTHROW_LIST
,
242 ATTR_TM_REGPARM
, ATTR_NULL
, ATTR_NORETURN_NOTHROW_LIST
)
243 DEF_ATTR_TREE_LIST (ATTR_TM_CONST_NOTHROW_LIST
,
244 ATTR_TM_REGPARM
, ATTR_NULL
, ATTR_CONST_NOTHROW_LIST
)
245 DEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_RT_LIST
,
246 ATTR_RETURNS_TWICE
, ATTR_NULL
, ATTR_TM_NOTHROW_LIST
)
248 /* Same attributes used for BUILT_IN_MALLOC except with TM_PURE thrown in.
*/
249 DEF_ATTR_TREE_LIST (ATTR_TMPURE_MALLOC_NOTHROW_LIST
,
250 ATTR_TM_TMPURE
, ATTR_NULL
, ATTR_MALLOC_NOTHROW_LIST
)
251 /* Same attributes used for BUILT_IN_FREE except with TM_PURE thrown in.
*/
252 DEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LIST
,
253 ATTR_TM_TMPURE
, ATTR_NULL
, ATTR_NOTHROW_LIST
)
255 /* Construct a tree for a format_arg attribute.
*/
256 #define
DEF_FORMAT_ARG_ATTRIBUTE(FA
) \
257 DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA
, ATTR_FORMAT_ARG
, \
258 ATTR_LIST_##FA
, ATTR_NOTHROW_NONNULL_##FA
)
259 DEF_FORMAT_ARG_ATTRIBUTE(1)
260 DEF_FORMAT_ARG_ATTRIBUTE(2)
261 #undef DEF_FORMAT_ARG_ATTRIBUTE