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 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 2, or (at your option) any later
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
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
36 static void init_attributes PARAMS ((void));
38 /* Table of the tables of attributes (common, format, language, machine)
40 static const struct attribute_spec *attribute_tables[4];
42 static bool attributes_initialized = false;
44 static tree handle_packed_attribute PARAMS ((tree *, tree, tree, int,
46 static tree handle_nocommon_attribute PARAMS ((tree *, tree, tree, int,
48 static tree handle_common_attribute PARAMS ((tree *, tree, tree, int,
50 static tree handle_noreturn_attribute PARAMS ((tree *, tree, tree, int,
52 static tree handle_noinline_attribute PARAMS ((tree *, tree, tree, int,
54 static tree handle_used_attribute PARAMS ((tree *, tree, tree, int,
56 static tree handle_unused_attribute PARAMS ((tree *, tree, tree, int,
58 static tree handle_const_attribute PARAMS ((tree *, tree, tree, int,
60 static tree handle_transparent_union_attribute PARAMS ((tree *, tree, tree,
62 static tree handle_constructor_attribute PARAMS ((tree *, tree, tree, int,
64 static tree handle_destructor_attribute PARAMS ((tree *, tree, tree, int,
66 static tree handle_mode_attribute PARAMS ((tree *, tree, tree, int,
68 static tree handle_section_attribute PARAMS ((tree *, tree, tree, int,
70 static tree handle_aligned_attribute PARAMS ((tree *, tree, tree, int,
72 static tree handle_weak_attribute PARAMS ((tree *, tree, tree, int,
74 static tree handle_alias_attribute PARAMS ((tree *, tree, tree, int,
76 static tree handle_no_instrument_function_attribute PARAMS ((tree *, tree,
79 static tree handle_malloc_attribute PARAMS ((tree *, tree, tree, int,
81 static tree handle_no_limit_stack_attribute PARAMS ((tree *, tree, tree, int,
83 static tree handle_pure_attribute PARAMS ((tree *, tree, tree, int,
85 static tree handle_deprecated_attribute PARAMS ((tree *, tree, tree, int,
87 static tree handle_vector_size_attribute PARAMS ((tree *, tree, tree, int,
89 static tree vector_size_helper PARAMS ((tree, tree));
91 /* Table of machine-independent attributes common to all C-like languages. */
92 static const struct attribute_spec c_common_attribute_table[] =
94 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
95 { "packed", 0, 0, false, false, false,
96 handle_packed_attribute },
97 { "nocommon", 0, 0, true, false, false,
98 handle_nocommon_attribute },
99 { "common", 0, 0, true, false, false,
100 handle_common_attribute },
101 /* FIXME: logically, noreturn attributes should be listed as
102 "false, true, true" and apply to function types. But implementing this
103 would require all the places in the compiler that use TREE_THIS_VOLATILE
104 on a decl to identify non-returning functions to be located and fixed
105 to check the function type instead. */
106 { "noreturn", 0, 0, true, false, false,
107 handle_noreturn_attribute },
108 { "volatile", 0, 0, true, false, false,
109 handle_noreturn_attribute },
110 { "noinline", 0, 0, true, false, false,
111 handle_noinline_attribute },
112 { "used", 0, 0, true, false, false,
113 handle_used_attribute },
114 { "unused", 0, 0, false, false, false,
115 handle_unused_attribute },
116 /* The same comments as for noreturn attributes apply to const ones. */
117 { "const", 0, 0, true, false, false,
118 handle_const_attribute },
119 { "transparent_union", 0, 0, false, false, false,
120 handle_transparent_union_attribute },
121 { "constructor", 0, 0, true, false, false,
122 handle_constructor_attribute },
123 { "destructor", 0, 0, true, false, false,
124 handle_destructor_attribute },
125 { "mode", 1, 1, false, true, false,
126 handle_mode_attribute },
127 { "section", 1, 1, true, false, false,
128 handle_section_attribute },
129 { "aligned", 0, 1, false, false, false,
130 handle_aligned_attribute },
131 { "weak", 0, 0, true, false, false,
132 handle_weak_attribute },
133 { "alias", 1, 1, true, false, false,
134 handle_alias_attribute },
135 { "no_instrument_function", 0, 0, true, false, false,
136 handle_no_instrument_function_attribute },
137 { "malloc", 0, 0, true, false, false,
138 handle_malloc_attribute },
139 { "no_stack_limit", 0, 0, true, false, false,
140 handle_no_limit_stack_attribute },
141 { "pure", 0, 0, true, false, false,
142 handle_pure_attribute },
143 { "deprecated", 0, 0, false, false, false,
144 handle_deprecated_attribute },
145 { "vector_size", 1, 1, false, true, false,
146 handle_vector_size_attribute },
147 { NULL, 0, 0, false, false, false, NULL }
150 /* Default empty table of attributes. */
151 static const struct attribute_spec empty_attribute_table[] =
153 { NULL, 0, 0, false, false, false, NULL }
156 /* Table of machine-independent attributes for checking formats, if used. */
157 const struct attribute_spec *format_attribute_table = empty_attribute_table;
159 /* Table of machine-independent attributes for a particular language. */
160 const struct attribute_spec *lang_attribute_table = empty_attribute_table;
162 /* Flag saying whether common language attributes are to be supported. */
163 int lang_attribute_common = 1;
165 /* Initialize attribute tables, and make some sanity checks
166 if --enable-checking. */
171 #ifdef ENABLE_CHECKING
176 = lang_attribute_common ? c_common_attribute_table : empty_attribute_table;
177 attribute_tables[1] = lang_attribute_table;
178 attribute_tables[2] = format_attribute_table;
179 attribute_tables[3] = targetm.attribute_table;
181 #ifdef ENABLE_CHECKING
182 /* Make some sanity checks on the attribute tables. */
184 i < (int) (sizeof (attribute_tables) / sizeof (attribute_tables[0]));
189 for (j = 0; attribute_tables[i][j].name != NULL; j++)
191 /* The name must not begin and end with __. */
192 const char *name = attribute_tables[i][j].name;
193 int len = strlen (name);
194 if (name[0] == '_' && name[1] == '_'
195 && name[len - 1] == '_' && name[len - 2] == '_')
197 /* The minimum and maximum lengths must be consistent. */
198 if (attribute_tables[i][j].min_length < 0)
200 if (attribute_tables[i][j].max_length != -1
201 && (attribute_tables[i][j].max_length
202 < attribute_tables[i][j].min_length))
204 /* An attribute cannot require both a DECL and a TYPE. */
205 if (attribute_tables[i][j].decl_required
206 && attribute_tables[i][j].type_required)
208 /* If an attribute requires a function type, in particular
209 it requires a type. */
210 if (attribute_tables[i][j].function_type_required
211 && !attribute_tables[i][j].type_required)
216 /* Check that each name occurs just once in each table. */
218 i < (int) (sizeof (attribute_tables) / sizeof (attribute_tables[0]));
222 for (j = 0; attribute_tables[i][j].name != NULL; j++)
223 for (k = j + 1; attribute_tables[i][k].name != NULL; k++)
224 if (!strcmp (attribute_tables[i][j].name,
225 attribute_tables[i][k].name))
228 /* Check that no name occurs in more than one table. */
230 i < (int) (sizeof (attribute_tables) / sizeof (attribute_tables[0]));
236 j < ((int) (sizeof (attribute_tables)
237 / sizeof (attribute_tables[0])));
239 for (k = 0; attribute_tables[i][k].name != NULL; k++)
240 for (l = 0; attribute_tables[j][l].name != NULL; l++)
241 if (!strcmp (attribute_tables[i][k].name,
242 attribute_tables[j][l].name))
247 attributes_initialized = true;
250 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
251 which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
252 it should be modified in place; if a TYPE, a copy should be created
253 unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS. FLAGS gives further
254 information, in the form of a bitwise OR of flags in enum attribute_flags
255 from tree.h. Depending on these flags, some attributes may be
256 returned to be applied at a later stage (for example, to apply
257 a decl attribute to the declaration rather than to its type). If
258 ATTR_FLAG_BUILT_IN is not set and *NODE is a DECL, then also consider
259 whether there might be some default attributes to apply to this DECL;
260 if so, decl_attributes will be called recursively with those attributes
261 and ATTR_FLAG_BUILT_IN set. */
264 decl_attributes (node, attributes, flags)
265 tree *node, attributes;
269 tree returned_attrs = NULL_TREE;
271 if (!attributes_initialized)
274 (*targetm.insert_attributes) (*node, &attributes);
276 if (DECL_P (*node) && TREE_CODE (*node) == FUNCTION_DECL
277 && !(flags & (int) ATTR_FLAG_BUILT_IN))
278 insert_default_attributes (*node);
280 for (a = attributes; a; a = TREE_CHAIN (a))
282 tree name = TREE_PURPOSE (a);
283 tree args = TREE_VALUE (a);
285 const struct attribute_spec *spec = NULL;
286 bool no_add_attrs = 0;
290 i < ((int) (sizeof (attribute_tables)
291 / sizeof (attribute_tables[0])));
296 for (j = 0; attribute_tables[i][j].name != NULL; j++)
298 if (is_attribute_p (attribute_tables[i][j].name, name))
300 spec = &attribute_tables[i][j];
310 warning ("`%s' attribute directive ignored",
311 IDENTIFIER_POINTER (name));
314 else if (list_length (args) < spec->min_length
315 || (spec->max_length >= 0
316 && list_length (args) > spec->max_length))
318 error ("wrong number of arguments specified for `%s' attribute",
319 IDENTIFIER_POINTER (name));
323 if (spec->decl_required && !DECL_P (*anode))
325 if (flags & ((int) ATTR_FLAG_DECL_NEXT
326 | (int) ATTR_FLAG_FUNCTION_NEXT
327 | (int) ATTR_FLAG_ARRAY_NEXT))
329 /* Pass on this attribute to be tried again. */
330 returned_attrs = tree_cons (name, args, returned_attrs);
335 warning ("`%s' attribute does not apply to types",
336 IDENTIFIER_POINTER (name));
341 if (spec->type_required && DECL_P (*anode))
342 anode = &TREE_TYPE (*anode);
344 if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
345 && TREE_CODE (*anode) != METHOD_TYPE)
347 if (TREE_CODE (*anode) == POINTER_TYPE
348 && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
349 || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
351 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
352 *anode = build_type_copy (*anode);
353 anode = &TREE_TYPE (*anode);
355 else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
357 /* Pass on this attribute to be tried again. */
358 returned_attrs = tree_cons (name, args, returned_attrs);
362 if (TREE_CODE (*anode) != FUNCTION_TYPE
363 && TREE_CODE (*anode) != METHOD_TYPE)
365 warning ("`%s' attribute only applies to function types",
366 IDENTIFIER_POINTER (name));
371 if (spec->handler != NULL)
372 returned_attrs = chainon ((*spec->handler) (anode, name, args,
373 flags, &no_add_attrs),
376 /* Layout the decl in case anything changed. */
377 if (spec->type_required && DECL_P (*node)
378 && TREE_CODE (*node) == VAR_DECL)
380 /* Force a recalculation of mode and size. */
381 DECL_MODE (*node) = VOIDmode;
382 DECL_SIZE (*node) = 0;
384 layout_decl (*node, 0);
393 old_attrs = DECL_ATTRIBUTES (*anode);
395 old_attrs = TYPE_ATTRIBUTES (*anode);
397 for (a = lookup_attribute (spec->name, old_attrs);
399 a = lookup_attribute (spec->name, TREE_CHAIN (a)))
401 if (simple_cst_equal (TREE_VALUE (a), args) == 1)
407 /* This attribute isn't already in the list. */
409 DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
410 else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
411 TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
413 *anode = build_type_attribute_variant (*anode,
414 tree_cons (name, args,
420 return returned_attrs;
423 /* Handle a "packed" attribute; arguments as in
424 struct attribute_spec.handler. */
427 handle_packed_attribute (node, name, args, flags, no_add_attrs)
430 tree args ATTRIBUTE_UNUSED;
437 if (TREE_CODE (*node) == TYPE_DECL)
438 type = &TREE_TYPE (*node);
445 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
446 *type = build_type_copy (*type);
447 TYPE_PACKED (*type) = 1;
449 else if (TREE_CODE (*node) == FIELD_DECL)
450 DECL_PACKED (*node) = 1;
451 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
452 used for DECL_REGISTER. It wouldn't mean anything anyway. */
455 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
456 *no_add_attrs = true;
462 /* Handle a "nocommon" attribute; arguments as in
463 struct attribute_spec.handler. */
466 handle_nocommon_attribute (node, name, args, flags, no_add_attrs)
469 tree args ATTRIBUTE_UNUSED;
470 int flags ATTRIBUTE_UNUSED;
473 if (TREE_CODE (*node) == VAR_DECL)
474 DECL_COMMON (*node) = 0;
477 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
478 *no_add_attrs = true;
484 /* Handle a "common" attribute; arguments as in
485 struct attribute_spec.handler. */
488 handle_common_attribute (node, name, args, flags, no_add_attrs)
491 tree args ATTRIBUTE_UNUSED;
492 int flags ATTRIBUTE_UNUSED;
495 if (TREE_CODE (*node) == VAR_DECL)
496 DECL_COMMON (*node) = 1;
499 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
500 *no_add_attrs = true;
506 /* Handle a "noreturn" attribute; arguments as in
507 struct attribute_spec.handler. */
510 handle_noreturn_attribute (node, name, args, flags, no_add_attrs)
513 tree args ATTRIBUTE_UNUSED;
514 int flags ATTRIBUTE_UNUSED;
517 tree type = TREE_TYPE (*node);
519 /* See FIXME comment in c_common_attribute_table. */
520 if (TREE_CODE (*node) == FUNCTION_DECL)
521 TREE_THIS_VOLATILE (*node) = 1;
522 else if (TREE_CODE (type) == POINTER_TYPE
523 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
526 (build_type_variant (TREE_TYPE (type),
527 TREE_READONLY (TREE_TYPE (type)), 1));
530 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
531 *no_add_attrs = true;
537 /* Handle a "noinline" attribute; arguments as in
538 struct attribute_spec.handler. */
541 handle_noinline_attribute (node, name, args, flags, no_add_attrs)
544 tree args ATTRIBUTE_UNUSED;
545 int flags ATTRIBUTE_UNUSED;
548 if (TREE_CODE (*node) == FUNCTION_DECL)
549 DECL_UNINLINABLE (*node) = 1;
552 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
553 *no_add_attrs = true;
559 /* Handle a "used" attribute; arguments as in
560 struct attribute_spec.handler. */
563 handle_used_attribute (node, name, args, flags, no_add_attrs)
566 tree args ATTRIBUTE_UNUSED;
567 int flags ATTRIBUTE_UNUSED;
570 if (TREE_CODE (*node) == FUNCTION_DECL)
571 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (*node))
572 = TREE_USED (*node) = 1;
575 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
576 *no_add_attrs = true;
582 /* Handle a "unused" attribute; arguments as in
583 struct attribute_spec.handler. */
586 handle_unused_attribute (node, name, args, flags, no_add_attrs)
589 tree args ATTRIBUTE_UNUSED;
597 if (TREE_CODE (decl) == PARM_DECL
598 || TREE_CODE (decl) == VAR_DECL
599 || TREE_CODE (decl) == FUNCTION_DECL
600 || TREE_CODE (decl) == LABEL_DECL
601 || TREE_CODE (decl) == TYPE_DECL)
602 TREE_USED (decl) = 1;
605 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
606 *no_add_attrs = true;
611 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
612 *node = build_type_copy (*node);
613 TREE_USED (*node) = 1;
619 /* Handle a "const" attribute; arguments as in
620 struct attribute_spec.handler. */
623 handle_const_attribute (node, name, args, flags, no_add_attrs)
626 tree args ATTRIBUTE_UNUSED;
627 int flags ATTRIBUTE_UNUSED;
630 tree type = TREE_TYPE (*node);
632 /* See FIXME comment on noreturn in c_common_attribute_table. */
633 if (TREE_CODE (*node) == FUNCTION_DECL)
634 TREE_READONLY (*node) = 1;
635 else if (TREE_CODE (type) == POINTER_TYPE
636 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
639 (build_type_variant (TREE_TYPE (type), 1,
640 TREE_THIS_VOLATILE (TREE_TYPE (type))));
643 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
644 *no_add_attrs = true;
650 /* Handle a "transparent_union" attribute; arguments as in
651 struct attribute_spec.handler. */
654 handle_transparent_union_attribute (node, name, args, flags, no_add_attrs)
657 tree args ATTRIBUTE_UNUSED;
661 tree decl = NULL_TREE;
668 type = &TREE_TYPE (decl);
669 is_type = TREE_CODE (*node) == TYPE_DECL;
671 else if (TYPE_P (*node))
672 type = node, is_type = 1;
675 && TREE_CODE (*type) == UNION_TYPE
677 || (TYPE_FIELDS (*type) != 0
678 && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))))
680 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
681 *type = build_type_copy (*type);
682 TYPE_TRANSPARENT_UNION (*type) = 1;
684 else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
685 && TREE_CODE (*type) == UNION_TYPE
686 && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))
687 DECL_TRANSPARENT_UNION (decl) = 1;
690 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
691 *no_add_attrs = true;
697 /* Handle a "constructor" attribute; arguments as in
698 struct attribute_spec.handler. */
701 handle_constructor_attribute (node, name, args, flags, no_add_attrs)
704 tree args ATTRIBUTE_UNUSED;
705 int flags ATTRIBUTE_UNUSED;
709 tree type = TREE_TYPE (decl);
711 if (TREE_CODE (decl) == FUNCTION_DECL
712 && TREE_CODE (type) == FUNCTION_TYPE
713 && decl_function_context (decl) == 0)
715 DECL_STATIC_CONSTRUCTOR (decl) = 1;
716 TREE_USED (decl) = 1;
720 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
721 *no_add_attrs = true;
727 /* Handle a "destructor" attribute; arguments as in
728 struct attribute_spec.handler. */
731 handle_destructor_attribute (node, name, args, flags, no_add_attrs)
734 tree args ATTRIBUTE_UNUSED;
735 int flags ATTRIBUTE_UNUSED;
739 tree type = TREE_TYPE (decl);
741 if (TREE_CODE (decl) == FUNCTION_DECL
742 && TREE_CODE (type) == FUNCTION_TYPE
743 && decl_function_context (decl) == 0)
745 DECL_STATIC_DESTRUCTOR (decl) = 1;
746 TREE_USED (decl) = 1;
750 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
751 *no_add_attrs = true;
757 /* Handle a "mode" attribute; arguments as in
758 struct attribute_spec.handler. */
761 handle_mode_attribute (node, name, args, flags, no_add_attrs)
765 int flags ATTRIBUTE_UNUSED;
770 *no_add_attrs = true;
772 if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
773 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
777 const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
778 int len = strlen (p);
779 enum machine_mode mode = VOIDmode;
782 if (len > 4 && p[0] == '_' && p[1] == '_'
783 && p[len - 1] == '_' && p[len - 2] == '_')
785 char *newp = (char *) alloca (len - 1);
787 strcpy (newp, &p[2]);
788 newp[len - 4] = '\0';
792 /* Change this type to have a type with the specified mode.
793 First check for the special modes. */
794 if (! strcmp (p, "byte"))
796 else if (!strcmp (p, "word"))
798 else if (! strcmp (p, "pointer"))
801 for (j = 0; j < NUM_MACHINE_MODES; j++)
802 if (!strcmp (p, GET_MODE_NAME (j)))
803 mode = (enum machine_mode) j;
805 if (mode == VOIDmode)
806 error ("unknown machine mode `%s'", p);
807 else if (0 == (typefm = type_for_mode (mode,
808 TREE_UNSIGNED (type))))
809 error ("no data type for mode `%s'", p);
812 /* No need to layout the type here. The caller should do this. */
818 /* Handle a "section" attribute; arguments as in
819 struct attribute_spec.handler. */
822 handle_section_attribute (node, name, args, flags, no_add_attrs)
824 tree name ATTRIBUTE_UNUSED;
826 int flags ATTRIBUTE_UNUSED;
831 if (targetm.have_named_sections)
833 if ((TREE_CODE (decl) == FUNCTION_DECL
834 || TREE_CODE (decl) == VAR_DECL)
835 && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
837 if (TREE_CODE (decl) == VAR_DECL
838 && current_function_decl != NULL_TREE
839 && ! TREE_STATIC (decl))
841 error_with_decl (decl,
842 "section attribute cannot be specified for local variables");
843 *no_add_attrs = true;
846 /* The decl may have already been given a section attribute
847 from a previous declaration. Ensure they match. */
848 else if (DECL_SECTION_NAME (decl) != NULL_TREE
849 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
850 TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
852 error_with_decl (*node,
853 "section of `%s' conflicts with previous declaration");
854 *no_add_attrs = true;
857 DECL_SECTION_NAME (decl) = TREE_VALUE (args);
861 error_with_decl (*node,
862 "section attribute not allowed for `%s'");
863 *no_add_attrs = true;
868 error_with_decl (*node,
869 "section attributes are not supported for this target");
870 *no_add_attrs = true;
876 /* Handle a "aligned" attribute; arguments as in
877 struct attribute_spec.handler. */
880 handle_aligned_attribute (node, name, args, flags, no_add_attrs)
882 tree name ATTRIBUTE_UNUSED;
887 tree decl = NULL_TREE;
890 tree align_expr = (args ? TREE_VALUE (args)
891 : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
897 type = &TREE_TYPE (decl);
898 is_type = TREE_CODE (*node) == TYPE_DECL;
900 else if (TYPE_P (*node))
901 type = node, is_type = 1;
903 /* Strip any NOPs of any kind. */
904 while (TREE_CODE (align_expr) == NOP_EXPR
905 || TREE_CODE (align_expr) == CONVERT_EXPR
906 || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
907 align_expr = TREE_OPERAND (align_expr, 0);
909 if (TREE_CODE (align_expr) != INTEGER_CST)
911 error ("requested alignment is not a constant");
912 *no_add_attrs = true;
914 else if ((i = tree_log2 (align_expr)) == -1)
916 error ("requested alignment is not a power of 2");
917 *no_add_attrs = true;
919 else if (i > HOST_BITS_PER_INT - 2)
921 error ("requested alignment is too large");
922 *no_add_attrs = true;
926 /* If we have a TYPE_DECL, then copy the type, so that we
927 don't accidentally modify a builtin type. See pushdecl. */
928 if (decl && TREE_TYPE (decl) != error_mark_node
929 && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
931 tree tt = TREE_TYPE (decl);
932 *type = build_type_copy (*type);
933 DECL_ORIGINAL_TYPE (decl) = tt;
934 TYPE_NAME (*type) = decl;
935 TREE_USED (*type) = TREE_USED (decl);
936 TREE_TYPE (decl) = *type;
938 else if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
939 *type = build_type_copy (*type);
941 TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT;
942 TYPE_USER_ALIGN (*type) = 1;
944 else if (TREE_CODE (decl) != VAR_DECL
945 && TREE_CODE (decl) != FIELD_DECL)
947 error_with_decl (decl,
948 "alignment may not be specified for `%s'");
949 *no_add_attrs = true;
953 DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
954 DECL_USER_ALIGN (decl) = 1;
960 /* Handle a "weak" attribute; arguments as in
961 struct attribute_spec.handler. */
964 handle_weak_attribute (node, name, args, flags, no_add_attrs)
966 tree name ATTRIBUTE_UNUSED;
967 tree args ATTRIBUTE_UNUSED;
968 int flags ATTRIBUTE_UNUSED;
969 bool *no_add_attrs ATTRIBUTE_UNUSED;
971 declare_weak (*node);
976 /* Handle an "alias" attribute; arguments as in
977 struct attribute_spec.handler. */
980 handle_alias_attribute (node, name, args, flags, no_add_attrs)
984 int flags ATTRIBUTE_UNUSED;
989 if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
990 || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
992 error_with_decl (decl,
993 "`%s' defined both normally and as an alias");
994 *no_add_attrs = true;
996 else if (decl_function_context (decl) == 0)
1000 id = TREE_VALUE (args);
1001 if (TREE_CODE (id) != STRING_CST)
1003 error ("alias arg not a string");
1004 *no_add_attrs = true;
1007 id = get_identifier (TREE_STRING_POINTER (id));
1008 /* This counts as a use of the object pointed to. */
1011 if (TREE_CODE (decl) == FUNCTION_DECL)
1012 DECL_INITIAL (decl) = error_mark_node;
1014 DECL_EXTERNAL (decl) = 0;
1015 assemble_alias (decl, id);
1019 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
1020 *no_add_attrs = true;
1026 /* Handle a "no_instrument_function" attribute; arguments as in
1027 struct attribute_spec.handler. */
1030 handle_no_instrument_function_attribute (node, name, args, flags, no_add_attrs)
1033 tree args ATTRIBUTE_UNUSED;
1034 int flags ATTRIBUTE_UNUSED;
1039 if (TREE_CODE (decl) != FUNCTION_DECL)
1041 error_with_decl (decl,
1042 "`%s' attribute applies only to functions",
1043 IDENTIFIER_POINTER (name));
1044 *no_add_attrs = true;
1046 else if (DECL_INITIAL (decl))
1048 error_with_decl (decl,
1049 "can't set `%s' attribute after definition",
1050 IDENTIFIER_POINTER (name));
1051 *no_add_attrs = true;
1054 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1059 /* Handle a "malloc" attribute; arguments as in
1060 struct attribute_spec.handler. */
1063 handle_malloc_attribute (node, name, args, flags, no_add_attrs)
1066 tree args ATTRIBUTE_UNUSED;
1067 int flags ATTRIBUTE_UNUSED;
1070 if (TREE_CODE (*node) == FUNCTION_DECL)
1071 DECL_IS_MALLOC (*node) = 1;
1072 /* ??? TODO: Support types. */
1075 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
1076 *no_add_attrs = true;
1082 /* Handle a "no_limit_stack" attribute; arguments as in
1083 struct attribute_spec.handler. */
1086 handle_no_limit_stack_attribute (node, name, args, flags, no_add_attrs)
1089 tree args ATTRIBUTE_UNUSED;
1090 int flags ATTRIBUTE_UNUSED;
1095 if (TREE_CODE (decl) != FUNCTION_DECL)
1097 error_with_decl (decl,
1098 "`%s' attribute applies only to functions",
1099 IDENTIFIER_POINTER (name));
1100 *no_add_attrs = true;
1102 else if (DECL_INITIAL (decl))
1104 error_with_decl (decl,
1105 "can't set `%s' attribute after definition",
1106 IDENTIFIER_POINTER (name));
1107 *no_add_attrs = true;
1110 DECL_NO_LIMIT_STACK (decl) = 1;
1115 /* Handle a "pure" attribute; arguments as in
1116 struct attribute_spec.handler. */
1119 handle_pure_attribute (node, name, args, flags, no_add_attrs)
1122 tree args ATTRIBUTE_UNUSED;
1123 int flags ATTRIBUTE_UNUSED;
1126 if (TREE_CODE (*node) == FUNCTION_DECL)
1127 DECL_IS_PURE (*node) = 1;
1128 /* ??? TODO: Support types. */
1131 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
1132 *no_add_attrs = true;
1138 /* Handle a "deprecated" attribute; arguments as in
1139 struct attribute_spec.handler. */
1142 handle_deprecated_attribute (node, name, args, flags, no_add_attrs)
1145 tree args ATTRIBUTE_UNUSED;
1149 tree type = NULL_TREE;
1151 const char *what = NULL;
1156 type = TREE_TYPE (decl);
1158 if (TREE_CODE (decl) == TYPE_DECL
1159 || TREE_CODE (decl) == PARM_DECL
1160 || TREE_CODE (decl) == VAR_DECL
1161 || TREE_CODE (decl) == FUNCTION_DECL
1162 || TREE_CODE (decl) == FIELD_DECL)
1163 TREE_DEPRECATED (decl) = 1;
1167 else if (TYPE_P (*node))
1169 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
1170 *node = build_type_copy (*node);
1171 TREE_DEPRECATED (*node) = 1;
1179 *no_add_attrs = true;
1180 if (type && TYPE_NAME (type))
1182 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
1183 what = IDENTIFIER_POINTER (TYPE_NAME (*node));
1184 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1185 && DECL_NAME (TYPE_NAME (type)))
1186 what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
1189 warning ("`%s' attribute ignored for `%s'",
1190 IDENTIFIER_POINTER (name), what);
1192 warning ("`%s' attribute ignored",
1193 IDENTIFIER_POINTER (name));
1199 /* Handle a "vector_size" attribute; arguments as in
1200 struct attribute_spec.handler. */
1203 handle_vector_size_attribute (node, name, args, flags, no_add_attrs)
1207 int flags ATTRIBUTE_UNUSED;
1210 unsigned HOST_WIDE_INT vecsize, nunits;
1211 enum machine_mode mode, orig_mode, new_mode;
1212 tree type = *node, new_type;
1214 *no_add_attrs = true;
1216 if (! host_integerp (TREE_VALUE (args), 1))
1218 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
1222 /* Get the vector size (in bytes). */
1223 vecsize = tree_low_cst (TREE_VALUE (args), 1);
1225 /* We need to provide for vector pointers, vector arrays, and
1226 functions returning vectors. For example:
1228 __attribute__((vector_size(16))) short *foo;
1230 In this case, the mode is SI, but the type being modified is
1231 HI, so we need to look further. */
1233 while (POINTER_TYPE_P (type)
1234 || TREE_CODE (type) == FUNCTION_TYPE
1235 || TREE_CODE (type) == ARRAY_TYPE)
1236 type = TREE_TYPE (type);
1238 /* Get the mode of the type being modified. */
1239 orig_mode = TYPE_MODE (type);
1241 if (TREE_CODE (type) == RECORD_TYPE
1242 || (GET_MODE_CLASS (orig_mode) != MODE_FLOAT
1243 && GET_MODE_CLASS (orig_mode) != MODE_INT)
1244 || ! host_integerp (TYPE_SIZE_UNIT (type), 1))
1246 error ("invalid vector type for attribute `%s'",
1247 IDENTIFIER_POINTER (name));
1251 /* Calculate how many units fit in the vector. */
1252 nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
1254 /* Find a suitably sized vector. */
1255 new_mode = VOIDmode;
1256 for (mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_mode) == MODE_INT
1258 : MODE_VECTOR_FLOAT);
1260 mode = GET_MODE_WIDER_MODE (mode))
1261 if (vecsize == GET_MODE_SIZE (mode)
1262 && nunits == (unsigned HOST_WIDE_INT) GET_MODE_NUNITS (mode))
1268 if (new_mode == VOIDmode)
1269 error ("no vector mode with the size and type specified could be found");
1272 new_type = type_for_mode (new_mode, TREE_UNSIGNED (type));
1274 error ("no vector mode with the size and type specified could be found");
1276 /* Build back pointers if needed. */
1277 *node = vector_size_helper (*node, new_type);
1283 /* HACK. GROSS. This is absolutely disgusting. I wish there was a
1286 If we requested a pointer to a vector, build up the pointers that
1287 we stripped off while looking for the inner type. Similarly for
1288 return values from functions.
1290 The argument "type" is the top of the chain, and "bottom" is the
1291 new type which we will point to. */
1294 vector_size_helper (type, bottom)
1299 if (POINTER_TYPE_P (type))
1301 inner = vector_size_helper (TREE_TYPE (type), bottom);
1302 outer = build_pointer_type (inner);
1304 else if (TREE_CODE (type) == ARRAY_TYPE)
1306 inner = vector_size_helper (TREE_TYPE (type), bottom);
1307 outer = build_array_type (inner, TYPE_VALUES (type));
1309 else if (TREE_CODE (type) == FUNCTION_TYPE)
1311 inner = vector_size_helper (TREE_TYPE (type), bottom);
1312 outer = build_function_type (inner, TYPE_VALUES (type));
1317 TREE_READONLY (outer) = TREE_READONLY (type);
1318 TREE_THIS_VOLATILE (outer) = TREE_THIS_VOLATILE (type);
1323 /* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two
1324 lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE).
1326 The head of the declspec list is stored in DECLSPECS.
1327 The head of the attribute list is stored in PREFIX_ATTRIBUTES.
1329 Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of
1330 the list elements. We drop the containing TREE_LIST nodes and link the
1331 resulting attributes together the way decl_attributes expects them. */
1334 split_specs_attrs (specs_attrs, declspecs, prefix_attributes)
1336 tree *declspecs, *prefix_attributes;
1338 tree t, s, a, next, specs, attrs;
1340 /* This can happen after an __extension__ in pedantic mode. */
1341 if (specs_attrs != NULL_TREE
1342 && TREE_CODE (specs_attrs) == INTEGER_CST)
1344 *declspecs = NULL_TREE;
1345 *prefix_attributes = NULL_TREE;
1349 /* This can happen in c++ (eg: decl: typespec initdecls ';'). */
1350 if (specs_attrs != NULL_TREE
1351 && TREE_CODE (specs_attrs) != TREE_LIST)
1353 *declspecs = specs_attrs;
1354 *prefix_attributes = NULL_TREE;
1358 /* Remember to keep the lists in the same order, element-wise. */
1360 specs = s = NULL_TREE;
1361 attrs = a = NULL_TREE;
1362 for (t = specs_attrs; t; t = next)
1364 next = TREE_CHAIN (t);
1365 /* Declspecs have a non-NULL TREE_VALUE. */
1366 if (TREE_VALUE (t) != NULL_TREE)
1368 if (specs == NULL_TREE)
1376 /* The TREE_PURPOSE may also be empty in the case of
1377 __attribute__(()). */
1378 else if (TREE_PURPOSE (t) != NULL_TREE)
1380 if (attrs == NULL_TREE)
1381 attrs = a = TREE_PURPOSE (t);
1384 TREE_CHAIN (a) = TREE_PURPOSE (t);
1385 a = TREE_PURPOSE (t);
1387 /* More attrs can be linked here, move A to the end. */
1388 while (TREE_CHAIN (a) != NULL_TREE)
1393 /* Terminate the lists. */
1395 TREE_CHAIN (s) = NULL_TREE;
1397 TREE_CHAIN (a) = NULL_TREE;
1401 *prefix_attributes = attrs;
1404 /* Strip attributes from SPECS_ATTRS, a list of declspecs and attributes.
1405 This function is used by the parser when a rule will accept attributes
1406 in a particular position, but we don't want to support that just yet.
1408 A warning is issued for every ignored attribute. */
1411 strip_attrs (specs_attrs)
1416 split_specs_attrs (specs_attrs, &specs, &attrs);
1420 warning ("`%s' attribute ignored",
1421 IDENTIFIER_POINTER (TREE_PURPOSE (attrs)));
1422 attrs = TREE_CHAIN (attrs);