]>
Commit | Line | Data |
---|---|---|
9dcd6f09 | 1 | /* Copyright (C) 2001, 2002, 2004, 2005, 2007 Free Software Foundation, Inc. |
6431177a JM |
2 | Contributed by Joseph Myers <jsm28@cam.ac.uk>. |
3 | ||
4 | This file is part of GCC. | |
5 | ||
6 | GCC is free software; you can redistribute it and/or modify it under | |
7 | the terms of the GNU General Public License as published by the Free | |
9dcd6f09 | 8 | Software Foundation; either version 3, or (at your option) any later |
6431177a JM |
9 | version. |
10 | ||
11 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 | for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
9dcd6f09 NC |
17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ | |
6431177a JM |
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 | |
178b2b9f | 43 | as previous ENUM names). */ |
6431177a JM |
44 | |
45 | DEF_ATTR_NULL_TREE (ATTR_NULL) | |
46 | ||
6431177a JM |
47 | /* Construct a tree for a given integer and a list containing it. */ |
48 | #define DEF_ATTR_FOR_INT(VALUE) \ | |
9a238586 KG |
49 | DEF_ATTR_INT (ATTR_##VALUE, VALUE) \ |
50 | DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE, ATTR_NULL, \ | |
51 | ATTR_##VALUE, ATTR_NULL) | |
6431177a JM |
52 | DEF_ATTR_FOR_INT (0) |
53 | DEF_ATTR_FOR_INT (1) | |
54 | DEF_ATTR_FOR_INT (2) | |
55 | DEF_ATTR_FOR_INT (3) | |
56 | DEF_ATTR_FOR_INT (4) | |
10a0d495 JJ |
57 | DEF_ATTR_FOR_INT (5) |
58 | DEF_ATTR_FOR_INT (6) | |
6431177a JM |
59 | #undef DEF_ATTR_FOR_INT |
60 | ||
61 | /* Construct a tree for a list of two integers. */ | |
62 | #define DEF_LIST_INT_INT(VALUE1, VALUE2) \ | |
9a238586 KG |
63 | DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2, ATTR_NULL, \ |
64 | ATTR_##VALUE1, ATTR_LIST_##VALUE2) | |
6431177a JM |
65 | DEF_LIST_INT_INT (1,0) |
66 | DEF_LIST_INT_INT (1,2) | |
67 | DEF_LIST_INT_INT (2,0) | |
68 | DEF_LIST_INT_INT (2,3) | |
69 | DEF_LIST_INT_INT (3,0) | |
70 | DEF_LIST_INT_INT (3,4) | |
10a0d495 JJ |
71 | DEF_LIST_INT_INT (4,0) |
72 | DEF_LIST_INT_INT (4,5) | |
73 | DEF_LIST_INT_INT (5,0) | |
74 | DEF_LIST_INT_INT (5,6) | |
6431177a JM |
75 | #undef DEF_LIST_INT_INT |
76 | ||
c72c42e8 | 77 | /* Construct trees for identifiers. */ |
df061a43 RS |
78 | DEF_ATTR_IDENT (ATTR_CONST, "const") |
79 | DEF_ATTR_IDENT (ATTR_FORMAT, "format") | |
80 | DEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg") | |
81 | DEF_ATTR_IDENT (ATTR_MALLOC, "malloc") | |
82 | DEF_ATTR_IDENT (ATTR_NONNULL, "nonnull") | |
83 | DEF_ATTR_IDENT (ATTR_NORETURN, "noreturn") | |
84 | DEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow") | |
6431177a | 85 | DEF_ATTR_IDENT (ATTR_PRINTF, "printf") |
3ae1d4c2 | 86 | DEF_ATTR_IDENT (ATTR_ASM_FPRINTF, "asm_fprintf") |
280c1e0d KG |
87 | DEF_ATTR_IDENT (ATTR_GCC_DIAG, "gcc_diag") |
88 | DEF_ATTR_IDENT (ATTR_GCC_CDIAG, "gcc_cdiag") | |
89 | DEF_ATTR_IDENT (ATTR_GCC_CXXDIAG, "gcc_cxxdiag") | |
df061a43 | 90 | DEF_ATTR_IDENT (ATTR_PURE, "pure") |
dcd6de6d | 91 | DEF_ATTR_IDENT (ATTR_NOVOPS, "no vops") |
6431177a | 92 | DEF_ATTR_IDENT (ATTR_SCANF, "scanf") |
3d091dac | 93 | DEF_ATTR_IDENT (ATTR_SENTINEL, "sentinel") |
6431177a | 94 | DEF_ATTR_IDENT (ATTR_STRFMON, "strfmon") |
df061a43 | 95 | DEF_ATTR_IDENT (ATTR_STRFTIME, "strftime") |
b5d32c25 | 96 | DEF_ATTR_IDENT (ATTR_TYPEGENERIC, "type generic") |
6431177a | 97 | |
dcd6de6d ZD |
98 | DEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST, ATTR_NOVOPS, ATTR_NULL, ATTR_NULL) |
99 | ||
df061a43 | 100 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL) |
6431177a | 101 | |
df061a43 RS |
102 | DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST, \ |
103 | ATTR_NULL, ATTR_NOTHROW_LIST) | |
104 | DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE, \ | |
105 | ATTR_NULL, ATTR_NOTHROW_LIST) | |
dcd6de6d ZD |
106 | DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NOVOPS_LIST, ATTR_NOVOPS, \ |
107 | ATTR_NULL, ATTR_PURE_NOTHROW_LIST) | |
df061a43 RS |
108 | DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN, \ |
109 | ATTR_NULL, ATTR_NOTHROW_LIST) | |
110 | DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC, \ | |
111 | ATTR_NULL, ATTR_NOTHROW_LIST) | |
3d091dac KG |
112 | DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL, \ |
113 | ATTR_NULL, ATTR_NOTHROW_LIST) | |
79ed7328 | 114 | |
74124c73 KG |
115 | /* Functions whose pointer parameter(s) are all nonnull. */ |
116 | DEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST, ATTR_NONNULL, ATTR_NULL, ATTR_NULL) | |
117 | /* Functions whose first parameter is a nonnull pointer. */ | |
0d5b215c | 118 | DEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL) |
74124c73 | 119 | /* Functions whose second parameter is a nonnull pointer. */ |
0d5b215c | 120 | DEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL) |
74124c73 | 121 | /* Nothrow functions with the sentinel(1) attribute. */ |
254986c7 KG |
122 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \ |
123 | ATTR_NOTHROW_LIST) | |
74124c73 KG |
124 | /* Nothrow functions whose pointer parameter(s) are all nonnull. */ |
125 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL, ATTR_NONNULL, ATTR_NULL, \ | |
126 | ATTR_NOTHROW_LIST) | |
127 | /* Nothrow functions whose first parameter is a nonnull pointer. */ | |
00362064 | 128 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \ |
08291658 | 129 | ATTR_NOTHROW_LIST) |
74124c73 | 130 | /* Nothrow functions whose second parameter is a nonnull pointer. */ |
00362064 | 131 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, \ |
08291658 | 132 | ATTR_NOTHROW_LIST) |
74124c73 | 133 | /* Nothrow functions whose third parameter is a nonnull pointer. */ |
00362064 | 134 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, \ |
08291658 | 135 | ATTR_NOTHROW_LIST) |
10a0d495 JJ |
136 | /* Nothrow functions whose fourth parameter is a nonnull pointer. */ |
137 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4, ATTR_NONNULL, ATTR_LIST_4, \ | |
138 | ATTR_NOTHROW_LIST) | |
139 | /* Nothrow functions whose fifth parameter is a nonnull pointer. */ | |
140 | DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5, ATTR_NONNULL, ATTR_LIST_5, \ | |
141 | ATTR_NOTHROW_LIST) | |
74124c73 KG |
142 | /* Nothrow const functions whose pointer parameter(s) are all nonnull. */ |
143 | DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL, ATTR_CONST, ATTR_NULL, \ | |
144 | ATTR_NOTHROW_NONNULL) | |
b5d32c25 KG |
145 | /* Nothrow const functions which are type-generic. */ |
146 | DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC, ATTR_TYPEGENERIC, ATTR_NULL, \ | |
147 | ATTR_CONST_NOTHROW_LIST) | |
74124c73 KG |
148 | /* Nothrow pure functions whose pointer parameter(s) are all nonnull. */ |
149 | DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL, ATTR_PURE, ATTR_NULL, \ | |
150 | ATTR_NOTHROW_NONNULL) | |
151 | /* Nothrow malloc functions whose pointer parameter(s) are all nonnull. */ | |
152 | DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL, ATTR_MALLOC, ATTR_NULL, \ | |
153 | ATTR_NOTHROW_NONNULL) | |
79ed7328 | 154 | |
6431177a | 155 | /* Construct a tree for a format attribute. */ |
79ed7328 | 156 | #define DEF_FORMAT_ATTRIBUTE(TYPE, FA, VALUES) \ |
9a238586 KG |
157 | DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \ |
158 | ATTR_##TYPE, ATTR_LIST_##VALUES) \ | |
159 | DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT, \ | |
160 | ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA) | |
79ed7328 JT |
161 | DEF_FORMAT_ATTRIBUTE(PRINTF,1,1_0) |
162 | DEF_FORMAT_ATTRIBUTE(PRINTF,1,1_2) | |
163 | DEF_FORMAT_ATTRIBUTE(PRINTF,2,2_0) | |
164 | DEF_FORMAT_ATTRIBUTE(PRINTF,2,2_3) | |
165 | DEF_FORMAT_ATTRIBUTE(PRINTF,3,3_0) | |
166 | DEF_FORMAT_ATTRIBUTE(PRINTF,3,3_4) | |
10a0d495 JJ |
167 | DEF_FORMAT_ATTRIBUTE(PRINTF,4,4_0) |
168 | DEF_FORMAT_ATTRIBUTE(PRINTF,4,4_5) | |
169 | DEF_FORMAT_ATTRIBUTE(PRINTF,5,5_0) | |
170 | DEF_FORMAT_ATTRIBUTE(PRINTF,5,5_6) | |
79ed7328 JT |
171 | DEF_FORMAT_ATTRIBUTE(SCANF,1,1_0) |
172 | DEF_FORMAT_ATTRIBUTE(SCANF,1,1_2) | |
173 | DEF_FORMAT_ATTRIBUTE(SCANF,2,2_0) | |
174 | DEF_FORMAT_ATTRIBUTE(SCANF,2,2_3) | |
175 | DEF_FORMAT_ATTRIBUTE(STRFTIME,3,3_0) | |
176 | DEF_FORMAT_ATTRIBUTE(STRFMON,3,3_4) | |
6431177a JM |
177 | #undef DEF_FORMAT_ATTRIBUTE |
178 | ||
79ed7328 JT |
179 | /* Construct a tree for a format_arg attribute. */ |
180 | #define DEF_FORMAT_ARG_ATTRIBUTE(FA) \ | |
9a238586 KG |
181 | DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA, ATTR_FORMAT_ARG, \ |
182 | ATTR_LIST_##FA, ATTR_NOTHROW_NONNULL_##FA) | |
79ed7328 JT |
183 | DEF_FORMAT_ARG_ATTRIBUTE(1) |
184 | DEF_FORMAT_ARG_ATTRIBUTE(2) | |
185 | #undef DEF_FORMAT_ARG_ATTRIBUTE | |
6431177a | 186 |