2009-01-28 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / attribs.c
blobdbce1815e6810745d9c6ff49834636d1b0f6bc86
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"
36 #include "c-common.h"
38 static void init_attributes (void);
40 /* Table of the tables of attributes (common, language, format, machine)
41 searched. */
42 static const struct attribute_spec *attribute_tables[4];
44 /* Hashtable mapping names (represented as substrings) to attribute specs. */
45 static htab_t attribute_hash;
47 /* Substring representation. */
49 struct substring
51 const char *str;
52 int length;
55 static bool attributes_initialized = false;
57 /* Default empty table of attributes. */
59 static const struct attribute_spec empty_attribute_table[] =
61 { NULL, 0, 0, false, false, false, NULL }
64 /* Return base name of the attribute. Ie '__attr__' is turned into 'attr'.
65 To avoid need for copying, we simply return length of the string. */
67 static void
68 extract_attribute_substring (struct substring *str)
70 if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
71 && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
73 str->length -= 4;
74 str->str += 2;
78 /* Simple hash function to avoid need to scan whole string. */
80 static inline hashval_t
81 substring_hash (const char *str, int l)
83 return str[0] + str[l - 1] * 256 + l * 65536;
86 /* Used for attribute_hash. */
88 static hashval_t
89 hash_attr (const void *p)
91 const struct attribute_spec *const spec = (const struct attribute_spec *) p;
92 const int l = strlen (spec->name);
94 return substring_hash (spec->name, l);
97 /* Used for attribute_hash. */
99 static int
100 eq_attr (const void *p, const void *q)
102 const struct attribute_spec *const spec = (const struct attribute_spec *) p;
103 const struct substring *const str = (const struct substring *) q;
105 return (!strncmp (spec->name, str->str, str->length) && !spec->name[str->length]);
108 /* Initialize attribute tables, and make some sanity checks
109 if --enable-checking. */
111 static void
112 init_attributes (void)
114 size_t i;
115 int k;
117 attribute_tables[0] = lang_hooks.common_attribute_table;
118 attribute_tables[1] = lang_hooks.attribute_table;
119 attribute_tables[2] = lang_hooks.format_attribute_table;
120 attribute_tables[3] = targetm.attribute_table;
122 /* Translate NULL pointers to pointers to the empty table. */
123 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
124 if (attribute_tables[i] == NULL)
125 attribute_tables[i] = empty_attribute_table;
127 #ifdef ENABLE_CHECKING
128 /* Make some sanity checks on the attribute tables. */
129 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
131 int j;
133 for (j = 0; attribute_tables[i][j].name != NULL; j++)
135 /* The name must not begin and end with __. */
136 const char *name = attribute_tables[i][j].name;
137 int len = strlen (name);
139 gcc_assert (!(name[0] == '_' && name[1] == '_'
140 && name[len - 1] == '_' && name[len - 2] == '_'));
142 /* The minimum and maximum lengths must be consistent. */
143 gcc_assert (attribute_tables[i][j].min_length >= 0);
145 gcc_assert (attribute_tables[i][j].max_length == -1
146 || (attribute_tables[i][j].max_length
147 >= attribute_tables[i][j].min_length));
149 /* An attribute cannot require both a DECL and a TYPE. */
150 gcc_assert (!attribute_tables[i][j].decl_required
151 || !attribute_tables[i][j].type_required);
153 /* If an attribute requires a function type, in particular
154 it requires a type. */
155 gcc_assert (!attribute_tables[i][j].function_type_required
156 || attribute_tables[i][j].type_required);
160 /* Check that each name occurs just once in each table. */
161 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
163 int j, k;
164 for (j = 0; attribute_tables[i][j].name != NULL; j++)
165 for (k = j + 1; attribute_tables[i][k].name != NULL; k++)
166 gcc_assert (strcmp (attribute_tables[i][j].name,
167 attribute_tables[i][k].name));
169 /* Check that no name occurs in more than one table. */
170 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
172 size_t j, k, l;
174 for (j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
175 for (k = 0; attribute_tables[i][k].name != NULL; k++)
176 for (l = 0; attribute_tables[j][l].name != NULL; l++)
177 gcc_assert (strcmp (attribute_tables[i][k].name,
178 attribute_tables[j][l].name));
180 #endif
182 attribute_hash = htab_create (200, hash_attr, eq_attr, NULL);
183 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
184 for (k = 0; attribute_tables[i][k].name != NULL; k++)
186 struct substring str;
187 const void **slot;
189 str.str = attribute_tables[i][k].name;
190 str.length = strlen (attribute_tables[i][k].name);
191 slot = (const void **)htab_find_slot_with_hash (attribute_hash, &str,
192 substring_hash (str.str, str.length),
193 INSERT);
194 gcc_assert (!*slot);
195 *slot = &attribute_tables[i][k];
197 attributes_initialized = true;
200 /* Return the spec for the attribute named NAME. */
202 const struct attribute_spec *
203 lookup_attribute_spec (tree name)
205 struct substring attr;
207 attr.str = IDENTIFIER_POINTER (name);
208 attr.length = IDENTIFIER_LENGTH (name);
209 extract_attribute_substring (&attr);
210 return (const struct attribute_spec *)
211 htab_find_with_hash (attribute_hash, &attr,
212 substring_hash (attr.str, attr.length));
215 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
216 which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
217 it should be modified in place; if a TYPE, a copy should be created
218 unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS. FLAGS gives further
219 information, in the form of a bitwise OR of flags in enum attribute_flags
220 from tree.h. Depending on these flags, some attributes may be
221 returned to be applied at a later stage (for example, to apply
222 a decl attribute to the declaration rather than to its type). */
224 tree
225 decl_attributes (tree *node, tree attributes, int flags)
227 tree a;
228 tree returned_attrs = NULL_TREE;
230 if (TREE_TYPE (*node) == error_mark_node)
231 return NULL_TREE;
233 if (!attributes_initialized)
234 init_attributes ();
236 /* If this is a function and the user used #pragma GCC optimize, add the
237 options to the attribute((optimize(...))) list. */
238 if (TREE_CODE (*node) == FUNCTION_DECL && current_optimize_pragma)
240 tree cur_attr = lookup_attribute ("optimize", attributes);
241 tree opts = copy_list (current_optimize_pragma);
243 if (! cur_attr)
244 attributes
245 = tree_cons (get_identifier ("optimize"), opts, attributes);
246 else
247 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
250 if (TREE_CODE (*node) == FUNCTION_DECL
251 && optimization_current_node != optimization_default_node
252 && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
253 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
255 /* If this is a function and the user used #pragma GCC target, add the
256 options to the attribute((target(...))) list. */
257 if (TREE_CODE (*node) == FUNCTION_DECL
258 && current_target_pragma
259 && targetm.target_option.valid_attribute_p (*node, NULL_TREE,
260 current_target_pragma, 0))
262 tree cur_attr = lookup_attribute ("target", attributes);
263 tree opts = copy_list (current_target_pragma);
265 if (! cur_attr)
266 attributes = tree_cons (get_identifier ("target"), opts, attributes);
267 else
268 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
271 targetm.insert_attributes (*node, &attributes);
273 for (a = attributes; a; a = TREE_CHAIN (a))
275 tree name = TREE_PURPOSE (a);
276 tree args = TREE_VALUE (a);
277 tree *anode = node;
278 const struct attribute_spec *spec = lookup_attribute_spec (name);
279 bool no_add_attrs = 0;
280 tree fn_ptr_tmp = NULL_TREE;
282 if (spec == NULL)
284 warning (OPT_Wattributes, "%qs attribute directive ignored",
285 IDENTIFIER_POINTER (name));
286 continue;
288 else if (list_length (args) < spec->min_length
289 || (spec->max_length >= 0
290 && list_length (args) > spec->max_length))
292 error ("wrong number of arguments specified for %qs attribute",
293 IDENTIFIER_POINTER (name));
294 continue;
296 gcc_assert (is_attribute_p (spec->name, name));
298 if (spec->decl_required && !DECL_P (*anode))
300 if (flags & ((int) ATTR_FLAG_DECL_NEXT
301 | (int) ATTR_FLAG_FUNCTION_NEXT
302 | (int) ATTR_FLAG_ARRAY_NEXT))
304 /* Pass on this attribute to be tried again. */
305 returned_attrs = tree_cons (name, args, returned_attrs);
306 continue;
308 else
310 warning (OPT_Wattributes, "%qs attribute does not apply to types",
311 IDENTIFIER_POINTER (name));
312 continue;
316 /* If we require a type, but were passed a decl, set up to make a
317 new type and update the one in the decl. ATTR_FLAG_TYPE_IN_PLACE
318 would have applied if we'd been passed a type, but we cannot modify
319 the decl's type in place here. */
320 if (spec->type_required && DECL_P (*anode))
322 anode = &TREE_TYPE (*anode);
323 /* Allow ATTR_FLAG_TYPE_IN_PLACE for the type's naming decl. */
324 if (!(TREE_CODE (*anode) == TYPE_DECL
325 && *anode == TYPE_NAME (TYPE_MAIN_VARIANT
326 (TREE_TYPE (*anode)))))
327 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
330 if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
331 && TREE_CODE (*anode) != METHOD_TYPE)
333 if (TREE_CODE (*anode) == POINTER_TYPE
334 && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
335 || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
337 /* OK, this is a bit convoluted. We can't just make a copy
338 of the pointer type and modify its TREE_TYPE, because if
339 we change the attributes of the target type the pointer
340 type needs to have a different TYPE_MAIN_VARIANT. So we
341 pull out the target type now, frob it as appropriate, and
342 rebuild the pointer type later.
344 This would all be simpler if attributes were part of the
345 declarator, grumble grumble. */
346 fn_ptr_tmp = TREE_TYPE (*anode);
347 anode = &fn_ptr_tmp;
348 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
350 else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
352 /* Pass on this attribute to be tried again. */
353 returned_attrs = tree_cons (name, args, returned_attrs);
354 continue;
357 if (TREE_CODE (*anode) != FUNCTION_TYPE
358 && TREE_CODE (*anode) != METHOD_TYPE)
360 warning (OPT_Wattributes,
361 "%qs attribute only applies to function types",
362 IDENTIFIER_POINTER (name));
363 continue;
367 if (TYPE_P (*anode)
368 && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
369 && TYPE_SIZE (*anode) != NULL_TREE)
371 warning (OPT_Wattributes, "type attributes ignored after type is already defined");
372 continue;
375 if (spec->handler != NULL)
376 returned_attrs = chainon ((*spec->handler) (anode, name, args,
377 flags, &no_add_attrs),
378 returned_attrs);
380 /* Layout the decl in case anything changed. */
381 if (spec->type_required && DECL_P (*node)
382 && (TREE_CODE (*node) == VAR_DECL
383 || TREE_CODE (*node) == PARM_DECL
384 || TREE_CODE (*node) == RESULT_DECL))
385 relayout_decl (*node);
387 if (!no_add_attrs)
389 tree old_attrs;
390 tree a;
392 if (DECL_P (*anode))
393 old_attrs = DECL_ATTRIBUTES (*anode);
394 else
395 old_attrs = TYPE_ATTRIBUTES (*anode);
397 for (a = lookup_attribute (spec->name, old_attrs);
398 a != NULL_TREE;
399 a = lookup_attribute (spec->name, TREE_CHAIN (a)))
401 if (simple_cst_equal (TREE_VALUE (a), args) == 1)
402 break;
405 if (a == NULL_TREE)
407 /* This attribute isn't already in the list. */
408 if (DECL_P (*anode))
409 DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
410 else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
412 TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
413 /* If this is the main variant, also push the attributes
414 out to the other variants. */
415 if (*anode == TYPE_MAIN_VARIANT (*anode))
417 tree variant;
418 for (variant = *anode; variant;
419 variant = TYPE_NEXT_VARIANT (variant))
421 if (TYPE_ATTRIBUTES (variant) == old_attrs)
422 TYPE_ATTRIBUTES (variant)
423 = TYPE_ATTRIBUTES (*anode);
424 else if (!lookup_attribute
425 (spec->name, TYPE_ATTRIBUTES (variant)))
426 TYPE_ATTRIBUTES (variant) = tree_cons
427 (name, args, TYPE_ATTRIBUTES (variant));
431 else
432 *anode = build_type_attribute_variant (*anode,
433 tree_cons (name, args,
434 old_attrs));
438 if (fn_ptr_tmp)
440 /* Rebuild the function pointer type and put it in the
441 appropriate place. */
442 fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
443 if (DECL_P (*node))
444 TREE_TYPE (*node) = fn_ptr_tmp;
445 else
447 gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
448 *node = fn_ptr_tmp;
453 return returned_attrs;