OSDN Git Service

2009-04-08 Thomas Quinot <quinot@adacore.com>
[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 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
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.
11
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.
16
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/>.  */
20
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"
37
38 static void init_attributes (void);
39
40 /* Table of the tables of attributes (common, language, format, machine)
41    searched.  */
42 static const struct attribute_spec *attribute_tables[4];
43
44 /* Hashtable mapping names (represented as substrings) to attribute specs. */
45 static htab_t attribute_hash;
46
47 /* Substring representation.  */
48
49 struct substring
50 {
51   const char *str;
52   int length;
53 };
54
55 static bool attributes_initialized = false;
56
57 /* Default empty table of attributes.  */
58
59 static const struct attribute_spec empty_attribute_table[] =
60 {
61   { NULL, 0, 0, false, false, false, NULL }
62 };
63
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.  */
66
67 static void
68 extract_attribute_substring (struct substring *str)
69 {
70   if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
71       && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
72     {
73       str->length -= 4;
74       str->str += 2;
75     }
76 }
77
78 /* Simple hash function to avoid need to scan whole string.  */
79
80 static inline hashval_t
81 substring_hash (const char *str, int l)
82 {
83   return str[0] + str[l - 1] * 256 + l * 65536;
84 }
85
86 /* Used for attribute_hash.  */
87
88 static hashval_t
89 hash_attr (const void *p)
90 {
91   const struct attribute_spec *const spec = (const struct attribute_spec *) p;
92   const int l = strlen (spec->name);
93
94   return substring_hash (spec->name, l);
95 }
96
97 /* Used for attribute_hash.  */
98
99 static int
100 eq_attr (const void *p, const void *q)
101 {
102   const struct attribute_spec *const spec = (const struct attribute_spec *) p;
103   const struct substring *const str = (const struct substring *) q;
104
105   return (!strncmp (spec->name, str->str, str->length) && !spec->name[str->length]);
106 }
107
108 /* Initialize attribute tables, and make some sanity checks
109    if --enable-checking.  */
110
111 static void
112 init_attributes (void)
113 {
114   size_t i;
115   int k;
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.  */
170   for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
171     {
172       size_t j, k, l;
173
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));
179     }
180 #endif
181
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++)
185       {
186         struct substring str;
187         const void **slot;
188
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];
196       }
197   attributes_initialized = true;
198 }
199
200 /* Return the spec for the attribute named NAME.  */
201
202 const struct attribute_spec *
203 lookup_attribute_spec (tree name)
204 {
205   struct substring attr;
206
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));
213 }
214 \f
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).  */
223
224 tree
225 decl_attributes (tree *node, tree attributes, int flags)
226 {
227   tree a;
228   tree returned_attrs = NULL_TREE;
229
230   if (TREE_TYPE (*node) == error_mark_node)
231     return NULL_TREE;
232
233   if (!attributes_initialized)
234     init_attributes ();
235
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)
239     {
240       tree cur_attr = lookup_attribute ("optimize", attributes);
241       tree opts = copy_list (current_optimize_pragma);
242
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));
248     }
249
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;
254
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))
261     {
262       tree cur_attr = lookup_attribute ("target", attributes);
263       tree opts = copy_list (current_target_pragma);
264
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));
269     }
270
271   targetm.insert_attributes (*node, &attributes);
272
273   for (a = attributes; a; a = TREE_CHAIN (a))
274     {
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;
281
282       if (spec == NULL)
283         {
284           warning (OPT_Wattributes, "%qs attribute directive ignored",
285                    IDENTIFIER_POINTER (name));
286           continue;
287         }
288       else if (list_length (args) < spec->min_length
289                || (spec->max_length >= 0
290                    && list_length (args) > spec->max_length))
291         {
292           error ("wrong number of arguments specified for %qs attribute",
293                  IDENTIFIER_POINTER (name));
294           continue;
295         }
296       gcc_assert (is_attribute_p (spec->name, name));
297
298       if (spec->decl_required && !DECL_P (*anode))
299         {
300           if (flags & ((int) ATTR_FLAG_DECL_NEXT
301                        | (int) ATTR_FLAG_FUNCTION_NEXT
302                        | (int) ATTR_FLAG_ARRAY_NEXT))
303             {
304               /* Pass on this attribute to be tried again.  */
305               returned_attrs = tree_cons (name, args, returned_attrs);
306               continue;
307             }
308           else
309             {
310               warning (OPT_Wattributes, "%qs attribute does not apply to types",
311                        IDENTIFIER_POINTER (name));
312               continue;
313             }
314         }
315
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))
321         {
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;
328         }
329
330       if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
331           && TREE_CODE (*anode) != METHOD_TYPE)
332         {
333           if (TREE_CODE (*anode) == POINTER_TYPE
334               && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
335                   || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
336             {
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.
343
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;
349             }
350           else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
351             {
352               /* Pass on this attribute to be tried again.  */
353               returned_attrs = tree_cons (name, args, returned_attrs);
354               continue;
355             }
356
357           if (TREE_CODE (*anode) != FUNCTION_TYPE
358               && TREE_CODE (*anode) != METHOD_TYPE)
359             {
360               warning (OPT_Wattributes,
361                        "%qs attribute only applies to function types",
362                        IDENTIFIER_POINTER (name));
363               continue;
364             }
365         }
366
367       if (TYPE_P (*anode)
368           && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
369           && TYPE_SIZE (*anode) != NULL_TREE)
370         {
371           warning (OPT_Wattributes, "type attributes ignored after type is already defined");
372           continue;
373         }
374
375       if (spec->handler != NULL)
376         returned_attrs = chainon ((*spec->handler) (anode, name, args,
377                                                     flags, &no_add_attrs),
378                                   returned_attrs);
379
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);
386
387       if (!no_add_attrs)
388         {
389           tree old_attrs;
390           tree a;
391
392           if (DECL_P (*anode))
393             old_attrs = DECL_ATTRIBUTES (*anode);
394           else
395             old_attrs = TYPE_ATTRIBUTES (*anode);
396
397           for (a = lookup_attribute (spec->name, old_attrs);
398                a != NULL_TREE;
399                a = lookup_attribute (spec->name, TREE_CHAIN (a)))
400             {
401               if (simple_cst_equal (TREE_VALUE (a), args) == 1)
402                 break;
403             }
404
405           if (a == NULL_TREE)
406             {
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)
411                 {
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))
416                     {
417                       tree variant;
418                       for (variant = *anode; variant;
419                            variant = TYPE_NEXT_VARIANT (variant))
420                         {
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));
428                         }
429                     }
430                 }
431               else
432                 *anode = build_type_attribute_variant (*anode,
433                                                        tree_cons (name, args,
434                                                                   old_attrs));
435             }
436         }
437
438       if (fn_ptr_tmp)
439         {
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
446             {
447               gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
448               *node = fn_ptr_tmp;
449             }
450         }
451     }
452
453   return returned_attrs;
454 }