clean up and renames beginigs of a testsuite
[official-gcc.git] / gcc / attribs.c
blobd8daa6f5ed6de2d166851cde7081e2f75564fce9
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, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "flags.h"
28 #include "diagnostic-core.h"
29 #include "ggc.h"
30 #include "tm_p.h"
31 #include "cpplib.h"
32 #include "target.h"
33 #include "langhooks.h"
34 #include "hashtab.h"
35 #include "plugin.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 register_attribute (&attribute_tables[i][k]);
187 invoke_plugin_callbacks (PLUGIN_ATTRIBUTES, NULL);
188 attributes_initialized = true;
191 /* Insert a single ATTR into the attribute table. */
193 void
194 register_attribute (const struct attribute_spec *attr)
196 struct substring str;
197 void **slot;
199 str.str = attr->name;
200 str.length = strlen (str.str);
201 slot = htab_find_slot_with_hash (attribute_hash, &str,
202 substring_hash (str.str, str.length),
203 INSERT);
204 gcc_assert (!*slot);
205 *slot = (void *) CONST_CAST (struct attribute_spec *, attr);
208 /* Return the spec for the attribute named NAME. */
210 const struct attribute_spec *
211 lookup_attribute_spec (tree name)
213 struct substring attr;
215 attr.str = IDENTIFIER_POINTER (name);
216 attr.length = IDENTIFIER_LENGTH (name);
217 extract_attribute_substring (&attr);
218 return (const struct attribute_spec *)
219 htab_find_with_hash (attribute_hash, &attr,
220 substring_hash (attr.str, attr.length));
223 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
224 which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
225 it should be modified in place; if a TYPE, a copy should be created
226 unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS. FLAGS gives further
227 information, in the form of a bitwise OR of flags in enum attribute_flags
228 from tree.h. Depending on these flags, some attributes may be
229 returned to be applied at a later stage (for example, to apply
230 a decl attribute to the declaration rather than to its type). */
232 tree
233 decl_attributes (tree *node, tree attributes, int flags)
235 tree a;
236 tree returned_attrs = NULL_TREE;
238 if (TREE_TYPE (*node) == error_mark_node)
239 return NULL_TREE;
241 if (!attributes_initialized)
242 init_attributes ();
244 /* If this is a function and the user used #pragma GCC optimize, add the
245 options to the attribute((optimize(...))) list. */
246 if (TREE_CODE (*node) == FUNCTION_DECL && current_optimize_pragma)
248 tree cur_attr = lookup_attribute ("optimize", attributes);
249 tree opts = copy_list (current_optimize_pragma);
251 if (! cur_attr)
252 attributes
253 = tree_cons (get_identifier ("optimize"), opts, attributes);
254 else
255 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
258 if (TREE_CODE (*node) == FUNCTION_DECL
259 && optimization_current_node != optimization_default_node
260 && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
261 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
263 /* If this is a function and the user used #pragma GCC target, add the
264 options to the attribute((target(...))) list. */
265 if (TREE_CODE (*node) == FUNCTION_DECL
266 && current_target_pragma
267 && targetm.target_option.valid_attribute_p (*node, NULL_TREE,
268 current_target_pragma, 0))
270 tree cur_attr = lookup_attribute ("target", attributes);
271 tree opts = copy_list (current_target_pragma);
273 if (! cur_attr)
274 attributes = tree_cons (get_identifier ("target"), opts, attributes);
275 else
276 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
279 /* A "naked" function attribute implies "noinline" and "noclone" for
280 those targets that support it. */
281 if (TREE_CODE (*node) == FUNCTION_DECL
282 && lookup_attribute_spec (get_identifier ("naked"))
283 && lookup_attribute ("naked", attributes) != NULL)
285 if (lookup_attribute ("noinline", attributes) == NULL)
286 attributes = tree_cons (get_identifier ("noinline"), NULL, attributes);
288 if (lookup_attribute ("noclone", attributes) == NULL)
289 attributes = tree_cons (get_identifier ("noclone"), NULL, attributes);
292 targetm.insert_attributes (*node, &attributes);
294 for (a = attributes; a; a = TREE_CHAIN (a))
296 tree name = TREE_PURPOSE (a);
297 tree args = TREE_VALUE (a);
298 tree *anode = node;
299 const struct attribute_spec *spec = lookup_attribute_spec (name);
300 bool no_add_attrs = 0;
301 int fn_ptr_quals = 0;
302 tree fn_ptr_tmp = NULL_TREE;
304 if (spec == NULL)
306 warning (OPT_Wattributes, "%qE attribute directive ignored",
307 name);
308 continue;
310 else if (list_length (args) < spec->min_length
311 || (spec->max_length >= 0
312 && list_length (args) > spec->max_length))
314 error ("wrong number of arguments specified for %qE attribute",
315 name);
316 continue;
318 gcc_assert (is_attribute_p (spec->name, name));
320 if (spec->decl_required && !DECL_P (*anode))
322 if (flags & ((int) ATTR_FLAG_DECL_NEXT
323 | (int) ATTR_FLAG_FUNCTION_NEXT
324 | (int) ATTR_FLAG_ARRAY_NEXT))
326 /* Pass on this attribute to be tried again. */
327 returned_attrs = tree_cons (name, args, returned_attrs);
328 continue;
330 else
332 warning (OPT_Wattributes, "%qE attribute does not apply to types",
333 name);
334 continue;
338 /* If we require a type, but were passed a decl, set up to make a
339 new type and update the one in the decl. ATTR_FLAG_TYPE_IN_PLACE
340 would have applied if we'd been passed a type, but we cannot modify
341 the decl's type in place here. */
342 if (spec->type_required && DECL_P (*anode))
344 anode = &TREE_TYPE (*anode);
345 /* Allow ATTR_FLAG_TYPE_IN_PLACE for the type's naming decl. */
346 if (!(TREE_CODE (*anode) == TYPE_DECL
347 && *anode == TYPE_NAME (TYPE_MAIN_VARIANT
348 (TREE_TYPE (*anode)))))
349 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
352 if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
353 && TREE_CODE (*anode) != METHOD_TYPE)
355 if (TREE_CODE (*anode) == POINTER_TYPE
356 && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
357 || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
359 /* OK, this is a bit convoluted. We can't just make a copy
360 of the pointer type and modify its TREE_TYPE, because if
361 we change the attributes of the target type the pointer
362 type needs to have a different TYPE_MAIN_VARIANT. So we
363 pull out the target type now, frob it as appropriate, and
364 rebuild the pointer type later.
366 This would all be simpler if attributes were part of the
367 declarator, grumble grumble. */
368 fn_ptr_tmp = TREE_TYPE (*anode);
369 fn_ptr_quals = TYPE_QUALS (*anode);
370 anode = &fn_ptr_tmp;
371 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
373 else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
375 /* Pass on this attribute to be tried again. */
376 returned_attrs = tree_cons (name, args, returned_attrs);
377 continue;
380 if (TREE_CODE (*anode) != FUNCTION_TYPE
381 && TREE_CODE (*anode) != METHOD_TYPE)
383 warning (OPT_Wattributes,
384 "%qE attribute only applies to function types",
385 name);
386 continue;
390 if (TYPE_P (*anode)
391 && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
392 && TYPE_SIZE (*anode) != NULL_TREE)
394 warning (OPT_Wattributes, "type attributes ignored after type is already defined");
395 continue;
398 if (spec->handler != NULL)
399 returned_attrs = chainon ((*spec->handler) (anode, name, args,
400 flags, &no_add_attrs),
401 returned_attrs);
403 /* Layout the decl in case anything changed. */
404 if (spec->type_required && DECL_P (*node)
405 && (TREE_CODE (*node) == VAR_DECL
406 || TREE_CODE (*node) == PARM_DECL
407 || TREE_CODE (*node) == RESULT_DECL))
408 relayout_decl (*node);
410 if (!no_add_attrs)
412 tree old_attrs;
413 tree a;
415 if (DECL_P (*anode))
416 old_attrs = DECL_ATTRIBUTES (*anode);
417 else
418 old_attrs = TYPE_ATTRIBUTES (*anode);
420 for (a = lookup_attribute (spec->name, old_attrs);
421 a != NULL_TREE;
422 a = lookup_attribute (spec->name, TREE_CHAIN (a)))
424 if (simple_cst_equal (TREE_VALUE (a), args) == 1)
425 break;
428 if (a == NULL_TREE)
430 /* This attribute isn't already in the list. */
431 if (DECL_P (*anode))
432 DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
433 else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
435 TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
436 /* If this is the main variant, also push the attributes
437 out to the other variants. */
438 if (*anode == TYPE_MAIN_VARIANT (*anode))
440 tree variant;
441 for (variant = *anode; variant;
442 variant = TYPE_NEXT_VARIANT (variant))
444 if (TYPE_ATTRIBUTES (variant) == old_attrs)
445 TYPE_ATTRIBUTES (variant)
446 = TYPE_ATTRIBUTES (*anode);
447 else if (!lookup_attribute
448 (spec->name, TYPE_ATTRIBUTES (variant)))
449 TYPE_ATTRIBUTES (variant) = tree_cons
450 (name, args, TYPE_ATTRIBUTES (variant));
454 else
455 *anode = build_type_attribute_variant (*anode,
456 tree_cons (name, args,
457 old_attrs));
461 if (fn_ptr_tmp)
463 /* Rebuild the function pointer type and put it in the
464 appropriate place. */
465 fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
466 if (fn_ptr_quals)
467 fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals);
468 if (DECL_P (*node))
469 TREE_TYPE (*node) = fn_ptr_tmp;
470 else
472 gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
473 *node = fn_ptr_tmp;
478 return returned_attrs;