PR 33593
[official-gcc.git] / gcc / attribs.c
blob31b92cad508bff2c875fa3b9e7e6c2a7aec5d49f
1 /* Functions dealing with attribute handling, used by most front ends.
2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
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
10 version.
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
15 for more details.
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 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "flags.h"
27 #include "toplev.h"
28 #include "output.h"
29 #include "rtl.h"
30 #include "ggc.h"
31 #include "tm_p.h"
32 #include "cpplib.h"
33 #include "target.h"
34 #include "langhooks.h"
35 #include "hashtab.h"
37 static void init_attributes (void);
39 /* Table of the tables of attributes (common, language, format, machine)
40 searched. */
41 static const struct attribute_spec *attribute_tables[4];
43 /* Hashtable mapping names (represented as substrings) to attribute specs. */
44 static htab_t attribute_hash;
46 /* Substring representation. */
48 struct substring
50 const char *str;
51 int length;
54 static bool attributes_initialized = false;
56 /* Default empty table of attributes. */
58 static const struct attribute_spec empty_attribute_table[] =
60 { NULL, 0, 0, false, false, false, NULL }
63 /* Return base name of the attribute. Ie '__attr__' is turned into 'attr'.
64 To avoid need for copying, we simply return length of the string. */
66 static void
67 extract_attribute_substring (struct substring *str)
69 if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
70 && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
72 str->length -= 4;
73 str->str += 2;
77 /* Simple hash function to avoid need to scan whole string. */
79 static inline hashval_t
80 substring_hash (const char *str, int l)
82 return str[0] + str[l - 1] * 256 + l * 65536;
85 /* Used for attribute_hash. */
87 static hashval_t
88 hash_attr (const void *p)
90 const struct attribute_spec *const spec = (const struct attribute_spec *) p;
91 const int l = strlen (spec->name);
93 return substring_hash (spec->name, l);
96 /* Used for attribute_hash. */
98 static int
99 eq_attr (const void *p, const void *q)
101 const struct attribute_spec *const spec = (const struct attribute_spec *) p;
102 const struct substring *const str = (const struct substring *) q;
104 return (!strncmp (spec->name, str->str, str->length) && !spec->name[str->length]);
107 /* Initialize attribute tables, and make some sanity checks
108 if --enable-checking. */
110 static void
111 init_attributes (void)
113 size_t i;
114 int k;
116 attribute_tables[0] = lang_hooks.common_attribute_table;
117 attribute_tables[1] = lang_hooks.attribute_table;
118 attribute_tables[2] = lang_hooks.format_attribute_table;
119 attribute_tables[3] = targetm.attribute_table;
121 /* Translate NULL pointers to pointers to the empty table. */
122 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
123 if (attribute_tables[i] == NULL)
124 attribute_tables[i] = empty_attribute_table;
126 #ifdef ENABLE_CHECKING
127 /* Make some sanity checks on the attribute tables. */
128 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
130 int j;
132 for (j = 0; attribute_tables[i][j].name != NULL; j++)
134 /* The name must not begin and end with __. */
135 const char *name = attribute_tables[i][j].name;
136 int len = strlen (name);
138 gcc_assert (!(name[0] == '_' && name[1] == '_'
139 && name[len - 1] == '_' && name[len - 2] == '_'));
141 /* The minimum and maximum lengths must be consistent. */
142 gcc_assert (attribute_tables[i][j].min_length >= 0);
144 gcc_assert (attribute_tables[i][j].max_length == -1
145 || (attribute_tables[i][j].max_length
146 >= attribute_tables[i][j].min_length));
148 /* An attribute cannot require both a DECL and a TYPE. */
149 gcc_assert (!attribute_tables[i][j].decl_required
150 || !attribute_tables[i][j].type_required);
152 /* If an attribute requires a function type, in particular
153 it requires a type. */
154 gcc_assert (!attribute_tables[i][j].function_type_required
155 || attribute_tables[i][j].type_required);
159 /* Check that each name occurs just once in each table. */
160 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
162 int j, k;
163 for (j = 0; attribute_tables[i][j].name != NULL; j++)
164 for (k = j + 1; attribute_tables[i][k].name != NULL; k++)
165 gcc_assert (strcmp (attribute_tables[i][j].name,
166 attribute_tables[i][k].name));
168 /* Check that no name occurs in more than one table. */
169 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
171 size_t j, k, l;
173 for (j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
174 for (k = 0; attribute_tables[i][k].name != NULL; k++)
175 for (l = 0; attribute_tables[j][l].name != NULL; l++)
176 gcc_assert (strcmp (attribute_tables[i][k].name,
177 attribute_tables[j][l].name));
179 #endif
181 attribute_hash = htab_create (200, hash_attr, eq_attr, NULL);
182 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
183 for (k = 0; attribute_tables[i][k].name != NULL; k++)
185 struct substring str;
186 const void **slot;
188 str.str = attribute_tables[i][k].name;
189 str.length = strlen (attribute_tables[i][k].name);
190 slot = (const void **)htab_find_slot_with_hash (attribute_hash, &str,
191 substring_hash (str.str, str.length),
192 INSERT);
193 gcc_assert (!*slot);
194 *slot = &attribute_tables[i][k];
196 attributes_initialized = true;
199 /* Return the spec for the attribute named NAME. */
201 const struct attribute_spec *
202 lookup_attribute_spec (tree name)
204 struct substring attr;
206 attr.str = IDENTIFIER_POINTER (name);
207 attr.length = IDENTIFIER_LENGTH (name);
208 extract_attribute_substring (&attr);
209 return htab_find_with_hash (attribute_hash, &attr,
210 substring_hash (attr.str, attr.length));
213 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
214 which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
215 it should be modified in place; if a TYPE, a copy should be created
216 unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS. FLAGS gives further
217 information, in the form of a bitwise OR of flags in enum attribute_flags
218 from tree.h. Depending on these flags, some attributes may be
219 returned to be applied at a later stage (for example, to apply
220 a decl attribute to the declaration rather than to its type). */
222 tree
223 decl_attributes (tree *node, tree attributes, int flags)
225 tree a;
226 tree returned_attrs = NULL_TREE;
228 if (!attributes_initialized)
229 init_attributes ();
231 targetm.insert_attributes (*node, &attributes);
233 for (a = attributes; a; a = TREE_CHAIN (a))
235 tree name = TREE_PURPOSE (a);
236 tree args = TREE_VALUE (a);
237 tree *anode = node;
238 const struct attribute_spec *spec = lookup_attribute_spec (name);
239 bool no_add_attrs = 0;
240 tree fn_ptr_tmp = NULL_TREE;
242 if (spec == NULL)
244 warning (OPT_Wattributes, "%qs attribute directive ignored",
245 IDENTIFIER_POINTER (name));
246 continue;
248 else if (list_length (args) < spec->min_length
249 || (spec->max_length >= 0
250 && list_length (args) > spec->max_length))
252 error ("wrong number of arguments specified for %qs attribute",
253 IDENTIFIER_POINTER (name));
254 continue;
256 gcc_assert (is_attribute_p (spec->name, name));
258 if (spec->decl_required && !DECL_P (*anode))
260 if (flags & ((int) ATTR_FLAG_DECL_NEXT
261 | (int) ATTR_FLAG_FUNCTION_NEXT
262 | (int) ATTR_FLAG_ARRAY_NEXT))
264 /* Pass on this attribute to be tried again. */
265 returned_attrs = tree_cons (name, args, returned_attrs);
266 continue;
268 else
270 warning (OPT_Wattributes, "%qs attribute does not apply to types",
271 IDENTIFIER_POINTER (name));
272 continue;
276 /* If we require a type, but were passed a decl, set up to make a
277 new type and update the one in the decl. ATTR_FLAG_TYPE_IN_PLACE
278 would have applied if we'd been passed a type, but we cannot modify
279 the decl's type in place here. */
280 if (spec->type_required && DECL_P (*anode))
282 anode = &TREE_TYPE (*anode);
283 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
286 if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
287 && TREE_CODE (*anode) != METHOD_TYPE)
289 if (TREE_CODE (*anode) == POINTER_TYPE
290 && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
291 || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
293 /* OK, this is a bit convoluted. We can't just make a copy
294 of the pointer type and modify its TREE_TYPE, because if
295 we change the attributes of the target type the pointer
296 type needs to have a different TYPE_MAIN_VARIANT. So we
297 pull out the target type now, frob it as appropriate, and
298 rebuild the pointer type later.
300 This would all be simpler if attributes were part of the
301 declarator, grumble grumble. */
302 fn_ptr_tmp = TREE_TYPE (*anode);
303 anode = &fn_ptr_tmp;
304 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
306 else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
308 /* Pass on this attribute to be tried again. */
309 returned_attrs = tree_cons (name, args, returned_attrs);
310 continue;
313 if (TREE_CODE (*anode) != FUNCTION_TYPE
314 && TREE_CODE (*anode) != METHOD_TYPE)
316 warning (OPT_Wattributes,
317 "%qs attribute only applies to function types",
318 IDENTIFIER_POINTER (name));
319 continue;
323 if (TYPE_P (*anode)
324 && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
325 && TYPE_SIZE (*anode) != NULL_TREE)
327 warning (OPT_Wattributes, "type attributes ignored after type is already defined");
328 continue;
331 if (spec->handler != NULL)
332 returned_attrs = chainon ((*spec->handler) (anode, name, args,
333 flags, &no_add_attrs),
334 returned_attrs);
336 /* Layout the decl in case anything changed. */
337 if (spec->type_required && DECL_P (*node)
338 && (TREE_CODE (*node) == VAR_DECL
339 || TREE_CODE (*node) == PARM_DECL
340 || TREE_CODE (*node) == RESULT_DECL))
341 relayout_decl (*node);
343 if (!no_add_attrs)
345 tree old_attrs;
346 tree a;
348 if (DECL_P (*anode))
349 old_attrs = DECL_ATTRIBUTES (*anode);
350 else
351 old_attrs = TYPE_ATTRIBUTES (*anode);
353 for (a = lookup_attribute (spec->name, old_attrs);
354 a != NULL_TREE;
355 a = lookup_attribute (spec->name, TREE_CHAIN (a)))
357 if (simple_cst_equal (TREE_VALUE (a), args) == 1)
358 break;
361 if (a == NULL_TREE)
363 /* This attribute isn't already in the list. */
364 if (DECL_P (*anode))
365 DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
366 else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
368 TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
369 /* If this is the main variant, also push the attributes
370 out to the other variants. */
371 if (*anode == TYPE_MAIN_VARIANT (*anode))
373 tree variant;
374 for (variant = *anode; variant;
375 variant = TYPE_NEXT_VARIANT (variant))
377 if (TYPE_ATTRIBUTES (variant) == old_attrs)
378 TYPE_ATTRIBUTES (variant)
379 = TYPE_ATTRIBUTES (*anode);
380 else if (!lookup_attribute
381 (spec->name, TYPE_ATTRIBUTES (variant)))
382 TYPE_ATTRIBUTES (variant) = tree_cons
383 (name, args, TYPE_ATTRIBUTES (variant));
387 else
388 *anode = build_type_attribute_variant (*anode,
389 tree_cons (name, args,
390 old_attrs));
394 if (fn_ptr_tmp)
396 /* Rebuild the function pointer type and put it in the
397 appropriate place. */
398 fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
399 if (DECL_P (*node))
400 TREE_TYPE (*node) = fn_ptr_tmp;
401 else
403 gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
404 *node = fn_ptr_tmp;
409 return returned_attrs;