Skip gcc.dg/guality/example.c on hppa-linux.
[official-gcc.git] / gcc / attribs.c
blob9e7b7c1abd202864a9ad4d5c2cd7be7ec859316c
1 /* Functions dealing with attribute handling, used by most front ends.
2 Copyright (C) 1992-2021 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #define INCLUDE_STRING
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "target.h"
25 #include "tree.h"
26 #include "stringpool.h"
27 #include "diagnostic-core.h"
28 #include "attribs.h"
29 #include "fold-const.h"
30 #include "stor-layout.h"
31 #include "langhooks.h"
32 #include "plugin.h"
33 #include "selftest.h"
34 #include "hash-set.h"
35 #include "diagnostic.h"
36 #include "pretty-print.h"
37 #include "tree-pretty-print.h"
38 #include "intl.h"
40 /* Table of the tables of attributes (common, language, format, machine)
41 searched. */
42 static const struct attribute_spec *attribute_tables[4];
44 /* Substring representation. */
46 struct substring
48 const char *str;
49 int length;
52 /* Simple hash function to avoid need to scan whole string. */
54 static inline hashval_t
55 substring_hash (const char *str, int l)
57 return str[0] + str[l - 1] * 256 + l * 65536;
60 /* Used for attribute_hash. */
62 struct attribute_hasher : nofree_ptr_hash <attribute_spec>
64 typedef substring *compare_type;
65 static inline hashval_t hash (const attribute_spec *);
66 static inline bool equal (const attribute_spec *, const substring *);
69 inline hashval_t
70 attribute_hasher::hash (const attribute_spec *spec)
72 const int l = strlen (spec->name);
73 return substring_hash (spec->name, l);
76 inline bool
77 attribute_hasher::equal (const attribute_spec *spec, const substring *str)
79 return (strncmp (spec->name, str->str, str->length) == 0
80 && !spec->name[str->length]);
83 /* Scoped attribute name representation. */
85 struct scoped_attributes
87 const char *ns;
88 vec<attribute_spec> attributes;
89 hash_table<attribute_hasher> *attribute_hash;
90 /* True if we should not warn about unknown attributes in this NS. */
91 bool ignored_p;
94 /* The table of scope attributes. */
95 static vec<scoped_attributes> attributes_table;
97 static scoped_attributes* find_attribute_namespace (const char*);
98 static void register_scoped_attribute (const struct attribute_spec *,
99 scoped_attributes *);
100 static const struct attribute_spec *lookup_scoped_attribute_spec (const_tree,
101 const_tree);
103 static bool attributes_initialized = false;
105 /* Default empty table of attributes. */
107 static const struct attribute_spec empty_attribute_table[] =
109 { NULL, 0, 0, false, false, false, false, NULL, NULL }
112 /* Return base name of the attribute. Ie '__attr__' is turned into 'attr'.
113 To avoid need for copying, we simply return length of the string. */
115 static void
116 extract_attribute_substring (struct substring *str)
118 canonicalize_attr_name (str->str, str->length);
121 /* Insert an array of attributes ATTRIBUTES into a namespace. This
122 array must be NULL terminated. NS is the name of attribute
123 namespace. IGNORED_P is true iff all unknown attributes in this
124 namespace should be ignored for the purposes of -Wattributes. The
125 function returns the namespace into which the attributes have been
126 registered. */
128 scoped_attributes *
129 register_scoped_attributes (const struct attribute_spec *attributes,
130 const char *ns, bool ignored_p /*=false*/)
132 scoped_attributes *result = NULL;
134 /* See if we already have attributes in the namespace NS. */
135 result = find_attribute_namespace (ns);
137 if (result == NULL)
139 /* We don't have any namespace NS yet. Create one. */
140 scoped_attributes sa;
142 if (attributes_table.is_empty ())
143 attributes_table.create (64);
145 memset (&sa, 0, sizeof (sa));
146 sa.ns = ns;
147 sa.attributes.create (64);
148 sa.ignored_p = ignored_p;
149 result = attributes_table.safe_push (sa);
150 result->attribute_hash = new hash_table<attribute_hasher> (200);
152 else
153 result->ignored_p |= ignored_p;
155 /* Really add the attributes to their namespace now. */
156 for (unsigned i = 0; attributes[i].name != NULL; ++i)
158 result->attributes.safe_push (attributes[i]);
159 register_scoped_attribute (&attributes[i], result);
162 gcc_assert (result != NULL);
164 return result;
167 /* Return the namespace which name is NS, NULL if none exist. */
169 static scoped_attributes*
170 find_attribute_namespace (const char* ns)
172 for (scoped_attributes &iter : attributes_table)
173 if (ns == iter.ns
174 || (iter.ns != NULL
175 && ns != NULL
176 && !strcmp (iter.ns, ns)))
177 return &iter;
178 return NULL;
181 /* Make some sanity checks on the attribute tables. */
183 static void
184 check_attribute_tables (void)
186 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
187 for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
189 /* The name must not begin and end with __. */
190 const char *name = attribute_tables[i][j].name;
191 int len = strlen (name);
193 gcc_assert (!(name[0] == '_' && name[1] == '_'
194 && name[len - 1] == '_' && name[len - 2] == '_'));
196 /* The minimum and maximum lengths must be consistent. */
197 gcc_assert (attribute_tables[i][j].min_length >= 0);
199 gcc_assert (attribute_tables[i][j].max_length == -1
200 || (attribute_tables[i][j].max_length
201 >= attribute_tables[i][j].min_length));
203 /* An attribute cannot require both a DECL and a TYPE. */
204 gcc_assert (!attribute_tables[i][j].decl_required
205 || !attribute_tables[i][j].type_required);
207 /* If an attribute requires a function type, in particular
208 it requires a type. */
209 gcc_assert (!attribute_tables[i][j].function_type_required
210 || attribute_tables[i][j].type_required);
213 /* Check that each name occurs just once in each table. */
214 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
215 for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
216 for (size_t k = j + 1; attribute_tables[i][k].name != NULL; k++)
217 gcc_assert (strcmp (attribute_tables[i][j].name,
218 attribute_tables[i][k].name));
220 /* Check that no name occurs in more than one table. Names that
221 begin with '*' are exempt, and may be overridden. */
222 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
223 for (size_t j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
224 for (size_t k = 0; attribute_tables[i][k].name != NULL; k++)
225 for (size_t l = 0; attribute_tables[j][l].name != NULL; l++)
226 gcc_assert (attribute_tables[i][k].name[0] == '*'
227 || strcmp (attribute_tables[i][k].name,
228 attribute_tables[j][l].name));
231 /* Used to stash pointers to allocated memory so that we can free them at
232 the end of parsing of all TUs. */
233 static vec<attribute_spec *> ignored_attributes_table;
235 /* Parse arguments V of -Wno-attributes=.
236 Currently we accept:
237 vendor::attr
238 vendor::
239 This functions also registers the parsed attributes so that we don't
240 warn that we don't recognize them. */
242 void
243 handle_ignored_attributes_option (vec<char *> *v)
245 if (v == nullptr)
246 return;
248 for (auto opt : v)
250 char *cln = strstr (opt, "::");
251 /* We don't accept '::attr'. */
252 if (cln == nullptr || cln == opt)
254 error ("wrong argument to ignored attributes");
255 inform (input_location, "valid format is %<ns::attr%> or %<ns::%>");
256 continue;
258 const char *vendor_start = opt;
259 ptrdiff_t vendor_len = cln - opt;
260 const char *attr_start = cln + 2;
261 /* This could really use rawmemchr :(. */
262 ptrdiff_t attr_len = strchr (attr_start, '\0') - attr_start;
263 /* Verify that they look valid. */
264 auto valid_p = [](const char *const s, ptrdiff_t len) {
265 bool ok = false;
267 for (int i = 0; i < len; ++i)
268 if (ISALNUM (s[i]))
269 ok = true;
270 else if (s[i] != '_')
271 return false;
273 return ok;
275 if (!valid_p (vendor_start, vendor_len))
277 error ("wrong argument to ignored attributes");
278 continue;
280 canonicalize_attr_name (vendor_start, vendor_len);
281 /* We perform all this hijinks so that we don't have to copy OPT. */
282 tree vendor_id = get_identifier_with_length (vendor_start, vendor_len);
283 const char *attr;
284 /* In the "vendor::" case, we should ignore *any* attribute coming
285 from this attribute namespace. */
286 if (attr_len > 0)
288 if (!valid_p (attr_start, attr_len))
290 error ("wrong argument to ignored attributes");
291 continue;
293 canonicalize_attr_name (attr_start, attr_len);
294 tree attr_id = get_identifier_with_length (attr_start, attr_len);
295 attr = IDENTIFIER_POINTER (attr_id);
296 /* If we've already seen this vendor::attr, ignore it. Attempting to
297 register it twice would lead to a crash. */
298 if (lookup_scoped_attribute_spec (vendor_id, attr_id))
299 continue;
301 else
302 attr = nullptr;
303 /* Create a table with extra attributes which we will register.
304 We can't free it here, so squirrel away the pointers. */
305 attribute_spec *table = new attribute_spec[2];
306 ignored_attributes_table.safe_push (table);
307 table[0] = { attr, 0, -2, false, false, false, false, nullptr, nullptr };
308 table[1] = { nullptr, 0, 0, false, false, false, false, nullptr,
309 nullptr };
310 register_scoped_attributes (table, IDENTIFIER_POINTER (vendor_id), !attr);
314 /* Free data we might have allocated when adding extra attributes. */
316 void
317 free_attr_data ()
319 for (auto x : ignored_attributes_table)
320 delete[] x;
321 ignored_attributes_table.release ();
324 /* Initialize attribute tables, and make some sanity checks if checking is
325 enabled. */
327 void
328 init_attributes (void)
330 size_t i;
332 if (attributes_initialized)
333 return;
335 attribute_tables[0] = lang_hooks.common_attribute_table;
336 attribute_tables[1] = lang_hooks.attribute_table;
337 attribute_tables[2] = lang_hooks.format_attribute_table;
338 attribute_tables[3] = targetm.attribute_table;
340 /* Translate NULL pointers to pointers to the empty table. */
341 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
342 if (attribute_tables[i] == NULL)
343 attribute_tables[i] = empty_attribute_table;
345 if (flag_checking)
346 check_attribute_tables ();
348 for (i = 0; i < ARRAY_SIZE (attribute_tables); ++i)
349 /* Put all the GNU attributes into the "gnu" namespace. */
350 register_scoped_attributes (attribute_tables[i], "gnu");
352 vec<char *> *ignored = (vec<char *> *) flag_ignored_attributes;
353 handle_ignored_attributes_option (ignored);
355 invoke_plugin_callbacks (PLUGIN_ATTRIBUTES, NULL);
356 attributes_initialized = true;
359 /* Insert a single ATTR into the attribute table. */
361 void
362 register_attribute (const struct attribute_spec *attr)
364 register_scoped_attribute (attr, find_attribute_namespace ("gnu"));
367 /* Insert a single attribute ATTR into a namespace of attributes. */
369 static void
370 register_scoped_attribute (const struct attribute_spec *attr,
371 scoped_attributes *name_space)
373 struct substring str;
374 attribute_spec **slot;
376 gcc_assert (attr != NULL && name_space != NULL);
378 gcc_assert (name_space->attribute_hash);
380 str.str = attr->name;
381 str.length = strlen (str.str);
383 /* Attribute names in the table must be in the form 'text' and not
384 in the form '__text__'. */
385 gcc_checking_assert (!canonicalize_attr_name (str.str, str.length));
387 slot = name_space->attribute_hash
388 ->find_slot_with_hash (&str, substring_hash (str.str, str.length),
389 INSERT);
390 gcc_assert (!*slot || attr->name[0] == '*');
391 *slot = CONST_CAST (struct attribute_spec *, attr);
394 /* Return the spec for the scoped attribute with namespace NS and
395 name NAME. */
397 static const struct attribute_spec *
398 lookup_scoped_attribute_spec (const_tree ns, const_tree name)
400 struct substring attr;
401 scoped_attributes *attrs;
403 const char *ns_str = (ns != NULL_TREE) ? IDENTIFIER_POINTER (ns): NULL;
405 attrs = find_attribute_namespace (ns_str);
407 if (attrs == NULL)
408 return NULL;
410 attr.str = IDENTIFIER_POINTER (name);
411 attr.length = IDENTIFIER_LENGTH (name);
412 extract_attribute_substring (&attr);
413 return attrs->attribute_hash->find_with_hash (&attr,
414 substring_hash (attr.str,
415 attr.length));
418 /* Return the spec for the attribute named NAME. If NAME is a TREE_LIST,
419 it also specifies the attribute namespace. */
421 const struct attribute_spec *
422 lookup_attribute_spec (const_tree name)
424 tree ns;
425 if (TREE_CODE (name) == TREE_LIST)
427 ns = TREE_PURPOSE (name);
428 name = TREE_VALUE (name);
430 else
431 ns = get_identifier ("gnu");
432 return lookup_scoped_attribute_spec (ns, name);
436 /* Return the namespace of the attribute ATTR. This accessor works on
437 GNU and C++11 (scoped) attributes. On GNU attributes,
438 it returns an identifier tree for the string "gnu".
440 Please read the comments of cxx11_attribute_p to understand the
441 format of attributes. */
443 tree
444 get_attribute_namespace (const_tree attr)
446 if (cxx11_attribute_p (attr))
447 return TREE_PURPOSE (TREE_PURPOSE (attr));
448 return get_identifier ("gnu");
451 /* Check LAST_DECL and NODE of the same symbol for attributes that are
452 recorded in SPEC to be mutually exclusive with ATTRNAME, diagnose
453 them, and return true if any have been found. NODE can be a DECL
454 or a TYPE. */
456 static bool
457 diag_attr_exclusions (tree last_decl, tree node, tree attrname,
458 const attribute_spec *spec)
460 const attribute_spec::exclusions *excl = spec->exclude;
462 tree_code code = TREE_CODE (node);
464 if ((code == FUNCTION_DECL && !excl->function
465 && (!excl->type || !spec->affects_type_identity))
466 || (code == VAR_DECL && !excl->variable
467 && (!excl->type || !spec->affects_type_identity))
468 || (((code == TYPE_DECL || RECORD_OR_UNION_TYPE_P (node)) && !excl->type)))
469 return false;
471 /* True if an attribute that's mutually exclusive with ATTRNAME
472 has been found. */
473 bool found = false;
475 if (last_decl && last_decl != node && TREE_TYPE (last_decl) != node)
477 /* Check both the last DECL and its type for conflicts with
478 the attribute being added to the current decl or type. */
479 found |= diag_attr_exclusions (last_decl, last_decl, attrname, spec);
480 tree decl_type = TREE_TYPE (last_decl);
481 found |= diag_attr_exclusions (last_decl, decl_type, attrname, spec);
484 /* NODE is either the current DECL to which the attribute is being
485 applied or its TYPE. For the former, consider the attributes on
486 both the DECL and its type. */
487 tree attrs[2];
489 if (DECL_P (node))
491 attrs[0] = DECL_ATTRIBUTES (node);
492 attrs[1] = TYPE_ATTRIBUTES (TREE_TYPE (node));
494 else
496 attrs[0] = TYPE_ATTRIBUTES (node);
497 attrs[1] = NULL_TREE;
500 /* Iterate over the mutually exclusive attribute names and verify
501 that the symbol doesn't contain it. */
502 for (unsigned i = 0; i != sizeof attrs / sizeof *attrs; ++i)
504 if (!attrs[i])
505 continue;
507 for ( ; excl->name; ++excl)
509 /* Avoid checking the attribute against itself. */
510 if (is_attribute_p (excl->name, attrname))
511 continue;
513 if (!lookup_attribute (excl->name, attrs[i]))
514 continue;
516 /* An exclusion may apply either to a function declaration,
517 type declaration, or a field/variable declaration, or
518 any subset of the three. */
519 if (TREE_CODE (node) == FUNCTION_DECL
520 && !excl->function)
521 continue;
523 if (TREE_CODE (node) == TYPE_DECL
524 && !excl->type)
525 continue;
527 if ((TREE_CODE (node) == FIELD_DECL
528 || TREE_CODE (node) == VAR_DECL)
529 && !excl->variable)
530 continue;
532 found = true;
534 /* Print a note? */
535 bool note = last_decl != NULL_TREE;
536 auto_diagnostic_group d;
537 if (TREE_CODE (node) == FUNCTION_DECL
538 && fndecl_built_in_p (node))
539 note &= warning (OPT_Wattributes,
540 "ignoring attribute %qE in declaration of "
541 "a built-in function %qD because it conflicts "
542 "with attribute %qs",
543 attrname, node, excl->name);
544 else
545 note &= warning (OPT_Wattributes,
546 "ignoring attribute %qE because "
547 "it conflicts with attribute %qs",
548 attrname, excl->name);
550 if (note)
551 inform (DECL_SOURCE_LOCATION (last_decl),
552 "previous declaration here");
556 return found;
559 /* Return true iff we should not complain about unknown attributes
560 coming from the attribute namespace NS. This is the case for
561 the -Wno-attributes=ns:: command-line option. */
563 static bool
564 attr_namespace_ignored_p (tree ns)
566 if (ns == NULL_TREE)
567 return false;
568 scoped_attributes *r = find_attribute_namespace (IDENTIFIER_POINTER (ns));
569 return r && r->ignored_p;
572 /* Return true if the attribute ATTR should not be warned about. */
574 bool
575 attribute_ignored_p (tree attr)
577 if (!cxx11_attribute_p (attr))
578 return false;
579 if (tree ns = get_attribute_namespace (attr))
581 if (attr_namespace_ignored_p (ns))
582 return true;
583 const attribute_spec *as = lookup_attribute_spec (TREE_PURPOSE (attr));
584 if (as && as->max_length == -2)
585 return true;
587 return false;
590 /* Like above, but takes an attribute_spec AS, which must be nonnull. */
592 bool
593 attribute_ignored_p (const attribute_spec *const as)
595 return as->max_length == -2;
598 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
599 which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
600 it should be modified in place; if a TYPE, a copy should be created
601 unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS. FLAGS gives further
602 information, in the form of a bitwise OR of flags in enum attribute_flags
603 from tree.h. Depending on these flags, some attributes may be
604 returned to be applied at a later stage (for example, to apply
605 a decl attribute to the declaration rather than to its type). */
607 tree
608 decl_attributes (tree *node, tree attributes, int flags,
609 tree last_decl /* = NULL_TREE */)
611 tree returned_attrs = NULL_TREE;
613 if (TREE_TYPE (*node) == error_mark_node || attributes == error_mark_node)
614 return NULL_TREE;
616 if (!attributes_initialized)
617 init_attributes ();
619 /* If this is a function and the user used #pragma GCC optimize, add the
620 options to the attribute((optimize(...))) list. */
621 if (TREE_CODE (*node) == FUNCTION_DECL && current_optimize_pragma)
623 tree cur_attr = lookup_attribute ("optimize", attributes);
624 tree opts = copy_list (current_optimize_pragma);
626 if (! cur_attr)
627 attributes
628 = tree_cons (get_identifier ("optimize"), opts, attributes);
629 else
630 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
633 if (TREE_CODE (*node) == FUNCTION_DECL
634 && (optimization_current_node != optimization_default_node
635 || target_option_current_node != target_option_default_node)
636 && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
638 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
639 tree cur_tree
640 = build_target_option_node (&global_options, &global_options_set);
641 tree old_tree = DECL_FUNCTION_SPECIFIC_TARGET (*node);
642 if (!old_tree)
643 old_tree = target_option_default_node;
644 /* The changes on optimization options can cause the changes in
645 target options, update it accordingly if it's changed. */
646 if (old_tree != cur_tree)
647 DECL_FUNCTION_SPECIFIC_TARGET (*node) = cur_tree;
650 /* If this is a function and the user used #pragma GCC target, add the
651 options to the attribute((target(...))) list. */
652 if (TREE_CODE (*node) == FUNCTION_DECL
653 && current_target_pragma
654 && targetm.target_option.valid_attribute_p (*node, NULL_TREE,
655 current_target_pragma, 0))
657 tree cur_attr = lookup_attribute ("target", attributes);
658 tree opts = copy_list (current_target_pragma);
660 if (! cur_attr)
661 attributes = tree_cons (get_identifier ("target"), opts, attributes);
662 else
663 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
666 /* A "naked" function attribute implies "noinline" and "noclone" for
667 those targets that support it. */
668 if (TREE_CODE (*node) == FUNCTION_DECL
669 && attributes
670 && lookup_attribute ("naked", attributes) != NULL
671 && lookup_attribute_spec (get_identifier ("naked"))
672 && lookup_attribute ("noipa", attributes) == NULL)
673 attributes = tree_cons (get_identifier ("noipa"), NULL, attributes);
675 /* A "noipa" function attribute implies "noinline", "noclone" and "no_icf"
676 for those targets that support it. */
677 if (TREE_CODE (*node) == FUNCTION_DECL
678 && attributes
679 && lookup_attribute ("noipa", attributes) != NULL
680 && lookup_attribute_spec (get_identifier ("noipa")))
682 if (lookup_attribute ("noinline", attributes) == NULL)
683 attributes = tree_cons (get_identifier ("noinline"), NULL, attributes);
685 if (lookup_attribute ("noclone", attributes) == NULL)
686 attributes = tree_cons (get_identifier ("noclone"), NULL, attributes);
688 if (lookup_attribute ("no_icf", attributes) == NULL)
689 attributes = tree_cons (get_identifier ("no_icf"), NULL, attributes);
692 targetm.insert_attributes (*node, &attributes);
694 /* Note that attributes on the same declaration are not necessarily
695 in the same order as in the source. */
696 for (tree attr = attributes; attr; attr = TREE_CHAIN (attr))
698 tree ns = get_attribute_namespace (attr);
699 tree name = get_attribute_name (attr);
700 tree args = TREE_VALUE (attr);
701 tree *anode = node;
702 const struct attribute_spec *spec
703 = lookup_scoped_attribute_spec (ns, name);
704 int fn_ptr_quals = 0;
705 tree fn_ptr_tmp = NULL_TREE;
706 const bool cxx11_attr_p = cxx11_attribute_p (attr);
708 if (spec == NULL)
710 if (!(flags & (int) ATTR_FLAG_BUILT_IN)
711 && !attr_namespace_ignored_p (ns))
713 if (ns == NULL_TREE || !cxx11_attr_p)
714 warning (OPT_Wattributes, "%qE attribute directive ignored",
715 name);
716 else
717 warning (OPT_Wattributes,
718 "%<%E::%E%> scoped attribute directive ignored",
719 ns, name);
721 continue;
723 else
725 int nargs = list_length (args);
726 if (nargs < spec->min_length
727 || (spec->max_length >= 0
728 && nargs > spec->max_length))
730 error ("wrong number of arguments specified for %qE attribute",
731 name);
732 if (spec->max_length < 0)
733 inform (input_location, "expected %i or more, found %i",
734 spec->min_length, nargs);
735 else
736 inform (input_location, "expected between %i and %i, found %i",
737 spec->min_length, spec->max_length, nargs);
738 continue;
741 gcc_assert (is_attribute_p (spec->name, name));
743 if (spec->decl_required && !DECL_P (*anode))
745 if (flags & ((int) ATTR_FLAG_DECL_NEXT
746 | (int) ATTR_FLAG_FUNCTION_NEXT
747 | (int) ATTR_FLAG_ARRAY_NEXT))
749 /* Pass on this attribute to be tried again. */
750 tree attr = tree_cons (name, args, NULL_TREE);
751 returned_attrs = chainon (returned_attrs, attr);
752 continue;
754 else
756 warning (OPT_Wattributes, "%qE attribute does not apply to types",
757 name);
758 continue;
762 /* If we require a type, but were passed a decl, set up to make a
763 new type and update the one in the decl. ATTR_FLAG_TYPE_IN_PLACE
764 would have applied if we'd been passed a type, but we cannot modify
765 the decl's type in place here. */
766 if (spec->type_required && DECL_P (*anode))
768 anode = &TREE_TYPE (*anode);
769 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
772 if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
773 && TREE_CODE (*anode) != METHOD_TYPE)
775 if (TREE_CODE (*anode) == POINTER_TYPE
776 && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
777 || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
779 /* OK, this is a bit convoluted. We can't just make a copy
780 of the pointer type and modify its TREE_TYPE, because if
781 we change the attributes of the target type the pointer
782 type needs to have a different TYPE_MAIN_VARIANT. So we
783 pull out the target type now, frob it as appropriate, and
784 rebuild the pointer type later.
786 This would all be simpler if attributes were part of the
787 declarator, grumble grumble. */
788 fn_ptr_tmp = TREE_TYPE (*anode);
789 fn_ptr_quals = TYPE_QUALS (*anode);
790 anode = &fn_ptr_tmp;
791 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
793 else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
795 /* Pass on this attribute to be tried again. */
796 tree attr = tree_cons (name, args, NULL_TREE);
797 returned_attrs = chainon (returned_attrs, attr);
798 continue;
801 if (TREE_CODE (*anode) != FUNCTION_TYPE
802 && TREE_CODE (*anode) != METHOD_TYPE)
804 warning (OPT_Wattributes,
805 "%qE attribute only applies to function types",
806 name);
807 continue;
811 if (TYPE_P (*anode)
812 && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
813 && TYPE_SIZE (*anode) != NULL_TREE)
815 warning (OPT_Wattributes, "type attributes ignored after type is already defined");
816 continue;
819 bool no_add_attrs = false;
821 /* Check for exclusions with other attributes on the current
822 declation as well as the last declaration of the same
823 symbol already processed (if one exists). Detect and
824 reject incompatible attributes. */
825 bool built_in = flags & ATTR_FLAG_BUILT_IN;
826 if (spec->exclude
827 && (flag_checking || !built_in)
828 && !error_operand_p (last_decl))
830 /* Always check attributes on user-defined functions.
831 Check them on built-ins only when -fchecking is set.
832 Ignore __builtin_unreachable -- it's both const and
833 noreturn. */
835 if (!built_in
836 || !DECL_P (*anode)
837 || DECL_BUILT_IN_CLASS (*anode) != BUILT_IN_NORMAL
838 || (DECL_FUNCTION_CODE (*anode) != BUILT_IN_UNREACHABLE
839 && (DECL_FUNCTION_CODE (*anode)
840 != BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE)))
842 bool no_add = diag_attr_exclusions (last_decl, *anode, name, spec);
843 if (!no_add && anode != node)
844 no_add = diag_attr_exclusions (last_decl, *node, name, spec);
845 no_add_attrs |= no_add;
849 if (no_add_attrs)
850 continue;
852 if (spec->handler != NULL)
854 int cxx11_flag = (cxx11_attr_p ? ATTR_FLAG_CXX11 : 0);
856 /* Pass in an array of the current declaration followed
857 by the last pushed/merged declaration if one exists.
858 For calls that modify the type attributes of a DECL
859 and for which *ANODE is *NODE's type, also pass in
860 the DECL as the third element to use in diagnostics.
861 If the handler changes CUR_AND_LAST_DECL[0] replace
862 *ANODE with its value. */
863 tree cur_and_last_decl[3] = { *anode, last_decl };
864 if (anode != node && DECL_P (*node))
865 cur_and_last_decl[2] = *node;
867 tree ret = (spec->handler) (cur_and_last_decl, name, args,
868 flags|cxx11_flag, &no_add_attrs);
870 *anode = cur_and_last_decl[0];
871 if (ret == error_mark_node)
873 warning (OPT_Wattributes, "%qE attribute ignored", name);
874 no_add_attrs = true;
876 else
877 returned_attrs = chainon (ret, returned_attrs);
880 /* Layout the decl in case anything changed. */
881 if (spec->type_required && DECL_P (*node)
882 && (VAR_P (*node)
883 || TREE_CODE (*node) == PARM_DECL
884 || TREE_CODE (*node) == RESULT_DECL))
885 relayout_decl (*node);
887 if (!no_add_attrs)
889 tree old_attrs;
890 tree a;
892 if (DECL_P (*anode))
893 old_attrs = DECL_ATTRIBUTES (*anode);
894 else
895 old_attrs = TYPE_ATTRIBUTES (*anode);
897 for (a = lookup_attribute (spec->name, old_attrs);
898 a != NULL_TREE;
899 a = lookup_attribute (spec->name, TREE_CHAIN (a)))
901 if (simple_cst_equal (TREE_VALUE (a), args) == 1)
902 break;
905 if (a == NULL_TREE)
907 /* This attribute isn't already in the list. */
908 tree r;
909 /* Preserve the C++11 form. */
910 if (cxx11_attr_p)
911 r = tree_cons (build_tree_list (ns, name), args, old_attrs);
912 else
913 r = tree_cons (name, args, old_attrs);
915 if (DECL_P (*anode))
916 DECL_ATTRIBUTES (*anode) = r;
917 else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
919 TYPE_ATTRIBUTES (*anode) = r;
920 /* If this is the main variant, also push the attributes
921 out to the other variants. */
922 if (*anode == TYPE_MAIN_VARIANT (*anode))
924 for (tree variant = *anode; variant;
925 variant = TYPE_NEXT_VARIANT (variant))
927 if (TYPE_ATTRIBUTES (variant) == old_attrs)
928 TYPE_ATTRIBUTES (variant)
929 = TYPE_ATTRIBUTES (*anode);
930 else if (!lookup_attribute
931 (spec->name, TYPE_ATTRIBUTES (variant)))
932 TYPE_ATTRIBUTES (variant) = tree_cons
933 (name, args, TYPE_ATTRIBUTES (variant));
937 else
938 *anode = build_type_attribute_variant (*anode, r);
942 if (fn_ptr_tmp)
944 /* Rebuild the function pointer type and put it in the
945 appropriate place. */
946 fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
947 if (fn_ptr_quals)
948 fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals);
949 if (DECL_P (*node))
950 TREE_TYPE (*node) = fn_ptr_tmp;
951 else
953 gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
954 *node = fn_ptr_tmp;
959 return returned_attrs;
962 /* Return TRUE iff ATTR has been parsed by the front-end as a C++-11
963 attribute.
965 When G++ parses a C++11 attribute, it is represented as
966 a TREE_LIST which TREE_PURPOSE is itself a TREE_LIST. TREE_PURPOSE
967 (TREE_PURPOSE (ATTR)) is the namespace of the attribute, and the
968 TREE_VALUE (TREE_PURPOSE (ATTR)) is its non-qualified name. Please
969 use get_attribute_namespace and get_attribute_name to retrieve the
970 namespace and name of the attribute, as these accessors work with
971 GNU attributes as well. */
973 bool
974 cxx11_attribute_p (const_tree attr)
976 if (attr == NULL_TREE
977 || TREE_CODE (attr) != TREE_LIST)
978 return false;
980 return (TREE_CODE (TREE_PURPOSE (attr)) == TREE_LIST);
983 /* Return the name of the attribute ATTR. This accessor works on GNU
984 and C++11 (scoped) attributes.
986 Please read the comments of cxx11_attribute_p to understand the
987 format of attributes. */
989 tree
990 get_attribute_name (const_tree attr)
992 if (cxx11_attribute_p (attr))
993 return TREE_VALUE (TREE_PURPOSE (attr));
994 return TREE_PURPOSE (attr);
997 /* Subroutine of set_method_tm_attributes. Apply TM attribute ATTR
998 to the method FNDECL. */
1000 void
1001 apply_tm_attr (tree fndecl, tree attr)
1003 decl_attributes (&TREE_TYPE (fndecl), tree_cons (attr, NULL, NULL), 0);
1006 /* Makes a function attribute of the form NAME(ARG_NAME) and chains
1007 it to CHAIN. */
1009 tree
1010 make_attribute (const char *name, const char *arg_name, tree chain)
1012 tree attr_name;
1013 tree attr_arg_name;
1014 tree attr_args;
1015 tree attr;
1017 attr_name = get_identifier (name);
1018 attr_arg_name = build_string (strlen (arg_name), arg_name);
1019 attr_args = tree_cons (NULL_TREE, attr_arg_name, NULL_TREE);
1020 attr = tree_cons (attr_name, attr_args, chain);
1021 return attr;
1025 /* Common functions used for target clone support. */
1027 /* Comparator function to be used in qsort routine to sort attribute
1028 specification strings to "target". */
1030 static int
1031 attr_strcmp (const void *v1, const void *v2)
1033 const char *c1 = *(char *const*)v1;
1034 const char *c2 = *(char *const*)v2;
1035 return strcmp (c1, c2);
1038 /* ARGLIST is the argument to target attribute. This function tokenizes
1039 the comma separated arguments, sorts them and returns a string which
1040 is a unique identifier for the comma separated arguments. It also
1041 replaces non-identifier characters "=,-" with "_". */
1043 char *
1044 sorted_attr_string (tree arglist)
1046 tree arg;
1047 size_t str_len_sum = 0;
1048 char **args = NULL;
1049 char *attr_str, *ret_str;
1050 char *attr = NULL;
1051 unsigned int argnum = 1;
1052 unsigned int i;
1054 for (arg = arglist; arg; arg = TREE_CHAIN (arg))
1056 const char *str = TREE_STRING_POINTER (TREE_VALUE (arg));
1057 size_t len = strlen (str);
1058 str_len_sum += len + 1;
1059 if (arg != arglist)
1060 argnum++;
1061 for (i = 0; i < strlen (str); i++)
1062 if (str[i] == ',')
1063 argnum++;
1066 attr_str = XNEWVEC (char, str_len_sum);
1067 str_len_sum = 0;
1068 for (arg = arglist; arg; arg = TREE_CHAIN (arg))
1070 const char *str = TREE_STRING_POINTER (TREE_VALUE (arg));
1071 size_t len = strlen (str);
1072 memcpy (attr_str + str_len_sum, str, len);
1073 attr_str[str_len_sum + len] = TREE_CHAIN (arg) ? ',' : '\0';
1074 str_len_sum += len + 1;
1077 /* Replace "=,-" with "_". */
1078 for (i = 0; i < strlen (attr_str); i++)
1079 if (attr_str[i] == '=' || attr_str[i]== '-')
1080 attr_str[i] = '_';
1082 if (argnum == 1)
1083 return attr_str;
1085 args = XNEWVEC (char *, argnum);
1087 i = 0;
1088 attr = strtok (attr_str, ",");
1089 while (attr != NULL)
1091 args[i] = attr;
1092 i++;
1093 attr = strtok (NULL, ",");
1096 qsort (args, argnum, sizeof (char *), attr_strcmp);
1098 ret_str = XNEWVEC (char, str_len_sum);
1099 str_len_sum = 0;
1100 for (i = 0; i < argnum; i++)
1102 size_t len = strlen (args[i]);
1103 memcpy (ret_str + str_len_sum, args[i], len);
1104 ret_str[str_len_sum + len] = i < argnum - 1 ? '_' : '\0';
1105 str_len_sum += len + 1;
1108 XDELETEVEC (args);
1109 XDELETEVEC (attr_str);
1110 return ret_str;
1114 /* This function returns true if FN1 and FN2 are versions of the same function,
1115 that is, the target strings of the function decls are different. This assumes
1116 that FN1 and FN2 have the same signature. */
1118 bool
1119 common_function_versions (tree fn1, tree fn2)
1121 tree attr1, attr2;
1122 char *target1, *target2;
1123 bool result;
1125 if (TREE_CODE (fn1) != FUNCTION_DECL
1126 || TREE_CODE (fn2) != FUNCTION_DECL)
1127 return false;
1129 attr1 = lookup_attribute ("target", DECL_ATTRIBUTES (fn1));
1130 attr2 = lookup_attribute ("target", DECL_ATTRIBUTES (fn2));
1132 /* At least one function decl should have the target attribute specified. */
1133 if (attr1 == NULL_TREE && attr2 == NULL_TREE)
1134 return false;
1136 /* Diagnose missing target attribute if one of the decls is already
1137 multi-versioned. */
1138 if (attr1 == NULL_TREE || attr2 == NULL_TREE)
1140 if (DECL_FUNCTION_VERSIONED (fn1) || DECL_FUNCTION_VERSIONED (fn2))
1142 if (attr2 != NULL_TREE)
1144 std::swap (fn1, fn2);
1145 attr1 = attr2;
1147 error_at (DECL_SOURCE_LOCATION (fn2),
1148 "missing %<target%> attribute for multi-versioned %qD",
1149 fn2);
1150 inform (DECL_SOURCE_LOCATION (fn1),
1151 "previous declaration of %qD", fn1);
1152 /* Prevent diagnosing of the same error multiple times. */
1153 DECL_ATTRIBUTES (fn2)
1154 = tree_cons (get_identifier ("target"),
1155 copy_node (TREE_VALUE (attr1)),
1156 DECL_ATTRIBUTES (fn2));
1158 return false;
1161 target1 = sorted_attr_string (TREE_VALUE (attr1));
1162 target2 = sorted_attr_string (TREE_VALUE (attr2));
1164 /* The sorted target strings must be different for fn1 and fn2
1165 to be versions. */
1166 if (strcmp (target1, target2) == 0)
1167 result = false;
1168 else
1169 result = true;
1171 XDELETEVEC (target1);
1172 XDELETEVEC (target2);
1174 return result;
1177 /* Make a dispatcher declaration for the multi-versioned function DECL.
1178 Calls to DECL function will be replaced with calls to the dispatcher
1179 by the front-end. Return the decl created. */
1181 tree
1182 make_dispatcher_decl (const tree decl)
1184 tree func_decl;
1185 char *func_name;
1186 tree fn_type, func_type;
1188 func_name = xstrdup (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
1190 fn_type = TREE_TYPE (decl);
1191 func_type = build_function_type (TREE_TYPE (fn_type),
1192 TYPE_ARG_TYPES (fn_type));
1194 func_decl = build_fn_decl (func_name, func_type);
1195 XDELETEVEC (func_name);
1196 TREE_USED (func_decl) = 1;
1197 DECL_CONTEXT (func_decl) = NULL_TREE;
1198 DECL_INITIAL (func_decl) = error_mark_node;
1199 DECL_ARTIFICIAL (func_decl) = 1;
1200 /* Mark this func as external, the resolver will flip it again if
1201 it gets generated. */
1202 DECL_EXTERNAL (func_decl) = 1;
1203 /* This will be of type IFUNCs have to be externally visible. */
1204 TREE_PUBLIC (func_decl) = 1;
1206 return func_decl;
1209 /* Returns true if decl is multi-versioned and DECL is the default function,
1210 that is it is not tagged with target specific optimization. */
1212 bool
1213 is_function_default_version (const tree decl)
1215 if (TREE_CODE (decl) != FUNCTION_DECL
1216 || !DECL_FUNCTION_VERSIONED (decl))
1217 return false;
1218 tree attr = lookup_attribute ("target", DECL_ATTRIBUTES (decl));
1219 gcc_assert (attr);
1220 attr = TREE_VALUE (TREE_VALUE (attr));
1221 return (TREE_CODE (attr) == STRING_CST
1222 && strcmp (TREE_STRING_POINTER (attr), "default") == 0);
1225 /* Return a declaration like DDECL except that its DECL_ATTRIBUTES
1226 is ATTRIBUTE. */
1228 tree
1229 build_decl_attribute_variant (tree ddecl, tree attribute)
1231 DECL_ATTRIBUTES (ddecl) = attribute;
1232 return ddecl;
1235 /* Return a type like TTYPE except that its TYPE_ATTRIBUTE
1236 is ATTRIBUTE and its qualifiers are QUALS.
1238 Record such modified types already made so we don't make duplicates. */
1240 tree
1241 build_type_attribute_qual_variant (tree otype, tree attribute, int quals)
1243 tree ttype = otype;
1244 if (! attribute_list_equal (TYPE_ATTRIBUTES (ttype), attribute))
1246 tree ntype;
1248 /* Building a distinct copy of a tagged type is inappropriate; it
1249 causes breakage in code that expects there to be a one-to-one
1250 relationship between a struct and its fields.
1251 build_duplicate_type is another solution (as used in
1252 handle_transparent_union_attribute), but that doesn't play well
1253 with the stronger C++ type identity model. */
1254 if (TREE_CODE (ttype) == RECORD_TYPE
1255 || TREE_CODE (ttype) == UNION_TYPE
1256 || TREE_CODE (ttype) == QUAL_UNION_TYPE
1257 || TREE_CODE (ttype) == ENUMERAL_TYPE)
1259 warning (OPT_Wattributes,
1260 "ignoring attributes applied to %qT after definition",
1261 TYPE_MAIN_VARIANT (ttype));
1262 return build_qualified_type (ttype, quals);
1265 ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
1266 if (lang_hooks.types.copy_lang_qualifiers
1267 && otype != TYPE_MAIN_VARIANT (otype))
1268 ttype = (lang_hooks.types.copy_lang_qualifiers
1269 (ttype, TYPE_MAIN_VARIANT (otype)));
1271 tree dtype = ntype = build_distinct_type_copy (ttype);
1273 TYPE_ATTRIBUTES (ntype) = attribute;
1275 hashval_t hash = type_hash_canon_hash (ntype);
1276 ntype = type_hash_canon (hash, ntype);
1278 if (ntype != dtype)
1279 /* This variant was already in the hash table, don't mess with
1280 TYPE_CANONICAL. */;
1281 else if (TYPE_STRUCTURAL_EQUALITY_P (ttype)
1282 || !comp_type_attributes (ntype, ttype))
1283 /* If the target-dependent attributes make NTYPE different from
1284 its canonical type, we will need to use structural equality
1285 checks for this type.
1287 We shouldn't get here for stripping attributes from a type;
1288 the no-attribute type might not need structural comparison. But
1289 we can if was discarded from type_hash_table. */
1290 SET_TYPE_STRUCTURAL_EQUALITY (ntype);
1291 else if (TYPE_CANONICAL (ntype) == ntype)
1292 TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
1294 ttype = build_qualified_type (ntype, quals);
1295 if (lang_hooks.types.copy_lang_qualifiers
1296 && otype != TYPE_MAIN_VARIANT (otype))
1297 ttype = lang_hooks.types.copy_lang_qualifiers (ttype, otype);
1299 else if (TYPE_QUALS (ttype) != quals)
1300 ttype = build_qualified_type (ttype, quals);
1302 return ttype;
1305 /* Compare two identifier nodes representing attributes.
1306 Return true if they are the same, false otherwise. */
1308 static bool
1309 cmp_attrib_identifiers (const_tree attr1, const_tree attr2)
1311 /* Make sure we're dealing with IDENTIFIER_NODEs. */
1312 gcc_checking_assert (TREE_CODE (attr1) == IDENTIFIER_NODE
1313 && TREE_CODE (attr2) == IDENTIFIER_NODE);
1315 /* Identifiers can be compared directly for equality. */
1316 if (attr1 == attr2)
1317 return true;
1319 return cmp_attribs (IDENTIFIER_POINTER (attr1), IDENTIFIER_LENGTH (attr1),
1320 IDENTIFIER_POINTER (attr2), IDENTIFIER_LENGTH (attr2));
1323 /* Compare two constructor-element-type constants. Return 1 if the lists
1324 are known to be equal; otherwise return 0. */
1326 bool
1327 simple_cst_list_equal (const_tree l1, const_tree l2)
1329 while (l1 != NULL_TREE && l2 != NULL_TREE)
1331 if (simple_cst_equal (TREE_VALUE (l1), TREE_VALUE (l2)) != 1)
1332 return false;
1334 l1 = TREE_CHAIN (l1);
1335 l2 = TREE_CHAIN (l2);
1338 return l1 == l2;
1341 /* Check if "omp declare simd" attribute arguments, CLAUSES1 and CLAUSES2, are
1342 the same. */
1344 static bool
1345 omp_declare_simd_clauses_equal (tree clauses1, tree clauses2)
1347 tree cl1, cl2;
1348 for (cl1 = clauses1, cl2 = clauses2;
1349 cl1 && cl2;
1350 cl1 = OMP_CLAUSE_CHAIN (cl1), cl2 = OMP_CLAUSE_CHAIN (cl2))
1352 if (OMP_CLAUSE_CODE (cl1) != OMP_CLAUSE_CODE (cl2))
1353 return false;
1354 if (OMP_CLAUSE_CODE (cl1) != OMP_CLAUSE_SIMDLEN)
1356 if (simple_cst_equal (OMP_CLAUSE_DECL (cl1),
1357 OMP_CLAUSE_DECL (cl2)) != 1)
1358 return false;
1360 switch (OMP_CLAUSE_CODE (cl1))
1362 case OMP_CLAUSE_ALIGNED:
1363 if (simple_cst_equal (OMP_CLAUSE_ALIGNED_ALIGNMENT (cl1),
1364 OMP_CLAUSE_ALIGNED_ALIGNMENT (cl2)) != 1)
1365 return false;
1366 break;
1367 case OMP_CLAUSE_LINEAR:
1368 if (simple_cst_equal (OMP_CLAUSE_LINEAR_STEP (cl1),
1369 OMP_CLAUSE_LINEAR_STEP (cl2)) != 1)
1370 return false;
1371 break;
1372 case OMP_CLAUSE_SIMDLEN:
1373 if (simple_cst_equal (OMP_CLAUSE_SIMDLEN_EXPR (cl1),
1374 OMP_CLAUSE_SIMDLEN_EXPR (cl2)) != 1)
1375 return false;
1376 default:
1377 break;
1380 return true;
1384 /* Compare two attributes for their value identity. Return true if the
1385 attribute values are known to be equal; otherwise return false. */
1387 bool
1388 attribute_value_equal (const_tree attr1, const_tree attr2)
1390 if (TREE_VALUE (attr1) == TREE_VALUE (attr2))
1391 return true;
1393 if (TREE_VALUE (attr1) != NULL_TREE
1394 && TREE_CODE (TREE_VALUE (attr1)) == TREE_LIST
1395 && TREE_VALUE (attr2) != NULL_TREE
1396 && TREE_CODE (TREE_VALUE (attr2)) == TREE_LIST)
1398 /* Handle attribute format. */
1399 if (is_attribute_p ("format", get_attribute_name (attr1)))
1401 attr1 = TREE_VALUE (attr1);
1402 attr2 = TREE_VALUE (attr2);
1403 /* Compare the archetypes (printf/scanf/strftime/...). */
1404 if (!cmp_attrib_identifiers (TREE_VALUE (attr1), TREE_VALUE (attr2)))
1405 return false;
1406 /* Archetypes are the same. Compare the rest. */
1407 return (simple_cst_list_equal (TREE_CHAIN (attr1),
1408 TREE_CHAIN (attr2)) == 1);
1410 return (simple_cst_list_equal (TREE_VALUE (attr1),
1411 TREE_VALUE (attr2)) == 1);
1414 if (TREE_VALUE (attr1)
1415 && TREE_CODE (TREE_VALUE (attr1)) == OMP_CLAUSE
1416 && TREE_VALUE (attr2)
1417 && TREE_CODE (TREE_VALUE (attr2)) == OMP_CLAUSE)
1418 return omp_declare_simd_clauses_equal (TREE_VALUE (attr1),
1419 TREE_VALUE (attr2));
1421 return (simple_cst_equal (TREE_VALUE (attr1), TREE_VALUE (attr2)) == 1);
1424 /* Return 0 if the attributes for two types are incompatible, 1 if they
1425 are compatible, and 2 if they are nearly compatible (which causes a
1426 warning to be generated). */
1428 comp_type_attributes (const_tree type1, const_tree type2)
1430 const_tree a1 = TYPE_ATTRIBUTES (type1);
1431 const_tree a2 = TYPE_ATTRIBUTES (type2);
1432 const_tree a;
1434 if (a1 == a2)
1435 return 1;
1436 for (a = a1; a != NULL_TREE; a = TREE_CHAIN (a))
1438 const struct attribute_spec *as;
1439 const_tree attr;
1441 as = lookup_attribute_spec (get_attribute_name (a));
1442 if (!as || as->affects_type_identity == false)
1443 continue;
1445 attr = lookup_attribute (as->name, CONST_CAST_TREE (a2));
1446 if (!attr || !attribute_value_equal (a, attr))
1447 break;
1449 if (!a)
1451 for (a = a2; a != NULL_TREE; a = TREE_CHAIN (a))
1453 const struct attribute_spec *as;
1455 as = lookup_attribute_spec (get_attribute_name (a));
1456 if (!as || as->affects_type_identity == false)
1457 continue;
1459 if (!lookup_attribute (as->name, CONST_CAST_TREE (a1)))
1460 break;
1461 /* We don't need to compare trees again, as we did this
1462 already in first loop. */
1464 /* All types - affecting identity - are equal, so
1465 there is no need to call target hook for comparison. */
1466 if (!a)
1467 return 1;
1469 if (lookup_attribute ("transaction_safe", CONST_CAST_TREE (a)))
1470 return 0;
1471 if ((lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type1)) != NULL)
1472 ^ (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type2)) != NULL))
1473 return 0;
1474 /* As some type combinations - like default calling-convention - might
1475 be compatible, we have to call the target hook to get the final result. */
1476 return targetm.comp_type_attributes (type1, type2);
1479 /* PREDICATE acts as a function of type:
1481 (const_tree attr, const attribute_spec *as) -> bool
1483 where ATTR is an attribute and AS is its possibly-null specification.
1484 Return a list of every attribute in attribute list ATTRS for which
1485 PREDICATE is true. Return ATTRS itself if PREDICATE returns true
1486 for every attribute. */
1488 template<typename Predicate>
1489 tree
1490 remove_attributes_matching (tree attrs, Predicate predicate)
1492 tree new_attrs = NULL_TREE;
1493 tree *ptr = &new_attrs;
1494 const_tree start = attrs;
1495 for (const_tree attr = attrs; attr; attr = TREE_CHAIN (attr))
1497 tree name = get_attribute_name (attr);
1498 const attribute_spec *as = lookup_attribute_spec (name);
1499 const_tree end;
1500 if (!predicate (attr, as))
1501 end = attr;
1502 else if (start == attrs)
1503 continue;
1504 else
1505 end = TREE_CHAIN (attr);
1507 for (; start != end; start = TREE_CHAIN (start))
1509 *ptr = tree_cons (TREE_PURPOSE (start),
1510 TREE_VALUE (start), NULL_TREE);
1511 TREE_CHAIN (*ptr) = NULL_TREE;
1512 ptr = &TREE_CHAIN (*ptr);
1514 start = TREE_CHAIN (attr);
1516 gcc_assert (!start || start == attrs);
1517 return start ? attrs : new_attrs;
1520 /* If VALUE is true, return the subset of ATTRS that affect type identity,
1521 otherwise return the subset of ATTRS that don't affect type identity. */
1523 tree
1524 affects_type_identity_attributes (tree attrs, bool value)
1526 auto predicate = [value](const_tree, const attribute_spec *as) -> bool
1528 return bool (as && as->affects_type_identity) == value;
1530 return remove_attributes_matching (attrs, predicate);
1533 /* Remove attributes that affect type identity from ATTRS unless the
1534 same attributes occur in OK_ATTRS. */
1536 tree
1537 restrict_type_identity_attributes_to (tree attrs, tree ok_attrs)
1539 auto predicate = [ok_attrs](const_tree attr,
1540 const attribute_spec *as) -> bool
1542 if (!as || !as->affects_type_identity)
1543 return true;
1545 for (tree ok_attr = lookup_attribute (as->name, ok_attrs);
1546 ok_attr;
1547 ok_attr = lookup_attribute (as->name, TREE_CHAIN (ok_attr)))
1548 if (simple_cst_equal (TREE_VALUE (ok_attr), TREE_VALUE (attr)) == 1)
1549 return true;
1551 return false;
1553 return remove_attributes_matching (attrs, predicate);
1556 /* Return a type like TTYPE except that its TYPE_ATTRIBUTE
1557 is ATTRIBUTE.
1559 Record such modified types already made so we don't make duplicates. */
1561 tree
1562 build_type_attribute_variant (tree ttype, tree attribute)
1564 return build_type_attribute_qual_variant (ttype, attribute,
1565 TYPE_QUALS (ttype));
1568 /* A variant of lookup_attribute() that can be used with an identifier
1569 as the first argument, and where the identifier can be either
1570 'text' or '__text__'.
1572 Given an attribute ATTR_IDENTIFIER, and a list of attributes LIST,
1573 return a pointer to the attribute's list element if the attribute
1574 is part of the list, or NULL_TREE if not found. If the attribute
1575 appears more than once, this only returns the first occurrence; the
1576 TREE_CHAIN of the return value should be passed back in if further
1577 occurrences are wanted. ATTR_IDENTIFIER must be an identifier but
1578 can be in the form 'text' or '__text__'. */
1579 static tree
1580 lookup_ident_attribute (tree attr_identifier, tree list)
1582 gcc_checking_assert (TREE_CODE (attr_identifier) == IDENTIFIER_NODE);
1584 while (list)
1586 gcc_checking_assert (TREE_CODE (get_attribute_name (list))
1587 == IDENTIFIER_NODE);
1589 if (cmp_attrib_identifiers (attr_identifier,
1590 get_attribute_name (list)))
1591 /* Found it. */
1592 break;
1593 list = TREE_CHAIN (list);
1596 return list;
1599 /* Remove any instances of attribute ATTR_NAME in LIST and return the
1600 modified list. */
1602 tree
1603 remove_attribute (const char *attr_name, tree list)
1605 tree *p;
1606 gcc_checking_assert (attr_name[0] != '_');
1608 for (p = &list; *p;)
1610 tree l = *p;
1612 tree attr = get_attribute_name (l);
1613 if (is_attribute_p (attr_name, attr))
1614 *p = TREE_CHAIN (l);
1615 else
1616 p = &TREE_CHAIN (l);
1619 return list;
1622 /* Return an attribute list that is the union of a1 and a2. */
1624 tree
1625 merge_attributes (tree a1, tree a2)
1627 tree attributes;
1629 /* Either one unset? Take the set one. */
1631 if ((attributes = a1) == 0)
1632 attributes = a2;
1634 /* One that completely contains the other? Take it. */
1636 else if (a2 != 0 && ! attribute_list_contained (a1, a2))
1638 if (attribute_list_contained (a2, a1))
1639 attributes = a2;
1640 else
1642 /* Pick the longest list, and hang on the other list. */
1644 if (list_length (a1) < list_length (a2))
1645 attributes = a2, a2 = a1;
1647 for (; a2 != 0; a2 = TREE_CHAIN (a2))
1649 tree a;
1650 for (a = lookup_ident_attribute (get_attribute_name (a2),
1651 attributes);
1652 a != NULL_TREE && !attribute_value_equal (a, a2);
1653 a = lookup_ident_attribute (get_attribute_name (a2),
1654 TREE_CHAIN (a)))
1656 if (a == NULL_TREE)
1658 a1 = copy_node (a2);
1659 TREE_CHAIN (a1) = attributes;
1660 attributes = a1;
1665 return attributes;
1668 /* Given types T1 and T2, merge their attributes and return
1669 the result. */
1671 tree
1672 merge_type_attributes (tree t1, tree t2)
1674 return merge_attributes (TYPE_ATTRIBUTES (t1),
1675 TYPE_ATTRIBUTES (t2));
1678 /* Given decls OLDDECL and NEWDECL, merge their attributes and return
1679 the result. */
1681 tree
1682 merge_decl_attributes (tree olddecl, tree newdecl)
1684 return merge_attributes (DECL_ATTRIBUTES (olddecl),
1685 DECL_ATTRIBUTES (newdecl));
1688 /* Duplicate all attributes with name NAME in ATTR list to *ATTRS if
1689 they are missing there. */
1691 void
1692 duplicate_one_attribute (tree *attrs, tree attr, const char *name)
1694 attr = lookup_attribute (name, attr);
1695 if (!attr)
1696 return;
1697 tree a = lookup_attribute (name, *attrs);
1698 while (attr)
1700 tree a2;
1701 for (a2 = a; a2; a2 = lookup_attribute (name, TREE_CHAIN (a2)))
1702 if (attribute_value_equal (attr, a2))
1703 break;
1704 if (!a2)
1706 a2 = copy_node (attr);
1707 TREE_CHAIN (a2) = *attrs;
1708 *attrs = a2;
1710 attr = lookup_attribute (name, TREE_CHAIN (attr));
1714 /* Duplicate all attributes from user DECL to the corresponding
1715 builtin that should be propagated. */
1717 void
1718 copy_attributes_to_builtin (tree decl)
1720 tree b = builtin_decl_explicit (DECL_FUNCTION_CODE (decl));
1721 if (b)
1722 duplicate_one_attribute (&DECL_ATTRIBUTES (b),
1723 DECL_ATTRIBUTES (decl), "omp declare simd");
1726 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
1728 /* Specialization of merge_decl_attributes for various Windows targets.
1730 This handles the following situation:
1732 __declspec (dllimport) int foo;
1733 int foo;
1735 The second instance of `foo' nullifies the dllimport. */
1737 tree
1738 merge_dllimport_decl_attributes (tree old, tree new_tree)
1740 tree a;
1741 int delete_dllimport_p = 1;
1743 /* What we need to do here is remove from `old' dllimport if it doesn't
1744 appear in `new'. dllimport behaves like extern: if a declaration is
1745 marked dllimport and a definition appears later, then the object
1746 is not dllimport'd. We also remove a `new' dllimport if the old list
1747 contains dllexport: dllexport always overrides dllimport, regardless
1748 of the order of declaration. */
1749 if (!VAR_OR_FUNCTION_DECL_P (new_tree))
1750 delete_dllimport_p = 0;
1751 else if (DECL_DLLIMPORT_P (new_tree)
1752 && lookup_attribute ("dllexport", DECL_ATTRIBUTES (old)))
1754 DECL_DLLIMPORT_P (new_tree) = 0;
1755 warning (OPT_Wattributes, "%q+D already declared with dllexport "
1756 "attribute: dllimport ignored", new_tree);
1758 else if (DECL_DLLIMPORT_P (old) && !DECL_DLLIMPORT_P (new_tree))
1760 /* Warn about overriding a symbol that has already been used, e.g.:
1761 extern int __attribute__ ((dllimport)) foo;
1762 int* bar () {return &foo;}
1763 int foo;
1765 if (TREE_USED (old))
1767 warning (0, "%q+D redeclared without dllimport attribute "
1768 "after being referenced with dll linkage", new_tree);
1769 /* If we have used a variable's address with dllimport linkage,
1770 keep the old DECL_DLLIMPORT_P flag: the ADDR_EXPR using the
1771 decl may already have had TREE_CONSTANT computed.
1772 We still remove the attribute so that assembler code refers
1773 to '&foo rather than '_imp__foo'. */
1774 if (VAR_P (old) && TREE_ADDRESSABLE (old))
1775 DECL_DLLIMPORT_P (new_tree) = 1;
1778 /* Let an inline definition silently override the external reference,
1779 but otherwise warn about attribute inconsistency. */
1780 else if (VAR_P (new_tree) || !DECL_DECLARED_INLINE_P (new_tree))
1781 warning (OPT_Wattributes, "%q+D redeclared without dllimport "
1782 "attribute: previous dllimport ignored", new_tree);
1784 else
1785 delete_dllimport_p = 0;
1787 a = merge_attributes (DECL_ATTRIBUTES (old), DECL_ATTRIBUTES (new_tree));
1789 if (delete_dllimport_p)
1790 a = remove_attribute ("dllimport", a);
1792 return a;
1795 /* Handle a "dllimport" or "dllexport" attribute; arguments as in
1796 struct attribute_spec.handler. */
1798 tree
1799 handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
1800 bool *no_add_attrs)
1802 tree node = *pnode;
1803 bool is_dllimport;
1805 /* These attributes may apply to structure and union types being created,
1806 but otherwise should pass to the declaration involved. */
1807 if (!DECL_P (node))
1809 if (flags & ((int) ATTR_FLAG_DECL_NEXT | (int) ATTR_FLAG_FUNCTION_NEXT
1810 | (int) ATTR_FLAG_ARRAY_NEXT))
1812 *no_add_attrs = true;
1813 return tree_cons (name, args, NULL_TREE);
1815 if (TREE_CODE (node) == RECORD_TYPE
1816 || TREE_CODE (node) == UNION_TYPE)
1818 node = TYPE_NAME (node);
1819 if (!node)
1820 return NULL_TREE;
1822 else
1824 warning (OPT_Wattributes, "%qE attribute ignored",
1825 name);
1826 *no_add_attrs = true;
1827 return NULL_TREE;
1831 if (!VAR_OR_FUNCTION_DECL_P (node) && TREE_CODE (node) != TYPE_DECL)
1833 *no_add_attrs = true;
1834 warning (OPT_Wattributes, "%qE attribute ignored",
1835 name);
1836 return NULL_TREE;
1839 if (TREE_CODE (node) == TYPE_DECL
1840 && TREE_CODE (TREE_TYPE (node)) != RECORD_TYPE
1841 && TREE_CODE (TREE_TYPE (node)) != UNION_TYPE)
1843 *no_add_attrs = true;
1844 warning (OPT_Wattributes, "%qE attribute ignored",
1845 name);
1846 return NULL_TREE;
1849 is_dllimport = is_attribute_p ("dllimport", name);
1851 /* Report error on dllimport ambiguities seen now before they cause
1852 any damage. */
1853 if (is_dllimport)
1855 /* Honor any target-specific overrides. */
1856 if (!targetm.valid_dllimport_attribute_p (node))
1857 *no_add_attrs = true;
1859 else if (TREE_CODE (node) == FUNCTION_DECL
1860 && DECL_DECLARED_INLINE_P (node))
1862 warning (OPT_Wattributes, "inline function %q+D declared as "
1863 "dllimport: attribute ignored", node);
1864 *no_add_attrs = true;
1866 /* Like MS, treat definition of dllimported variables and
1867 non-inlined functions on declaration as syntax errors. */
1868 else if (TREE_CODE (node) == FUNCTION_DECL && DECL_INITIAL (node))
1870 error ("function %q+D definition is marked dllimport", node);
1871 *no_add_attrs = true;
1874 else if (VAR_P (node))
1876 if (DECL_INITIAL (node))
1878 error ("variable %q+D definition is marked dllimport",
1879 node);
1880 *no_add_attrs = true;
1883 /* `extern' needn't be specified with dllimport.
1884 Specify `extern' now and hope for the best. Sigh. */
1885 DECL_EXTERNAL (node) = 1;
1886 /* Also, implicitly give dllimport'd variables declared within
1887 a function global scope, unless declared static. */
1888 if (current_function_decl != NULL_TREE && !TREE_STATIC (node))
1889 TREE_PUBLIC (node) = 1;
1890 /* Clear TREE_STATIC because DECL_EXTERNAL is set, unless
1891 it is a C++ static data member. */
1892 if (DECL_CONTEXT (node) == NULL_TREE
1893 || !RECORD_OR_UNION_TYPE_P (DECL_CONTEXT (node)))
1894 TREE_STATIC (node) = 0;
1897 if (*no_add_attrs == false)
1898 DECL_DLLIMPORT_P (node) = 1;
1900 else if (TREE_CODE (node) == FUNCTION_DECL
1901 && DECL_DECLARED_INLINE_P (node)
1902 && flag_keep_inline_dllexport)
1903 /* An exported function, even if inline, must be emitted. */
1904 DECL_EXTERNAL (node) = 0;
1906 /* Report error if symbol is not accessible at global scope. */
1907 if (!TREE_PUBLIC (node) && VAR_OR_FUNCTION_DECL_P (node))
1909 error ("external linkage required for symbol %q+D because of "
1910 "%qE attribute", node, name);
1911 *no_add_attrs = true;
1914 /* A dllexport'd entity must have default visibility so that other
1915 program units (shared libraries or the main executable) can see
1916 it. A dllimport'd entity must have default visibility so that
1917 the linker knows that undefined references within this program
1918 unit can be resolved by the dynamic linker. */
1919 if (!*no_add_attrs)
1921 if (DECL_VISIBILITY_SPECIFIED (node)
1922 && DECL_VISIBILITY (node) != VISIBILITY_DEFAULT)
1923 error ("%qE implies default visibility, but %qD has already "
1924 "been declared with a different visibility",
1925 name, node);
1926 DECL_VISIBILITY (node) = VISIBILITY_DEFAULT;
1927 DECL_VISIBILITY_SPECIFIED (node) = 1;
1930 return NULL_TREE;
1933 #endif /* TARGET_DLLIMPORT_DECL_ATTRIBUTES */
1935 /* Given two lists of attributes, return true if list l2 is
1936 equivalent to l1. */
1939 attribute_list_equal (const_tree l1, const_tree l2)
1941 if (l1 == l2)
1942 return 1;
1944 return attribute_list_contained (l1, l2)
1945 && attribute_list_contained (l2, l1);
1948 /* Given two lists of attributes, return true if list L2 is
1949 completely contained within L1. */
1950 /* ??? This would be faster if attribute names were stored in a canonicalized
1951 form. Otherwise, if L1 uses `foo' and L2 uses `__foo__', the long method
1952 must be used to show these elements are equivalent (which they are). */
1953 /* ??? It's not clear that attributes with arguments will always be handled
1954 correctly. */
1957 attribute_list_contained (const_tree l1, const_tree l2)
1959 const_tree t1, t2;
1961 /* First check the obvious, maybe the lists are identical. */
1962 if (l1 == l2)
1963 return 1;
1965 /* Maybe the lists are similar. */
1966 for (t1 = l1, t2 = l2;
1967 t1 != 0 && t2 != 0
1968 && get_attribute_name (t1) == get_attribute_name (t2)
1969 && TREE_VALUE (t1) == TREE_VALUE (t2);
1970 t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1973 /* Maybe the lists are equal. */
1974 if (t1 == 0 && t2 == 0)
1975 return 1;
1977 for (; t2 != 0; t2 = TREE_CHAIN (t2))
1979 const_tree attr;
1980 /* This CONST_CAST is okay because lookup_attribute does not
1981 modify its argument and the return value is assigned to a
1982 const_tree. */
1983 for (attr = lookup_ident_attribute (get_attribute_name (t2),
1984 CONST_CAST_TREE (l1));
1985 attr != NULL_TREE && !attribute_value_equal (t2, attr);
1986 attr = lookup_ident_attribute (get_attribute_name (t2),
1987 TREE_CHAIN (attr)))
1990 if (attr == NULL_TREE)
1991 return 0;
1994 return 1;
1997 /* The backbone of lookup_attribute(). ATTR_LEN is the string length
1998 of ATTR_NAME, and LIST is not NULL_TREE.
2000 The function is called from lookup_attribute in order to optimize
2001 for size. */
2003 tree
2004 private_lookup_attribute (const char *attr_name, size_t attr_len, tree list)
2006 while (list)
2008 tree attr = get_attribute_name (list);
2009 size_t ident_len = IDENTIFIER_LENGTH (attr);
2010 if (cmp_attribs (attr_name, attr_len, IDENTIFIER_POINTER (attr),
2011 ident_len))
2012 break;
2013 list = TREE_CHAIN (list);
2016 return list;
2019 /* Return true if the function decl or type NODE has been declared
2020 with attribute ANAME among attributes ATTRS. */
2022 static bool
2023 has_attribute (tree node, tree attrs, const char *aname)
2025 if (!strcmp (aname, "const"))
2027 if (DECL_P (node) && TREE_READONLY (node))
2028 return true;
2030 else if (!strcmp (aname, "malloc"))
2032 if (DECL_P (node) && DECL_IS_MALLOC (node))
2033 return true;
2035 else if (!strcmp (aname, "noreturn"))
2037 if (DECL_P (node) && TREE_THIS_VOLATILE (node))
2038 return true;
2040 else if (!strcmp (aname, "nothrow"))
2042 if (TREE_NOTHROW (node))
2043 return true;
2045 else if (!strcmp (aname, "pure"))
2047 if (DECL_P (node) && DECL_PURE_P (node))
2048 return true;
2051 return lookup_attribute (aname, attrs);
2054 /* Return the number of mismatched function or type attributes between
2055 the "template" function declaration TMPL and DECL. The word "template"
2056 doesn't necessarily refer to a C++ template but rather a declaration
2057 whose attributes should be matched by those on DECL. For a non-zero
2058 return value set *ATTRSTR to a string representation of the list of
2059 mismatched attributes with quoted names.
2060 ATTRLIST is a list of additional attributes that SPEC should be
2061 taken to ultimately be declared with. */
2063 unsigned
2064 decls_mismatched_attributes (tree tmpl, tree decl, tree attrlist,
2065 const char* const blacklist[],
2066 pretty_printer *attrstr)
2068 if (TREE_CODE (tmpl) != FUNCTION_DECL)
2069 return 0;
2071 /* Avoid warning if either declaration or its type is deprecated. */
2072 if (TREE_DEPRECATED (tmpl)
2073 || TREE_DEPRECATED (decl))
2074 return 0;
2076 const tree tmpls[] = { tmpl, TREE_TYPE (tmpl) };
2077 const tree decls[] = { decl, TREE_TYPE (decl) };
2079 if (TREE_DEPRECATED (tmpls[1])
2080 || TREE_DEPRECATED (decls[1])
2081 || TREE_DEPRECATED (TREE_TYPE (tmpls[1]))
2082 || TREE_DEPRECATED (TREE_TYPE (decls[1])))
2083 return 0;
2085 tree tmpl_attrs[] = { DECL_ATTRIBUTES (tmpl), TYPE_ATTRIBUTES (tmpls[1]) };
2086 tree decl_attrs[] = { DECL_ATTRIBUTES (decl), TYPE_ATTRIBUTES (decls[1]) };
2088 if (!decl_attrs[0])
2089 decl_attrs[0] = attrlist;
2090 else if (!decl_attrs[1])
2091 decl_attrs[1] = attrlist;
2093 /* Avoid warning if the template has no attributes. */
2094 if (!tmpl_attrs[0] && !tmpl_attrs[1])
2095 return 0;
2097 /* Avoid warning if either declaration contains an attribute on
2098 the white list below. */
2099 const char* const whitelist[] = {
2100 "error", "warning"
2103 for (unsigned i = 0; i != 2; ++i)
2104 for (unsigned j = 0; j != sizeof whitelist / sizeof *whitelist; ++j)
2105 if (lookup_attribute (whitelist[j], tmpl_attrs[i])
2106 || lookup_attribute (whitelist[j], decl_attrs[i]))
2107 return 0;
2109 /* Put together a list of the black-listed attributes that the template
2110 is declared with and the declaration is not, in case it's not apparent
2111 from the most recent declaration of the template. */
2112 unsigned nattrs = 0;
2114 for (unsigned i = 0; blacklist[i]; ++i)
2116 /* Attribute leaf only applies to extern functions. Avoid mentioning
2117 it when it's missing from a static declaration. */
2118 if (!TREE_PUBLIC (decl)
2119 && !strcmp ("leaf", blacklist[i]))
2120 continue;
2122 for (unsigned j = 0; j != 2; ++j)
2124 if (!has_attribute (tmpls[j], tmpl_attrs[j], blacklist[i]))
2125 continue;
2127 bool found = false;
2128 unsigned kmax = 1 + !!decl_attrs[1];
2129 for (unsigned k = 0; k != kmax; ++k)
2131 if (has_attribute (decls[k], decl_attrs[k], blacklist[i]))
2133 found = true;
2134 break;
2138 if (!found)
2140 if (nattrs)
2141 pp_string (attrstr, ", ");
2142 pp_begin_quote (attrstr, pp_show_color (global_dc->printer));
2143 pp_string (attrstr, blacklist[i]);
2144 pp_end_quote (attrstr, pp_show_color (global_dc->printer));
2145 ++nattrs;
2148 break;
2152 return nattrs;
2155 /* Issue a warning for the declaration ALIAS for TARGET where ALIAS
2156 specifies either attributes that are incompatible with those of
2157 TARGET, or attributes that are missing and that declaring ALIAS
2158 with would benefit. */
2160 void
2161 maybe_diag_alias_attributes (tree alias, tree target)
2163 /* Do not expect attributes to match between aliases and ifunc
2164 resolvers. There is no obvious correspondence between them. */
2165 if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (alias)))
2166 return;
2168 const char* const blacklist[] = {
2169 "alloc_align", "alloc_size", "cold", "const", "hot", "leaf", "malloc",
2170 "nonnull", "noreturn", "nothrow", "pure", "returns_nonnull",
2171 "returns_twice", NULL
2174 pretty_printer attrnames;
2175 if (warn_attribute_alias > 1)
2177 /* With -Wattribute-alias=2 detect alias declarations that are more
2178 restrictive than their targets first. Those indicate potential
2179 codegen bugs. */
2180 if (unsigned n = decls_mismatched_attributes (alias, target, NULL_TREE,
2181 blacklist, &attrnames))
2183 auto_diagnostic_group d;
2184 if (warning_n (DECL_SOURCE_LOCATION (alias),
2185 OPT_Wattribute_alias_, n,
2186 "%qD specifies more restrictive attribute than "
2187 "its target %qD: %s",
2188 "%qD specifies more restrictive attributes than "
2189 "its target %qD: %s",
2190 alias, target, pp_formatted_text (&attrnames)))
2191 inform (DECL_SOURCE_LOCATION (target),
2192 "%qD target declared here", alias);
2193 return;
2197 /* Detect alias declarations that are less restrictive than their
2198 targets. Those suggest potential optimization opportunities
2199 (solved by adding the missing attribute(s) to the alias). */
2200 if (unsigned n = decls_mismatched_attributes (target, alias, NULL_TREE,
2201 blacklist, &attrnames))
2203 auto_diagnostic_group d;
2204 if (warning_n (DECL_SOURCE_LOCATION (alias),
2205 OPT_Wmissing_attributes, n,
2206 "%qD specifies less restrictive attribute than "
2207 "its target %qD: %s",
2208 "%qD specifies less restrictive attributes than "
2209 "its target %qD: %s",
2210 alias, target, pp_formatted_text (&attrnames)))
2211 inform (DECL_SOURCE_LOCATION (target),
2212 "%qD target declared here", alias);
2216 /* Initialize a mapping RWM for a call to a function declared with
2217 attribute access in ATTRS. Each attribute positional operand
2218 inserts one entry into the mapping with the operand number as
2219 the key. */
2221 void
2222 init_attr_rdwr_indices (rdwr_map *rwm, tree attrs)
2224 if (!attrs)
2225 return;
2227 for (tree access = attrs;
2228 (access = lookup_attribute ("access", access));
2229 access = TREE_CHAIN (access))
2231 /* The TREE_VALUE of an attribute is a TREE_LIST whose TREE_VALUE
2232 is the attribute argument's value. */
2233 tree mode = TREE_VALUE (access);
2234 if (!mode)
2235 return;
2237 /* The (optional) list of VLA bounds. */
2238 tree vblist = TREE_CHAIN (mode);
2239 mode = TREE_VALUE (mode);
2240 if (TREE_CODE (mode) != STRING_CST)
2241 continue;
2242 gcc_assert (TREE_CODE (mode) == STRING_CST);
2244 if (vblist)
2245 vblist = nreverse (copy_list (TREE_VALUE (vblist)));
2247 for (const char *m = TREE_STRING_POINTER (mode); *m; )
2249 attr_access acc = { };
2251 /* Skip the internal-only plus sign. */
2252 if (*m == '+')
2253 ++m;
2255 acc.str = m;
2256 acc.mode = acc.from_mode_char (*m);
2257 acc.sizarg = UINT_MAX;
2259 const char *end;
2260 acc.ptrarg = strtoul (++m, const_cast<char**>(&end), 10);
2261 m = end;
2263 if (*m == '[')
2265 /* Forms containing the square bracket are internal-only
2266 (not specified by an attribute declaration), and used
2267 for various forms of array and VLA parameters. */
2268 acc.internal_p = true;
2270 /* Search to the closing bracket and look at the preceding
2271 code: it determines the form of the most significant
2272 bound of the array. Others prior to it encode the form
2273 of interior VLA bounds. They're not of interest here. */
2274 end = strchr (m, ']');
2275 const char *p = end;
2276 gcc_assert (p);
2278 while (ISDIGIT (p[-1]))
2279 --p;
2281 if (ISDIGIT (*p))
2283 /* A digit denotes a constant bound (as in T[3]). */
2284 acc.static_p = p[-1] == 's';
2285 acc.minsize = strtoull (p, NULL, 10);
2287 else if (' ' == p[-1])
2289 /* A space denotes an ordinary array of unspecified bound
2290 (as in T[]). */
2291 acc.minsize = 0;
2293 else if ('*' == p[-1] || '$' == p[-1])
2295 /* An asterisk denotes a VLA. When the closing bracket
2296 is followed by a comma and a dollar sign its bound is
2297 on the list. Otherwise it's a VLA with an unspecified
2298 bound. */
2299 acc.static_p = p[-2] == 's';
2300 acc.minsize = HOST_WIDE_INT_M1U;
2303 m = end + 1;
2306 if (*m == ',')
2308 ++m;
2311 if (*m == '$')
2313 ++m;
2314 if (!acc.size && vblist)
2316 /* Extract the list of VLA bounds for the current
2317 parameter, store it in ACC.SIZE, and advance
2318 to the list of bounds for the next VLA parameter.
2320 acc.size = TREE_VALUE (vblist);
2321 vblist = TREE_CHAIN (vblist);
2325 if (ISDIGIT (*m))
2327 /* Extract the positional argument. It's absent
2328 for VLAs whose bound doesn't name a function
2329 parameter. */
2330 unsigned pos = strtoul (m, const_cast<char**>(&end), 10);
2331 if (acc.sizarg == UINT_MAX)
2332 acc.sizarg = pos;
2333 m = end;
2336 while (*m == '$');
2339 acc.end = m;
2341 bool existing;
2342 auto &ref = rwm->get_or_insert (acc.ptrarg, &existing);
2343 if (existing)
2345 /* Merge the new spec with the existing. */
2346 if (acc.minsize == HOST_WIDE_INT_M1U)
2347 ref.minsize = HOST_WIDE_INT_M1U;
2349 if (acc.sizarg != UINT_MAX)
2350 ref.sizarg = acc.sizarg;
2352 if (acc.mode)
2353 ref.mode = acc.mode;
2355 else
2356 ref = acc;
2358 /* Unconditionally add an entry for the required pointer
2359 operand of the attribute, and one for the optional size
2360 operand when it's specified. */
2361 if (acc.sizarg != UINT_MAX)
2362 rwm->put (acc.sizarg, acc);
2367 /* Return the access specification for a function parameter PARM
2368 or null if the current function has no such specification. */
2370 attr_access *
2371 get_parm_access (rdwr_map &rdwr_idx, tree parm,
2372 tree fndecl /* = current_function_decl */)
2374 tree fntype = TREE_TYPE (fndecl);
2375 init_attr_rdwr_indices (&rdwr_idx, TYPE_ATTRIBUTES (fntype));
2377 if (rdwr_idx.is_empty ())
2378 return NULL;
2380 unsigned argpos = 0;
2381 tree fnargs = DECL_ARGUMENTS (fndecl);
2382 for (tree arg = fnargs; arg; arg = TREE_CHAIN (arg), ++argpos)
2383 if (arg == parm)
2384 return rdwr_idx.get (argpos);
2386 return NULL;
2389 /* Return the internal representation as STRING_CST. Internal positional
2390 arguments are zero-based. */
2392 tree
2393 attr_access::to_internal_string () const
2395 return build_string (end - str, str);
2398 /* Return the human-readable representation of the external attribute
2399 specification (as it might appear in the source code) as STRING_CST.
2400 External positional arguments are one-based. */
2402 tree
2403 attr_access::to_external_string () const
2405 char buf[80];
2406 gcc_assert (mode != access_deferred);
2407 int len = snprintf (buf, sizeof buf, "access (%s, %u",
2408 mode_names[mode], ptrarg + 1);
2409 if (sizarg != UINT_MAX)
2410 len += snprintf (buf + len, sizeof buf - len, ", %u", sizarg + 1);
2411 strcpy (buf + len, ")");
2412 return build_string (len + 2, buf);
2415 /* Return the number of specified VLA bounds and set *nunspec to
2416 the number of unspecified ones (those designated by [*]). */
2418 unsigned
2419 attr_access::vla_bounds (unsigned *nunspec) const
2421 unsigned nbounds = 0;
2422 *nunspec = 0;
2423 /* STR points to the beginning of the specified string for the current
2424 argument that may be followed by the string for the next argument. */
2425 for (const char* p = strchr (str, ']'); p && *p != '['; --p)
2427 if (*p == '*')
2428 ++*nunspec;
2429 else if (*p == '$')
2430 ++nbounds;
2432 return nbounds;
2435 /* Reset front end-specific attribute access data from ATTRS.
2436 Called from the free_lang_data pass. */
2438 /* static */ void
2439 attr_access::free_lang_data (tree attrs)
2441 for (tree acs = attrs; (acs = lookup_attribute ("access", acs));
2442 acs = TREE_CHAIN (acs))
2444 tree vblist = TREE_VALUE (acs);
2445 vblist = TREE_CHAIN (vblist);
2446 if (!vblist)
2447 continue;
2449 for (vblist = TREE_VALUE (vblist); vblist; vblist = TREE_CHAIN (vblist))
2451 tree *pvbnd = &TREE_VALUE (vblist);
2452 if (!*pvbnd || DECL_P (*pvbnd))
2453 continue;
2455 /* VLA bounds that are expressions as opposed to DECLs are
2456 only used in the front end. Reset them to keep front end
2457 trees leaking into the middle end (see pr97172) and to
2458 free up memory. */
2459 *pvbnd = NULL_TREE;
2463 for (tree argspec = attrs; (argspec = lookup_attribute ("arg spec", argspec));
2464 argspec = TREE_CHAIN (argspec))
2466 /* Same as above. */
2467 tree *pvblist = &TREE_VALUE (argspec);
2468 *pvblist = NULL_TREE;
2472 /* Defined in attr_access. */
2473 constexpr char attr_access::mode_chars[];
2474 constexpr char attr_access::mode_names[][11];
2476 /* Format an array, including a VLA, pointed to by TYPE and used as
2477 a function parameter as a human-readable string. ACC describes
2478 an access to the parameter and is used to determine the outermost
2479 form of the array including its bound which is otherwise obviated
2480 by its decay to pointer. Return the formatted string. */
2482 std::string
2483 attr_access::array_as_string (tree type) const
2485 std::string typstr;
2487 if (type == error_mark_node)
2488 return std::string ();
2490 if (this->str)
2492 /* For array parameters (but not pointers) create a temporary array
2493 type that corresponds to the form of the parameter including its
2494 qualifiers even though they apply to the pointer, not the array
2495 type. */
2496 const bool vla_p = minsize == HOST_WIDE_INT_M1U;
2497 tree eltype = TREE_TYPE (type);
2498 tree index_type = NULL_TREE;
2500 if (minsize == HOST_WIDE_INT_M1U)
2502 /* Determine if this is a VLA (an array whose most significant
2503 bound is nonconstant and whose access string has "$]" in it)
2504 extract the bound expression from SIZE. */
2505 const char *p = end;
2506 for ( ; p != str && *p-- != ']'; );
2507 if (*p == '$')
2508 /* SIZE may have been cleared. Use it with care. */
2509 index_type = build_index_type (size ? TREE_VALUE (size) : size);
2511 else if (minsize)
2512 index_type = build_index_type (size_int (minsize - 1));
2514 tree arat = NULL_TREE;
2515 if (static_p || vla_p)
2517 tree flag = static_p ? integer_one_node : NULL_TREE;
2518 /* Hack: there's no language-independent way to encode
2519 the "static" specifier or the "*" notation in an array type.
2520 Add a "fake" attribute to have the pretty-printer add "static"
2521 or "*". The "[static N]" notation is only valid in the most
2522 significant bound but [*] can be used for any bound. Because
2523 [*] is represented the same as [0] this hack only works for
2524 the most significant bound like static and the others are
2525 rendered as [0]. */
2526 arat = build_tree_list (get_identifier ("array"), flag);
2529 const int quals = TYPE_QUALS (type);
2530 type = build_array_type (eltype, index_type);
2531 type = build_type_attribute_qual_variant (type, arat, quals);
2534 /* Format the type using the current pretty printer. The generic tree
2535 printer does a terrible job. */
2536 pretty_printer *pp = global_dc->printer->clone ();
2537 pp_printf (pp, "%qT", type);
2538 typstr = pp_formatted_text (pp);
2539 delete pp;
2541 return typstr;
2544 #if CHECKING_P
2546 namespace selftest
2549 /* Helper types to verify the consistency attribute exclusions. */
2551 typedef std::pair<const char *, const char *> excl_pair;
2553 struct excl_hash_traits: typed_noop_remove<excl_pair>
2555 typedef excl_pair value_type;
2556 typedef value_type compare_type;
2558 static hashval_t hash (const value_type &x)
2560 hashval_t h1 = htab_hash_string (x.first);
2561 hashval_t h2 = htab_hash_string (x.second);
2562 return h1 ^ h2;
2565 static bool equal (const value_type &x, const value_type &y)
2567 return !strcmp (x.first, y.first) && !strcmp (x.second, y.second);
2570 static void mark_deleted (value_type &x)
2572 x = value_type (NULL, NULL);
2575 static const bool empty_zero_p = false;
2577 static void mark_empty (value_type &x)
2579 x = value_type ("", "");
2582 static bool is_deleted (const value_type &x)
2584 return !x.first && !x.second;
2587 static bool is_empty (const value_type &x)
2589 return !*x.first && !*x.second;
2594 /* Self-test to verify that each attribute exclusion is symmetric,
2595 meaning that if attribute A is encoded as incompatible with
2596 attribute B then the opposite relationship is also encoded.
2597 This test also detects most cases of misspelled attribute names
2598 in exclusions. */
2600 static void
2601 test_attribute_exclusions ()
2603 /* Iterate over the array of attribute tables first (with TI0 as
2604 the index) and over the array of attribute_spec in each table
2605 (with SI0 as the index). */
2606 const size_t ntables = ARRAY_SIZE (attribute_tables);
2608 /* Set of pairs of mutually exclusive attributes. */
2609 typedef hash_set<excl_pair, false, excl_hash_traits> exclusion_set;
2610 exclusion_set excl_set;
2612 for (size_t ti0 = 0; ti0 != ntables; ++ti0)
2613 for (size_t s0 = 0; attribute_tables[ti0][s0].name; ++s0)
2615 const attribute_spec::exclusions *excl
2616 = attribute_tables[ti0][s0].exclude;
2618 /* Skip each attribute that doesn't define exclusions. */
2619 if (!excl)
2620 continue;
2622 const char *attr_name = attribute_tables[ti0][s0].name;
2624 /* Iterate over the set of exclusions for every attribute
2625 (with EI0 as the index) adding the exclusions defined
2626 for each to the set. */
2627 for (size_t ei0 = 0; excl[ei0].name; ++ei0)
2629 const char *excl_name = excl[ei0].name;
2631 if (!strcmp (attr_name, excl_name))
2632 continue;
2634 excl_set.add (excl_pair (attr_name, excl_name));
2638 /* Traverse the set of mutually exclusive pairs of attributes
2639 and verify that they are symmetric. */
2640 for (exclusion_set::iterator it = excl_set.begin ();
2641 it != excl_set.end ();
2642 ++it)
2644 if (!excl_set.contains (excl_pair ((*it).second, (*it).first)))
2646 /* An exclusion for an attribute has been found that
2647 doesn't have a corresponding exclusion in the opposite
2648 direction. */
2649 char desc[120];
2650 sprintf (desc, "'%s' attribute exclusion '%s' must be symmetric",
2651 (*it).first, (*it).second);
2652 fail (SELFTEST_LOCATION, desc);
2657 void
2658 attribute_c_tests ()
2660 test_attribute_exclusions ();
2663 } /* namespace selftest */
2665 #endif /* CHECKING_P */