OSDN Git Service

compiler: Move import of Go export data to gcc side of interface.
[pf3gnuchains/gcc-fork.git] / gcc / attribs.c
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.
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>.  */
21
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"
36
37 /* Table of the tables of attributes (common, language, format, machine)
38    searched.  */
39 static const struct attribute_spec *attribute_tables[4];
40
41 /* Hashtable mapping names (represented as substrings) to attribute specs. */
42 static htab_t attribute_hash;
43
44 /* Substring representation.  */
45
46 struct substring
47 {
48   const char *str;
49   int length;
50 };
51
52 static bool attributes_initialized = false;
53
54 /* Default empty table of attributes.  */
55
56 static const struct attribute_spec empty_attribute_table[] =
57 {
58   { NULL, 0, 0, false, false, false, NULL, false }
59 };
60
61 /* Return base name of the attribute.  Ie '__attr__' is turned into 'attr'.
62    To avoid need for copying, we simply return length of the string.  */
63
64 static void
65 extract_attribute_substring (struct substring *str)
66 {
67   if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
68       && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
69     {
70       str->length -= 4;
71       str->str += 2;
72     }
73 }
74
75 /* Simple hash function to avoid need to scan whole string.  */
76
77 static inline hashval_t
78 substring_hash (const char *str, int l)
79 {
80   return str[0] + str[l - 1] * 256 + l * 65536;
81 }
82
83 /* Used for attribute_hash.  */
84
85 static hashval_t
86 hash_attr (const void *p)
87 {
88   const struct attribute_spec *const spec = (const struct attribute_spec *) p;
89   const int l = strlen (spec->name);
90
91   return substring_hash (spec->name, l);
92 }
93
94 /* Used for attribute_hash.  */
95
96 static int
97 eq_attr (const void *p, const void *q)
98 {
99   const struct attribute_spec *const spec = (const struct attribute_spec *) p;
100   const struct substring *const str = (const struct substring *) q;
101
102   return (!strncmp (spec->name, str->str, str->length) && !spec->name[str->length]);
103 }
104
105 /* Initialize attribute tables, and make some sanity checks
106    if --enable-checking.  */
107
108 void
109 init_attributes (void)
110 {
111   size_t i;
112   int k;
113
114   if (attributes_initialized)
115     return;
116
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;
121
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;
126
127 #ifdef ENABLE_CHECKING
128   /* Make some sanity checks on the attribute tables.  */
129   for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
130     {
131       int j;
132
133       for (j = 0; attribute_tables[i][j].name != NULL; j++)
134         {
135           /* The name must not begin and end with __.  */
136           const char *name = attribute_tables[i][j].name;
137           int len = strlen (name);
138
139           gcc_assert (!(name[0] == '_' && name[1] == '_'
140                         && name[len - 1] == '_' && name[len - 2] == '_'));
141
142           /* The minimum and maximum lengths must be consistent.  */
143           gcc_assert (attribute_tables[i][j].min_length >= 0);
144
145           gcc_assert (attribute_tables[i][j].max_length == -1
146                       || (attribute_tables[i][j].max_length
147                           >= attribute_tables[i][j].min_length));
148
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);
152
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);
157         }
158     }
159
160   /* Check that each name occurs just once in each table.  */
161   for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
162     {
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));
168     }
169   /* Check that no name occurs in more than one table.  Names that
170      begin with '*' are exempt, and may be overridden.  */
171   for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
172     {
173       size_t j, k, l;
174
175       for (j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
176         for (k = 0; attribute_tables[i][k].name != NULL; k++)
177           for (l = 0; attribute_tables[j][l].name != NULL; l++)
178             gcc_assert (attribute_tables[i][k].name[0] == '*'
179                         || strcmp (attribute_tables[i][k].name,
180                                    attribute_tables[j][l].name));
181     }
182 #endif
183
184   attribute_hash = htab_create (200, hash_attr, eq_attr, NULL);
185   for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
186     for (k = 0; attribute_tables[i][k].name != NULL; k++)
187       {
188         register_attribute (&attribute_tables[i][k]);
189       }
190   invoke_plugin_callbacks (PLUGIN_ATTRIBUTES, NULL);
191   attributes_initialized = true;
192 }
193
194 /* Insert a single ATTR into the attribute table.  */
195
196 void
197 register_attribute (const struct attribute_spec *attr)
198 {
199   struct substring str;
200   void **slot;
201
202   str.str = attr->name;
203   str.length = strlen (str.str);
204
205   /* Attribute names in the table must be in the form 'text' and not
206      in the form '__text__'.  */
207   gcc_assert (str.length > 0 && str.str[0] != '_');
208
209   slot = htab_find_slot_with_hash (attribute_hash, &str,
210                                    substring_hash (str.str, str.length),
211                                    INSERT);
212   gcc_assert (!*slot || attr->name[0] == '*');
213   *slot = (void *) CONST_CAST (struct attribute_spec *, attr);
214 }
215
216 /* Return the spec for the attribute named NAME.  */
217
218 const struct attribute_spec *
219 lookup_attribute_spec (const_tree name)
220 {
221   struct substring attr;
222
223   attr.str = IDENTIFIER_POINTER (name);
224   attr.length = IDENTIFIER_LENGTH (name);
225   extract_attribute_substring (&attr);
226   return (const struct attribute_spec *)
227     htab_find_with_hash (attribute_hash, &attr,
228                          substring_hash (attr.str, attr.length));
229 }
230 \f
231 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
232    which is either a DECL (including a TYPE_DECL) or a TYPE.  If a DECL,
233    it should be modified in place; if a TYPE, a copy should be created
234    unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS.  FLAGS gives further
235    information, in the form of a bitwise OR of flags in enum attribute_flags
236    from tree.h.  Depending on these flags, some attributes may be
237    returned to be applied at a later stage (for example, to apply
238    a decl attribute to the declaration rather than to its type).  */
239
240 tree
241 decl_attributes (tree *node, tree attributes, int flags)
242 {
243   tree a;
244   tree returned_attrs = NULL_TREE;
245
246   if (TREE_TYPE (*node) == error_mark_node)
247     return NULL_TREE;
248
249   if (!attributes_initialized)
250     init_attributes ();
251
252   /* If this is a function and the user used #pragma GCC optimize, add the
253      options to the attribute((optimize(...))) list.  */
254   if (TREE_CODE (*node) == FUNCTION_DECL && current_optimize_pragma)
255     {
256       tree cur_attr = lookup_attribute ("optimize", attributes);
257       tree opts = copy_list (current_optimize_pragma);
258
259       if (! cur_attr)
260         attributes
261           = tree_cons (get_identifier ("optimize"), opts, attributes);
262       else
263         TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
264     }
265
266   if (TREE_CODE (*node) == FUNCTION_DECL
267       && optimization_current_node != optimization_default_node
268       && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
269     DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
270
271   /* If this is a function and the user used #pragma GCC target, add the
272      options to the attribute((target(...))) list.  */
273   if (TREE_CODE (*node) == FUNCTION_DECL
274       && current_target_pragma
275       && targetm.target_option.valid_attribute_p (*node, NULL_TREE,
276                                                   current_target_pragma, 0))
277     {
278       tree cur_attr = lookup_attribute ("target", attributes);
279       tree opts = copy_list (current_target_pragma);
280
281       if (! cur_attr)
282         attributes = tree_cons (get_identifier ("target"), opts, attributes);
283       else
284         TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
285     }
286
287   /* A "naked" function attribute implies "noinline" and "noclone" for
288      those targets that support it.  */
289   if (TREE_CODE (*node) == FUNCTION_DECL
290       && attributes
291       && lookup_attribute_spec (get_identifier ("naked"))
292       && lookup_attribute ("naked", attributes) != NULL)
293     {
294       if (lookup_attribute ("noinline", attributes) == NULL)
295         attributes = tree_cons (get_identifier ("noinline"), NULL, attributes);
296
297       if (lookup_attribute ("noclone", attributes) == NULL)
298         attributes = tree_cons (get_identifier ("noclone"),  NULL, attributes);
299     }
300
301   targetm.insert_attributes (*node, &attributes);
302
303   for (a = attributes; a; a = TREE_CHAIN (a))
304     {
305       tree name = TREE_PURPOSE (a);
306       tree args = TREE_VALUE (a);
307       tree *anode = node;
308       const struct attribute_spec *spec = lookup_attribute_spec (name);
309       bool no_add_attrs = 0;
310       int fn_ptr_quals = 0;
311       tree fn_ptr_tmp = NULL_TREE;
312
313       if (spec == NULL)
314         {
315           warning (OPT_Wattributes, "%qE attribute directive ignored",
316                    name);
317           continue;
318         }
319       else if (list_length (args) < spec->min_length
320                || (spec->max_length >= 0
321                    && list_length (args) > spec->max_length))
322         {
323           error ("wrong number of arguments specified for %qE attribute",
324                  name);
325           continue;
326         }
327       gcc_assert (is_attribute_p (spec->name, name));
328
329       if (spec->decl_required && !DECL_P (*anode))
330         {
331           if (flags & ((int) ATTR_FLAG_DECL_NEXT
332                        | (int) ATTR_FLAG_FUNCTION_NEXT
333                        | (int) ATTR_FLAG_ARRAY_NEXT))
334             {
335               /* Pass on this attribute to be tried again.  */
336               returned_attrs = tree_cons (name, args, returned_attrs);
337               continue;
338             }
339           else
340             {
341               warning (OPT_Wattributes, "%qE attribute does not apply to types",
342                        name);
343               continue;
344             }
345         }
346
347       /* If we require a type, but were passed a decl, set up to make a
348          new type and update the one in the decl.  ATTR_FLAG_TYPE_IN_PLACE
349          would have applied if we'd been passed a type, but we cannot modify
350          the decl's type in place here.  */
351       if (spec->type_required && DECL_P (*anode))
352         {
353           anode = &TREE_TYPE (*anode);
354           /* Allow ATTR_FLAG_TYPE_IN_PLACE for the type's naming decl.  */
355           if (!(TREE_CODE (*anode) == TYPE_DECL
356                 && *anode == TYPE_NAME (TYPE_MAIN_VARIANT
357                                         (TREE_TYPE (*anode)))))
358             flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
359         }
360
361       if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
362           && TREE_CODE (*anode) != METHOD_TYPE)
363         {
364           if (TREE_CODE (*anode) == POINTER_TYPE
365               && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
366                   || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
367             {
368               /* OK, this is a bit convoluted.  We can't just make a copy
369                  of the pointer type and modify its TREE_TYPE, because if
370                  we change the attributes of the target type the pointer
371                  type needs to have a different TYPE_MAIN_VARIANT.  So we
372                  pull out the target type now, frob it as appropriate, and
373                  rebuild the pointer type later.
374
375                  This would all be simpler if attributes were part of the
376                  declarator, grumble grumble.  */
377               fn_ptr_tmp = TREE_TYPE (*anode);
378               fn_ptr_quals = TYPE_QUALS (*anode);
379               anode = &fn_ptr_tmp;
380               flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
381             }
382           else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
383             {
384               /* Pass on this attribute to be tried again.  */
385               returned_attrs = tree_cons (name, args, returned_attrs);
386               continue;
387             }
388
389           if (TREE_CODE (*anode) != FUNCTION_TYPE
390               && TREE_CODE (*anode) != METHOD_TYPE)
391             {
392               warning (OPT_Wattributes,
393                        "%qE attribute only applies to function types",
394                        name);
395               continue;
396             }
397         }
398
399       if (TYPE_P (*anode)
400           && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
401           && TYPE_SIZE (*anode) != NULL_TREE)
402         {
403           warning (OPT_Wattributes, "type attributes ignored after type is already defined");
404           continue;
405         }
406
407       if (spec->handler != NULL)
408         returned_attrs = chainon ((*spec->handler) (anode, name, args,
409                                                     flags, &no_add_attrs),
410                                   returned_attrs);
411
412       /* Layout the decl in case anything changed.  */
413       if (spec->type_required && DECL_P (*node)
414           && (TREE_CODE (*node) == VAR_DECL
415               || TREE_CODE (*node) == PARM_DECL
416               || TREE_CODE (*node) == RESULT_DECL))
417         relayout_decl (*node);
418
419       if (!no_add_attrs)
420         {
421           tree old_attrs;
422           tree a;
423
424           if (DECL_P (*anode))
425             old_attrs = DECL_ATTRIBUTES (*anode);
426           else
427             old_attrs = TYPE_ATTRIBUTES (*anode);
428
429           for (a = lookup_attribute (spec->name, old_attrs);
430                a != NULL_TREE;
431                a = lookup_attribute (spec->name, TREE_CHAIN (a)))
432             {
433               if (simple_cst_equal (TREE_VALUE (a), args) == 1)
434                 break;
435             }
436
437           if (a == NULL_TREE)
438             {
439               /* This attribute isn't already in the list.  */
440               if (DECL_P (*anode))
441                 DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
442               else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
443                 {
444                   TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
445                   /* If this is the main variant, also push the attributes
446                      out to the other variants.  */
447                   if (*anode == TYPE_MAIN_VARIANT (*anode))
448                     {
449                       tree variant;
450                       for (variant = *anode; variant;
451                            variant = TYPE_NEXT_VARIANT (variant))
452                         {
453                           if (TYPE_ATTRIBUTES (variant) == old_attrs)
454                             TYPE_ATTRIBUTES (variant)
455                               = TYPE_ATTRIBUTES (*anode);
456                           else if (!lookup_attribute
457                                    (spec->name, TYPE_ATTRIBUTES (variant)))
458                             TYPE_ATTRIBUTES (variant) = tree_cons
459                               (name, args, TYPE_ATTRIBUTES (variant));
460                         }
461                     }
462                 }
463               else
464                 *anode = build_type_attribute_variant (*anode,
465                                                        tree_cons (name, args,
466                                                                   old_attrs));
467             }
468         }
469
470       if (fn_ptr_tmp)
471         {
472           /* Rebuild the function pointer type and put it in the
473              appropriate place.  */
474           fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
475           if (fn_ptr_quals)
476             fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals);
477           if (DECL_P (*node))
478             TREE_TYPE (*node) = fn_ptr_tmp;
479           else
480             {
481               gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
482               *node = fn_ptr_tmp;
483             }
484         }
485     }
486
487   return returned_attrs;
488 }
489
490 /* Subroutine of set_method_tm_attributes.  Apply TM attribute ATTR
491    to the method FNDECL.  */
492
493 void
494 apply_tm_attr (tree fndecl, tree attr)
495 {
496   decl_attributes (&TREE_TYPE (fndecl), tree_cons (attr, NULL, NULL), 0);
497 }