Daily bump.
[official-gcc.git] / gcc / attribs.c
blob0284e5bf2fde9314358f1cb20302e342219262be
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 if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
119 && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
121 str->length -= 4;
122 str->str += 2;
126 /* Insert an array of attributes ATTRIBUTES into a namespace. This
127 array must be NULL terminated. NS is the name of attribute
128 namespace. IGNORED_P is true iff all unknown attributes in this
129 namespace should be ignored for the purposes of -Wattributes. The
130 function returns the namespace into which the attributes have been
131 registered. */
133 scoped_attributes *
134 register_scoped_attributes (const struct attribute_spec *attributes,
135 const char *ns, bool ignored_p /*=false*/)
137 scoped_attributes *result = NULL;
139 /* See if we already have attributes in the namespace NS. */
140 result = find_attribute_namespace (ns);
142 if (result == NULL)
144 /* We don't have any namespace NS yet. Create one. */
145 scoped_attributes sa;
147 if (attributes_table.is_empty ())
148 attributes_table.create (64);
150 memset (&sa, 0, sizeof (sa));
151 sa.ns = ns;
152 sa.attributes.create (64);
153 sa.ignored_p = ignored_p;
154 result = attributes_table.safe_push (sa);
155 result->attribute_hash = new hash_table<attribute_hasher> (200);
157 else
158 result->ignored_p |= ignored_p;
160 /* Really add the attributes to their namespace now. */
161 for (unsigned i = 0; attributes[i].name != NULL; ++i)
163 result->attributes.safe_push (attributes[i]);
164 register_scoped_attribute (&attributes[i], result);
167 gcc_assert (result != NULL);
169 return result;
172 /* Return the namespace which name is NS, NULL if none exist. */
174 static scoped_attributes*
175 find_attribute_namespace (const char* ns)
177 for (scoped_attributes &iter : attributes_table)
178 if (ns == iter.ns
179 || (iter.ns != NULL
180 && ns != NULL
181 && !strcmp (iter.ns, ns)))
182 return &iter;
183 return NULL;
186 /* Make some sanity checks on the attribute tables. */
188 static void
189 check_attribute_tables (void)
191 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
192 for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
194 /* The name must not begin and end with __. */
195 const char *name = attribute_tables[i][j].name;
196 int len = strlen (name);
198 gcc_assert (!(name[0] == '_' && name[1] == '_'
199 && name[len - 1] == '_' && name[len - 2] == '_'));
201 /* The minimum and maximum lengths must be consistent. */
202 gcc_assert (attribute_tables[i][j].min_length >= 0);
204 gcc_assert (attribute_tables[i][j].max_length == -1
205 || (attribute_tables[i][j].max_length
206 >= attribute_tables[i][j].min_length));
208 /* An attribute cannot require both a DECL and a TYPE. */
209 gcc_assert (!attribute_tables[i][j].decl_required
210 || !attribute_tables[i][j].type_required);
212 /* If an attribute requires a function type, in particular
213 it requires a type. */
214 gcc_assert (!attribute_tables[i][j].function_type_required
215 || attribute_tables[i][j].type_required);
218 /* Check that each name occurs just once in each table. */
219 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
220 for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
221 for (size_t k = j + 1; attribute_tables[i][k].name != NULL; k++)
222 gcc_assert (strcmp (attribute_tables[i][j].name,
223 attribute_tables[i][k].name));
225 /* Check that no name occurs in more than one table. Names that
226 begin with '*' are exempt, and may be overridden. */
227 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
228 for (size_t j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
229 for (size_t k = 0; attribute_tables[i][k].name != NULL; k++)
230 for (size_t l = 0; attribute_tables[j][l].name != NULL; l++)
231 gcc_assert (attribute_tables[i][k].name[0] == '*'
232 || strcmp (attribute_tables[i][k].name,
233 attribute_tables[j][l].name));
236 /* Used to stash pointers to allocated memory so that we can free them at
237 the end of parsing of all TUs. */
238 static vec<attribute_spec *> ignored_attributes_table;
240 /* Parse arguments V of -Wno-attributes=.
241 Currently we accept:
242 vendor::attr
243 vendor::
244 This functions also registers the parsed attributes so that we don't
245 warn that we don't recognize them. */
247 void
248 handle_ignored_attributes_option (vec<char *> *v)
250 if (v == nullptr)
251 return;
253 for (auto opt : v)
255 char *cln = strstr (opt, "::");
256 /* We don't accept '::attr'. */
257 if (cln == nullptr || cln == opt)
259 error ("wrong argument to ignored attributes");
260 inform (input_location, "valid format is %<ns::attr%> or %<ns::%>");
261 continue;
263 const char *vendor_start = opt;
264 ptrdiff_t vendor_len = cln - opt;
265 const char *attr_start = cln + 2;
266 /* This could really use rawmemchr :(. */
267 ptrdiff_t attr_len = strchr (attr_start, '\0') - attr_start;
268 /* Verify that they look valid. */
269 auto valid_p = [](const char *const s, ptrdiff_t len) {
270 bool ok = false;
272 for (int i = 0; i < len; ++i)
273 if (ISALNUM (s[i]))
274 ok = true;
275 else if (s[i] != '_')
276 return false;
278 return ok;
280 if (!valid_p (vendor_start, vendor_len))
282 error ("wrong argument to ignored attributes");
283 continue;
285 canonicalize_attr_name (vendor_start, vendor_len);
286 /* We perform all this hijinks so that we don't have to copy OPT. */
287 tree vendor_id = get_identifier_with_length (vendor_start, vendor_len);
288 const char *attr;
289 /* In the "vendor::" case, we should ignore *any* attribute coming
290 from this attribute namespace. */
291 if (attr_len > 0)
293 if (!valid_p (attr_start, attr_len))
295 error ("wrong argument to ignored attributes");
296 continue;
298 canonicalize_attr_name (attr_start, attr_len);
299 tree attr_id = get_identifier_with_length (attr_start, attr_len);
300 attr = IDENTIFIER_POINTER (attr_id);
301 /* If we've already seen this vendor::attr, ignore it. Attempting to
302 register it twice would lead to a crash. */
303 if (lookup_scoped_attribute_spec (vendor_id, attr_id))
304 continue;
306 else
307 attr = nullptr;
308 /* Create a table with extra attributes which we will register.
309 We can't free it here, so squirrel away the pointers. */
310 attribute_spec *table = new attribute_spec[2];
311 ignored_attributes_table.safe_push (table);
312 table[0] = { attr, 0, 0, false, false, false, false, nullptr, nullptr };
313 table[1] = { nullptr, 0, 0, false, false, false, false, nullptr,
314 nullptr };
315 register_scoped_attributes (table, IDENTIFIER_POINTER (vendor_id), !attr);
319 /* Free data we might have allocated when adding extra attributes. */
321 void
322 free_attr_data ()
324 for (auto x : ignored_attributes_table)
325 delete[] x;
326 ignored_attributes_table.release ();
329 /* Initialize attribute tables, and make some sanity checks if checking is
330 enabled. */
332 void
333 init_attributes (void)
335 size_t i;
337 if (attributes_initialized)
338 return;
340 attribute_tables[0] = lang_hooks.common_attribute_table;
341 attribute_tables[1] = lang_hooks.attribute_table;
342 attribute_tables[2] = lang_hooks.format_attribute_table;
343 attribute_tables[3] = targetm.attribute_table;
345 /* Translate NULL pointers to pointers to the empty table. */
346 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
347 if (attribute_tables[i] == NULL)
348 attribute_tables[i] = empty_attribute_table;
350 if (flag_checking)
351 check_attribute_tables ();
353 for (i = 0; i < ARRAY_SIZE (attribute_tables); ++i)
354 /* Put all the GNU attributes into the "gnu" namespace. */
355 register_scoped_attributes (attribute_tables[i], "gnu");
357 vec<char *> *ignored = (vec<char *> *) flag_ignored_attributes;
358 handle_ignored_attributes_option (ignored);
360 invoke_plugin_callbacks (PLUGIN_ATTRIBUTES, NULL);
361 attributes_initialized = true;
364 /* Insert a single ATTR into the attribute table. */
366 void
367 register_attribute (const struct attribute_spec *attr)
369 register_scoped_attribute (attr, find_attribute_namespace ("gnu"));
372 /* Insert a single attribute ATTR into a namespace of attributes. */
374 static void
375 register_scoped_attribute (const struct attribute_spec *attr,
376 scoped_attributes *name_space)
378 struct substring str;
379 attribute_spec **slot;
381 gcc_assert (attr != NULL && name_space != NULL);
383 gcc_assert (name_space->attribute_hash);
385 str.str = attr->name;
386 str.length = strlen (str.str);
388 /* Attribute names in the table must be in the form 'text' and not
389 in the form '__text__'. */
390 gcc_assert (str.length > 0 && str.str[0] != '_');
392 slot = name_space->attribute_hash
393 ->find_slot_with_hash (&str, substring_hash (str.str, str.length),
394 INSERT);
395 gcc_assert (!*slot || attr->name[0] == '*');
396 *slot = CONST_CAST (struct attribute_spec *, attr);
399 /* Return the spec for the scoped attribute with namespace NS and
400 name NAME. */
402 static const struct attribute_spec *
403 lookup_scoped_attribute_spec (const_tree ns, const_tree name)
405 struct substring attr;
406 scoped_attributes *attrs;
408 const char *ns_str = (ns != NULL_TREE) ? IDENTIFIER_POINTER (ns): NULL;
410 attrs = find_attribute_namespace (ns_str);
412 if (attrs == NULL)
413 return NULL;
415 attr.str = IDENTIFIER_POINTER (name);
416 attr.length = IDENTIFIER_LENGTH (name);
417 extract_attribute_substring (&attr);
418 return attrs->attribute_hash->find_with_hash (&attr,
419 substring_hash (attr.str,
420 attr.length));
423 /* Return the spec for the attribute named NAME. If NAME is a TREE_LIST,
424 it also specifies the attribute namespace. */
426 const struct attribute_spec *
427 lookup_attribute_spec (const_tree name)
429 tree ns;
430 if (TREE_CODE (name) == TREE_LIST)
432 ns = TREE_PURPOSE (name);
433 name = TREE_VALUE (name);
435 else
436 ns = get_identifier ("gnu");
437 return lookup_scoped_attribute_spec (ns, name);
441 /* Return the namespace of the attribute ATTR. This accessor works on
442 GNU and C++11 (scoped) attributes. On GNU attributes,
443 it returns an identifier tree for the string "gnu".
445 Please read the comments of cxx11_attribute_p to understand the
446 format of attributes. */
448 tree
449 get_attribute_namespace (const_tree attr)
451 if (cxx11_attribute_p (attr))
452 return TREE_PURPOSE (TREE_PURPOSE (attr));
453 return get_identifier ("gnu");
456 /* Check LAST_DECL and NODE of the same symbol for attributes that are
457 recorded in SPEC to be mutually exclusive with ATTRNAME, diagnose
458 them, and return true if any have been found. NODE can be a DECL
459 or a TYPE. */
461 static bool
462 diag_attr_exclusions (tree last_decl, tree node, tree attrname,
463 const attribute_spec *spec)
465 const attribute_spec::exclusions *excl = spec->exclude;
467 tree_code code = TREE_CODE (node);
469 if ((code == FUNCTION_DECL && !excl->function
470 && (!excl->type || !spec->affects_type_identity))
471 || (code == VAR_DECL && !excl->variable
472 && (!excl->type || !spec->affects_type_identity))
473 || (((code == TYPE_DECL || RECORD_OR_UNION_TYPE_P (node)) && !excl->type)))
474 return false;
476 /* True if an attribute that's mutually exclusive with ATTRNAME
477 has been found. */
478 bool found = false;
480 if (last_decl && last_decl != node && TREE_TYPE (last_decl) != node)
482 /* Check both the last DECL and its type for conflicts with
483 the attribute being added to the current decl or type. */
484 found |= diag_attr_exclusions (last_decl, last_decl, attrname, spec);
485 tree decl_type = TREE_TYPE (last_decl);
486 found |= diag_attr_exclusions (last_decl, decl_type, attrname, spec);
489 /* NODE is either the current DECL to which the attribute is being
490 applied or its TYPE. For the former, consider the attributes on
491 both the DECL and its type. */
492 tree attrs[2];
494 if (DECL_P (node))
496 attrs[0] = DECL_ATTRIBUTES (node);
497 attrs[1] = TYPE_ATTRIBUTES (TREE_TYPE (node));
499 else
501 attrs[0] = TYPE_ATTRIBUTES (node);
502 attrs[1] = NULL_TREE;
505 /* Iterate over the mutually exclusive attribute names and verify
506 that the symbol doesn't contain it. */
507 for (unsigned i = 0; i != sizeof attrs / sizeof *attrs; ++i)
509 if (!attrs[i])
510 continue;
512 for ( ; excl->name; ++excl)
514 /* Avoid checking the attribute against itself. */
515 if (is_attribute_p (excl->name, attrname))
516 continue;
518 if (!lookup_attribute (excl->name, attrs[i]))
519 continue;
521 /* An exclusion may apply either to a function declaration,
522 type declaration, or a field/variable declaration, or
523 any subset of the three. */
524 if (TREE_CODE (node) == FUNCTION_DECL
525 && !excl->function)
526 continue;
528 if (TREE_CODE (node) == TYPE_DECL
529 && !excl->type)
530 continue;
532 if ((TREE_CODE (node) == FIELD_DECL
533 || TREE_CODE (node) == VAR_DECL)
534 && !excl->variable)
535 continue;
537 found = true;
539 /* Print a note? */
540 bool note = last_decl != NULL_TREE;
541 auto_diagnostic_group d;
542 if (TREE_CODE (node) == FUNCTION_DECL
543 && fndecl_built_in_p (node))
544 note &= warning (OPT_Wattributes,
545 "ignoring attribute %qE in declaration of "
546 "a built-in function %qD because it conflicts "
547 "with attribute %qs",
548 attrname, node, excl->name);
549 else
550 note &= warning (OPT_Wattributes,
551 "ignoring attribute %qE because "
552 "it conflicts with attribute %qs",
553 attrname, excl->name);
555 if (note)
556 inform (DECL_SOURCE_LOCATION (last_decl),
557 "previous declaration here");
561 return found;
564 /* Return true iff we should not complain about unknown attributes
565 coming from the attribute namespace NS. This is the case for
566 the -Wno-attributes=ns:: command-line option. */
568 static bool
569 attr_namespace_ignored_p (tree ns)
571 if (ns == NULL_TREE)
572 return false;
573 scoped_attributes *r = find_attribute_namespace (IDENTIFIER_POINTER (ns));
574 return r && r->ignored_p;
577 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
578 which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
579 it should be modified in place; if a TYPE, a copy should be created
580 unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS. FLAGS gives further
581 information, in the form of a bitwise OR of flags in enum attribute_flags
582 from tree.h. Depending on these flags, some attributes may be
583 returned to be applied at a later stage (for example, to apply
584 a decl attribute to the declaration rather than to its type). */
586 tree
587 decl_attributes (tree *node, tree attributes, int flags,
588 tree last_decl /* = NULL_TREE */)
590 tree returned_attrs = NULL_TREE;
592 if (TREE_TYPE (*node) == error_mark_node || attributes == error_mark_node)
593 return NULL_TREE;
595 if (!attributes_initialized)
596 init_attributes ();
598 /* If this is a function and the user used #pragma GCC optimize, add the
599 options to the attribute((optimize(...))) list. */
600 if (TREE_CODE (*node) == FUNCTION_DECL && current_optimize_pragma)
602 tree cur_attr = lookup_attribute ("optimize", attributes);
603 tree opts = copy_list (current_optimize_pragma);
605 if (! cur_attr)
606 attributes
607 = tree_cons (get_identifier ("optimize"), opts, attributes);
608 else
609 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
612 if (TREE_CODE (*node) == FUNCTION_DECL
613 && optimization_current_node != optimization_default_node
614 && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
615 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
617 /* If this is a function and the user used #pragma GCC target, add the
618 options to the attribute((target(...))) list. */
619 if (TREE_CODE (*node) == FUNCTION_DECL
620 && current_target_pragma
621 && targetm.target_option.valid_attribute_p (*node, NULL_TREE,
622 current_target_pragma, 0))
624 tree cur_attr = lookup_attribute ("target", attributes);
625 tree opts = copy_list (current_target_pragma);
627 if (! cur_attr)
628 attributes = tree_cons (get_identifier ("target"), opts, attributes);
629 else
630 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
633 /* A "naked" function attribute implies "noinline" and "noclone" for
634 those targets that support it. */
635 if (TREE_CODE (*node) == FUNCTION_DECL
636 && attributes
637 && lookup_attribute ("naked", attributes) != NULL
638 && lookup_attribute_spec (get_identifier ("naked"))
639 && lookup_attribute ("noipa", attributes) == NULL)
640 attributes = tree_cons (get_identifier ("noipa"), NULL, attributes);
642 /* A "noipa" function attribute implies "noinline", "noclone" and "no_icf"
643 for those targets that support it. */
644 if (TREE_CODE (*node) == FUNCTION_DECL
645 && attributes
646 && lookup_attribute ("noipa", attributes) != NULL
647 && lookup_attribute_spec (get_identifier ("noipa")))
649 if (lookup_attribute ("noinline", attributes) == NULL)
650 attributes = tree_cons (get_identifier ("noinline"), NULL, attributes);
652 if (lookup_attribute ("noclone", attributes) == NULL)
653 attributes = tree_cons (get_identifier ("noclone"), NULL, attributes);
655 if (lookup_attribute ("no_icf", attributes) == NULL)
656 attributes = tree_cons (get_identifier ("no_icf"), NULL, attributes);
659 targetm.insert_attributes (*node, &attributes);
661 /* Note that attributes on the same declaration are not necessarily
662 in the same order as in the source. */
663 for (tree attr = attributes; attr; attr = TREE_CHAIN (attr))
665 tree ns = get_attribute_namespace (attr);
666 tree name = get_attribute_name (attr);
667 tree args = TREE_VALUE (attr);
668 tree *anode = node;
669 const struct attribute_spec *spec
670 = lookup_scoped_attribute_spec (ns, name);
671 int fn_ptr_quals = 0;
672 tree fn_ptr_tmp = NULL_TREE;
673 const bool cxx11_attr_p = cxx11_attribute_p (attr);
675 if (spec == NULL)
677 if (!(flags & (int) ATTR_FLAG_BUILT_IN)
678 && !attr_namespace_ignored_p (ns))
680 if (ns == NULL_TREE || !cxx11_attr_p)
681 warning (OPT_Wattributes, "%qE attribute directive ignored",
682 name);
683 else
684 warning (OPT_Wattributes,
685 "%<%E::%E%> scoped attribute directive ignored",
686 ns, name);
688 continue;
690 else
692 int nargs = list_length (args);
693 if (nargs < spec->min_length
694 || (spec->max_length >= 0
695 && nargs > spec->max_length))
697 error ("wrong number of arguments specified for %qE attribute",
698 name);
699 if (spec->max_length < 0)
700 inform (input_location, "expected %i or more, found %i",
701 spec->min_length, nargs);
702 else
703 inform (input_location, "expected between %i and %i, found %i",
704 spec->min_length, spec->max_length, nargs);
705 continue;
708 gcc_assert (is_attribute_p (spec->name, name));
710 if (spec->decl_required && !DECL_P (*anode))
712 if (flags & ((int) ATTR_FLAG_DECL_NEXT
713 | (int) ATTR_FLAG_FUNCTION_NEXT
714 | (int) ATTR_FLAG_ARRAY_NEXT))
716 /* Pass on this attribute to be tried again. */
717 tree attr = tree_cons (name, args, NULL_TREE);
718 returned_attrs = chainon (returned_attrs, attr);
719 continue;
721 else
723 warning (OPT_Wattributes, "%qE attribute does not apply to types",
724 name);
725 continue;
729 /* If we require a type, but were passed a decl, set up to make a
730 new type and update the one in the decl. ATTR_FLAG_TYPE_IN_PLACE
731 would have applied if we'd been passed a type, but we cannot modify
732 the decl's type in place here. */
733 if (spec->type_required && DECL_P (*anode))
735 anode = &TREE_TYPE (*anode);
736 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
739 if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
740 && TREE_CODE (*anode) != METHOD_TYPE)
742 if (TREE_CODE (*anode) == POINTER_TYPE
743 && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
744 || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
746 /* OK, this is a bit convoluted. We can't just make a copy
747 of the pointer type and modify its TREE_TYPE, because if
748 we change the attributes of the target type the pointer
749 type needs to have a different TYPE_MAIN_VARIANT. So we
750 pull out the target type now, frob it as appropriate, and
751 rebuild the pointer type later.
753 This would all be simpler if attributes were part of the
754 declarator, grumble grumble. */
755 fn_ptr_tmp = TREE_TYPE (*anode);
756 fn_ptr_quals = TYPE_QUALS (*anode);
757 anode = &fn_ptr_tmp;
758 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
760 else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
762 /* Pass on this attribute to be tried again. */
763 tree attr = tree_cons (name, args, NULL_TREE);
764 returned_attrs = chainon (returned_attrs, attr);
765 continue;
768 if (TREE_CODE (*anode) != FUNCTION_TYPE
769 && TREE_CODE (*anode) != METHOD_TYPE)
771 warning (OPT_Wattributes,
772 "%qE attribute only applies to function types",
773 name);
774 continue;
778 if (TYPE_P (*anode)
779 && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
780 && TYPE_SIZE (*anode) != NULL_TREE)
782 warning (OPT_Wattributes, "type attributes ignored after type is already defined");
783 continue;
786 bool no_add_attrs = false;
788 /* Check for exclusions with other attributes on the current
789 declation as well as the last declaration of the same
790 symbol already processed (if one exists). Detect and
791 reject incompatible attributes. */
792 bool built_in = flags & ATTR_FLAG_BUILT_IN;
793 if (spec->exclude
794 && (flag_checking || !built_in)
795 && !error_operand_p (last_decl))
797 /* Always check attributes on user-defined functions.
798 Check them on built-ins only when -fchecking is set.
799 Ignore __builtin_unreachable -- it's both const and
800 noreturn. */
802 if (!built_in
803 || !DECL_P (*anode)
804 || DECL_BUILT_IN_CLASS (*anode) != BUILT_IN_NORMAL
805 || (DECL_FUNCTION_CODE (*anode) != BUILT_IN_UNREACHABLE
806 && (DECL_FUNCTION_CODE (*anode)
807 != BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE)))
809 bool no_add = diag_attr_exclusions (last_decl, *anode, name, spec);
810 if (!no_add && anode != node)
811 no_add = diag_attr_exclusions (last_decl, *node, name, spec);
812 no_add_attrs |= no_add;
816 if (no_add_attrs)
817 continue;
819 if (spec->handler != NULL)
821 int cxx11_flag = (cxx11_attr_p ? ATTR_FLAG_CXX11 : 0);
823 /* Pass in an array of the current declaration followed
824 by the last pushed/merged declaration if one exists.
825 For calls that modify the type attributes of a DECL
826 and for which *ANODE is *NODE's type, also pass in
827 the DECL as the third element to use in diagnostics.
828 If the handler changes CUR_AND_LAST_DECL[0] replace
829 *ANODE with its value. */
830 tree cur_and_last_decl[3] = { *anode, last_decl };
831 if (anode != node && DECL_P (*node))
832 cur_and_last_decl[2] = *node;
834 tree ret = (spec->handler) (cur_and_last_decl, name, args,
835 flags|cxx11_flag, &no_add_attrs);
837 *anode = cur_and_last_decl[0];
838 if (ret == error_mark_node)
840 warning (OPT_Wattributes, "%qE attribute ignored", name);
841 no_add_attrs = true;
843 else
844 returned_attrs = chainon (ret, returned_attrs);
847 /* Layout the decl in case anything changed. */
848 if (spec->type_required && DECL_P (*node)
849 && (VAR_P (*node)
850 || TREE_CODE (*node) == PARM_DECL
851 || TREE_CODE (*node) == RESULT_DECL))
852 relayout_decl (*node);
854 if (!no_add_attrs)
856 tree old_attrs;
857 tree a;
859 if (DECL_P (*anode))
860 old_attrs = DECL_ATTRIBUTES (*anode);
861 else
862 old_attrs = TYPE_ATTRIBUTES (*anode);
864 for (a = lookup_attribute (spec->name, old_attrs);
865 a != NULL_TREE;
866 a = lookup_attribute (spec->name, TREE_CHAIN (a)))
868 if (simple_cst_equal (TREE_VALUE (a), args) == 1)
869 break;
872 if (a == NULL_TREE)
874 /* This attribute isn't already in the list. */
875 tree r;
876 /* Preserve the C++11 form. */
877 if (cxx11_attr_p)
878 r = tree_cons (build_tree_list (ns, name), args, old_attrs);
879 else
880 r = tree_cons (name, args, old_attrs);
882 if (DECL_P (*anode))
883 DECL_ATTRIBUTES (*anode) = r;
884 else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
886 TYPE_ATTRIBUTES (*anode) = r;
887 /* If this is the main variant, also push the attributes
888 out to the other variants. */
889 if (*anode == TYPE_MAIN_VARIANT (*anode))
891 for (tree variant = *anode; variant;
892 variant = TYPE_NEXT_VARIANT (variant))
894 if (TYPE_ATTRIBUTES (variant) == old_attrs)
895 TYPE_ATTRIBUTES (variant)
896 = TYPE_ATTRIBUTES (*anode);
897 else if (!lookup_attribute
898 (spec->name, TYPE_ATTRIBUTES (variant)))
899 TYPE_ATTRIBUTES (variant) = tree_cons
900 (name, args, TYPE_ATTRIBUTES (variant));
904 else
905 *anode = build_type_attribute_variant (*anode, r);
909 if (fn_ptr_tmp)
911 /* Rebuild the function pointer type and put it in the
912 appropriate place. */
913 fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
914 if (fn_ptr_quals)
915 fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals);
916 if (DECL_P (*node))
917 TREE_TYPE (*node) = fn_ptr_tmp;
918 else
920 gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
921 *node = fn_ptr_tmp;
926 return returned_attrs;
929 /* Return TRUE iff ATTR has been parsed by the front-end as a C++-11
930 attribute.
932 When G++ parses a C++11 attribute, it is represented as
933 a TREE_LIST which TREE_PURPOSE is itself a TREE_LIST. TREE_PURPOSE
934 (TREE_PURPOSE (ATTR)) is the namespace of the attribute, and the
935 TREE_VALUE (TREE_PURPOSE (ATTR)) is its non-qualified name. Please
936 use get_attribute_namespace and get_attribute_name to retrieve the
937 namespace and name of the attribute, as these accessors work with
938 GNU attributes as well. */
940 bool
941 cxx11_attribute_p (const_tree attr)
943 if (attr == NULL_TREE
944 || TREE_CODE (attr) != TREE_LIST)
945 return false;
947 return (TREE_CODE (TREE_PURPOSE (attr)) == TREE_LIST);
950 /* Return the name of the attribute ATTR. This accessor works on GNU
951 and C++11 (scoped) attributes.
953 Please read the comments of cxx11_attribute_p to understand the
954 format of attributes. */
956 tree
957 get_attribute_name (const_tree attr)
959 if (cxx11_attribute_p (attr))
960 return TREE_VALUE (TREE_PURPOSE (attr));
961 return TREE_PURPOSE (attr);
964 /* Subroutine of set_method_tm_attributes. Apply TM attribute ATTR
965 to the method FNDECL. */
967 void
968 apply_tm_attr (tree fndecl, tree attr)
970 decl_attributes (&TREE_TYPE (fndecl), tree_cons (attr, NULL, NULL), 0);
973 /* Makes a function attribute of the form NAME(ARG_NAME) and chains
974 it to CHAIN. */
976 tree
977 make_attribute (const char *name, const char *arg_name, tree chain)
979 tree attr_name;
980 tree attr_arg_name;
981 tree attr_args;
982 tree attr;
984 attr_name = get_identifier (name);
985 attr_arg_name = build_string (strlen (arg_name), arg_name);
986 attr_args = tree_cons (NULL_TREE, attr_arg_name, NULL_TREE);
987 attr = tree_cons (attr_name, attr_args, chain);
988 return attr;
992 /* Common functions used for target clone support. */
994 /* Comparator function to be used in qsort routine to sort attribute
995 specification strings to "target". */
997 static int
998 attr_strcmp (const void *v1, const void *v2)
1000 const char *c1 = *(char *const*)v1;
1001 const char *c2 = *(char *const*)v2;
1002 return strcmp (c1, c2);
1005 /* ARGLIST is the argument to target attribute. This function tokenizes
1006 the comma separated arguments, sorts them and returns a string which
1007 is a unique identifier for the comma separated arguments. It also
1008 replaces non-identifier characters "=,-" with "_". */
1010 char *
1011 sorted_attr_string (tree arglist)
1013 tree arg;
1014 size_t str_len_sum = 0;
1015 char **args = NULL;
1016 char *attr_str, *ret_str;
1017 char *attr = NULL;
1018 unsigned int argnum = 1;
1019 unsigned int i;
1021 for (arg = arglist; arg; arg = TREE_CHAIN (arg))
1023 const char *str = TREE_STRING_POINTER (TREE_VALUE (arg));
1024 size_t len = strlen (str);
1025 str_len_sum += len + 1;
1026 if (arg != arglist)
1027 argnum++;
1028 for (i = 0; i < strlen (str); i++)
1029 if (str[i] == ',')
1030 argnum++;
1033 attr_str = XNEWVEC (char, str_len_sum);
1034 str_len_sum = 0;
1035 for (arg = arglist; arg; arg = TREE_CHAIN (arg))
1037 const char *str = TREE_STRING_POINTER (TREE_VALUE (arg));
1038 size_t len = strlen (str);
1039 memcpy (attr_str + str_len_sum, str, len);
1040 attr_str[str_len_sum + len] = TREE_CHAIN (arg) ? ',' : '\0';
1041 str_len_sum += len + 1;
1044 /* Replace "=,-" with "_". */
1045 for (i = 0; i < strlen (attr_str); i++)
1046 if (attr_str[i] == '=' || attr_str[i]== '-')
1047 attr_str[i] = '_';
1049 if (argnum == 1)
1050 return attr_str;
1052 args = XNEWVEC (char *, argnum);
1054 i = 0;
1055 attr = strtok (attr_str, ",");
1056 while (attr != NULL)
1058 args[i] = attr;
1059 i++;
1060 attr = strtok (NULL, ",");
1063 qsort (args, argnum, sizeof (char *), attr_strcmp);
1065 ret_str = XNEWVEC (char, str_len_sum);
1066 str_len_sum = 0;
1067 for (i = 0; i < argnum; i++)
1069 size_t len = strlen (args[i]);
1070 memcpy (ret_str + str_len_sum, args[i], len);
1071 ret_str[str_len_sum + len] = i < argnum - 1 ? '_' : '\0';
1072 str_len_sum += len + 1;
1075 XDELETEVEC (args);
1076 XDELETEVEC (attr_str);
1077 return ret_str;
1081 /* This function returns true if FN1 and FN2 are versions of the same function,
1082 that is, the target strings of the function decls are different. This assumes
1083 that FN1 and FN2 have the same signature. */
1085 bool
1086 common_function_versions (tree fn1, tree fn2)
1088 tree attr1, attr2;
1089 char *target1, *target2;
1090 bool result;
1092 if (TREE_CODE (fn1) != FUNCTION_DECL
1093 || TREE_CODE (fn2) != FUNCTION_DECL)
1094 return false;
1096 attr1 = lookup_attribute ("target", DECL_ATTRIBUTES (fn1));
1097 attr2 = lookup_attribute ("target", DECL_ATTRIBUTES (fn2));
1099 /* At least one function decl should have the target attribute specified. */
1100 if (attr1 == NULL_TREE && attr2 == NULL_TREE)
1101 return false;
1103 /* Diagnose missing target attribute if one of the decls is already
1104 multi-versioned. */
1105 if (attr1 == NULL_TREE || attr2 == NULL_TREE)
1107 if (DECL_FUNCTION_VERSIONED (fn1) || DECL_FUNCTION_VERSIONED (fn2))
1109 if (attr2 != NULL_TREE)
1111 std::swap (fn1, fn2);
1112 attr1 = attr2;
1114 error_at (DECL_SOURCE_LOCATION (fn2),
1115 "missing %<target%> attribute for multi-versioned %qD",
1116 fn2);
1117 inform (DECL_SOURCE_LOCATION (fn1),
1118 "previous declaration of %qD", fn1);
1119 /* Prevent diagnosing of the same error multiple times. */
1120 DECL_ATTRIBUTES (fn2)
1121 = tree_cons (get_identifier ("target"),
1122 copy_node (TREE_VALUE (attr1)),
1123 DECL_ATTRIBUTES (fn2));
1125 return false;
1128 target1 = sorted_attr_string (TREE_VALUE (attr1));
1129 target2 = sorted_attr_string (TREE_VALUE (attr2));
1131 /* The sorted target strings must be different for fn1 and fn2
1132 to be versions. */
1133 if (strcmp (target1, target2) == 0)
1134 result = false;
1135 else
1136 result = true;
1138 XDELETEVEC (target1);
1139 XDELETEVEC (target2);
1141 return result;
1144 /* Make a dispatcher declaration for the multi-versioned function DECL.
1145 Calls to DECL function will be replaced with calls to the dispatcher
1146 by the front-end. Return the decl created. */
1148 tree
1149 make_dispatcher_decl (const tree decl)
1151 tree func_decl;
1152 char *func_name;
1153 tree fn_type, func_type;
1155 func_name = xstrdup (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
1157 fn_type = TREE_TYPE (decl);
1158 func_type = build_function_type (TREE_TYPE (fn_type),
1159 TYPE_ARG_TYPES (fn_type));
1161 func_decl = build_fn_decl (func_name, func_type);
1162 XDELETEVEC (func_name);
1163 TREE_USED (func_decl) = 1;
1164 DECL_CONTEXT (func_decl) = NULL_TREE;
1165 DECL_INITIAL (func_decl) = error_mark_node;
1166 DECL_ARTIFICIAL (func_decl) = 1;
1167 /* Mark this func as external, the resolver will flip it again if
1168 it gets generated. */
1169 DECL_EXTERNAL (func_decl) = 1;
1170 /* This will be of type IFUNCs have to be externally visible. */
1171 TREE_PUBLIC (func_decl) = 1;
1173 return func_decl;
1176 /* Returns true if decl is multi-versioned and DECL is the default function,
1177 that is it is not tagged with target specific optimization. */
1179 bool
1180 is_function_default_version (const tree decl)
1182 if (TREE_CODE (decl) != FUNCTION_DECL
1183 || !DECL_FUNCTION_VERSIONED (decl))
1184 return false;
1185 tree attr = lookup_attribute ("target", DECL_ATTRIBUTES (decl));
1186 gcc_assert (attr);
1187 attr = TREE_VALUE (TREE_VALUE (attr));
1188 return (TREE_CODE (attr) == STRING_CST
1189 && strcmp (TREE_STRING_POINTER (attr), "default") == 0);
1192 /* Return a declaration like DDECL except that its DECL_ATTRIBUTES
1193 is ATTRIBUTE. */
1195 tree
1196 build_decl_attribute_variant (tree ddecl, tree attribute)
1198 DECL_ATTRIBUTES (ddecl) = attribute;
1199 return ddecl;
1202 /* Return a type like TTYPE except that its TYPE_ATTRIBUTE
1203 is ATTRIBUTE and its qualifiers are QUALS.
1205 Record such modified types already made so we don't make duplicates. */
1207 tree
1208 build_type_attribute_qual_variant (tree otype, tree attribute, int quals)
1210 tree ttype = otype;
1211 if (! attribute_list_equal (TYPE_ATTRIBUTES (ttype), attribute))
1213 tree ntype;
1215 /* Building a distinct copy of a tagged type is inappropriate; it
1216 causes breakage in code that expects there to be a one-to-one
1217 relationship between a struct and its fields.
1218 build_duplicate_type is another solution (as used in
1219 handle_transparent_union_attribute), but that doesn't play well
1220 with the stronger C++ type identity model. */
1221 if (TREE_CODE (ttype) == RECORD_TYPE
1222 || TREE_CODE (ttype) == UNION_TYPE
1223 || TREE_CODE (ttype) == QUAL_UNION_TYPE
1224 || TREE_CODE (ttype) == ENUMERAL_TYPE)
1226 warning (OPT_Wattributes,
1227 "ignoring attributes applied to %qT after definition",
1228 TYPE_MAIN_VARIANT (ttype));
1229 return build_qualified_type (ttype, quals);
1232 ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
1233 if (lang_hooks.types.copy_lang_qualifiers
1234 && otype != TYPE_MAIN_VARIANT (otype))
1235 ttype = (lang_hooks.types.copy_lang_qualifiers
1236 (ttype, TYPE_MAIN_VARIANT (otype)));
1238 tree dtype = ntype = build_distinct_type_copy (ttype);
1240 TYPE_ATTRIBUTES (ntype) = attribute;
1242 hashval_t hash = type_hash_canon_hash (ntype);
1243 ntype = type_hash_canon (hash, ntype);
1245 if (ntype != dtype)
1246 /* This variant was already in the hash table, don't mess with
1247 TYPE_CANONICAL. */;
1248 else if (TYPE_STRUCTURAL_EQUALITY_P (ttype)
1249 || !comp_type_attributes (ntype, ttype))
1250 /* If the target-dependent attributes make NTYPE different from
1251 its canonical type, we will need to use structural equality
1252 checks for this type.
1254 We shouldn't get here for stripping attributes from a type;
1255 the no-attribute type might not need structural comparison. But
1256 we can if was discarded from type_hash_table. */
1257 SET_TYPE_STRUCTURAL_EQUALITY (ntype);
1258 else if (TYPE_CANONICAL (ntype) == ntype)
1259 TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
1261 ttype = build_qualified_type (ntype, quals);
1262 if (lang_hooks.types.copy_lang_qualifiers
1263 && otype != TYPE_MAIN_VARIANT (otype))
1264 ttype = lang_hooks.types.copy_lang_qualifiers (ttype, otype);
1266 else if (TYPE_QUALS (ttype) != quals)
1267 ttype = build_qualified_type (ttype, quals);
1269 return ttype;
1272 /* Compare two identifier nodes representing attributes.
1273 Return true if they are the same, false otherwise. */
1275 static bool
1276 cmp_attrib_identifiers (const_tree attr1, const_tree attr2)
1278 /* Make sure we're dealing with IDENTIFIER_NODEs. */
1279 gcc_checking_assert (TREE_CODE (attr1) == IDENTIFIER_NODE
1280 && TREE_CODE (attr2) == IDENTIFIER_NODE);
1282 /* Identifiers can be compared directly for equality. */
1283 if (attr1 == attr2)
1284 return true;
1286 return cmp_attribs (IDENTIFIER_POINTER (attr1), IDENTIFIER_LENGTH (attr1),
1287 IDENTIFIER_POINTER (attr2), IDENTIFIER_LENGTH (attr2));
1290 /* Compare two constructor-element-type constants. Return 1 if the lists
1291 are known to be equal; otherwise return 0. */
1293 static bool
1294 simple_cst_list_equal (const_tree l1, const_tree l2)
1296 while (l1 != NULL_TREE && l2 != NULL_TREE)
1298 if (simple_cst_equal (TREE_VALUE (l1), TREE_VALUE (l2)) != 1)
1299 return false;
1301 l1 = TREE_CHAIN (l1);
1302 l2 = TREE_CHAIN (l2);
1305 return l1 == l2;
1308 /* Check if "omp declare simd" attribute arguments, CLAUSES1 and CLAUSES2, are
1309 the same. */
1311 static bool
1312 omp_declare_simd_clauses_equal (tree clauses1, tree clauses2)
1314 tree cl1, cl2;
1315 for (cl1 = clauses1, cl2 = clauses2;
1316 cl1 && cl2;
1317 cl1 = OMP_CLAUSE_CHAIN (cl1), cl2 = OMP_CLAUSE_CHAIN (cl2))
1319 if (OMP_CLAUSE_CODE (cl1) != OMP_CLAUSE_CODE (cl2))
1320 return false;
1321 if (OMP_CLAUSE_CODE (cl1) != OMP_CLAUSE_SIMDLEN)
1323 if (simple_cst_equal (OMP_CLAUSE_DECL (cl1),
1324 OMP_CLAUSE_DECL (cl2)) != 1)
1325 return false;
1327 switch (OMP_CLAUSE_CODE (cl1))
1329 case OMP_CLAUSE_ALIGNED:
1330 if (simple_cst_equal (OMP_CLAUSE_ALIGNED_ALIGNMENT (cl1),
1331 OMP_CLAUSE_ALIGNED_ALIGNMENT (cl2)) != 1)
1332 return false;
1333 break;
1334 case OMP_CLAUSE_LINEAR:
1335 if (simple_cst_equal (OMP_CLAUSE_LINEAR_STEP (cl1),
1336 OMP_CLAUSE_LINEAR_STEP (cl2)) != 1)
1337 return false;
1338 break;
1339 case OMP_CLAUSE_SIMDLEN:
1340 if (simple_cst_equal (OMP_CLAUSE_SIMDLEN_EXPR (cl1),
1341 OMP_CLAUSE_SIMDLEN_EXPR (cl2)) != 1)
1342 return false;
1343 default:
1344 break;
1347 return true;
1351 /* Compare two attributes for their value identity. Return true if the
1352 attribute values are known to be equal; otherwise return false. */
1354 bool
1355 attribute_value_equal (const_tree attr1, const_tree attr2)
1357 if (TREE_VALUE (attr1) == TREE_VALUE (attr2))
1358 return true;
1360 if (TREE_VALUE (attr1) != NULL_TREE
1361 && TREE_CODE (TREE_VALUE (attr1)) == TREE_LIST
1362 && TREE_VALUE (attr2) != NULL_TREE
1363 && TREE_CODE (TREE_VALUE (attr2)) == TREE_LIST)
1365 /* Handle attribute format. */
1366 if (is_attribute_p ("format", get_attribute_name (attr1)))
1368 attr1 = TREE_VALUE (attr1);
1369 attr2 = TREE_VALUE (attr2);
1370 /* Compare the archetypes (printf/scanf/strftime/...). */
1371 if (!cmp_attrib_identifiers (TREE_VALUE (attr1), TREE_VALUE (attr2)))
1372 return false;
1373 /* Archetypes are the same. Compare the rest. */
1374 return (simple_cst_list_equal (TREE_CHAIN (attr1),
1375 TREE_CHAIN (attr2)) == 1);
1377 return (simple_cst_list_equal (TREE_VALUE (attr1),
1378 TREE_VALUE (attr2)) == 1);
1381 if (TREE_VALUE (attr1)
1382 && TREE_CODE (TREE_VALUE (attr1)) == OMP_CLAUSE
1383 && TREE_VALUE (attr2)
1384 && TREE_CODE (TREE_VALUE (attr2)) == OMP_CLAUSE)
1385 return omp_declare_simd_clauses_equal (TREE_VALUE (attr1),
1386 TREE_VALUE (attr2));
1388 return (simple_cst_equal (TREE_VALUE (attr1), TREE_VALUE (attr2)) == 1);
1391 /* Return 0 if the attributes for two types are incompatible, 1 if they
1392 are compatible, and 2 if they are nearly compatible (which causes a
1393 warning to be generated). */
1395 comp_type_attributes (const_tree type1, const_tree type2)
1397 const_tree a1 = TYPE_ATTRIBUTES (type1);
1398 const_tree a2 = TYPE_ATTRIBUTES (type2);
1399 const_tree a;
1401 if (a1 == a2)
1402 return 1;
1403 for (a = a1; a != NULL_TREE; a = TREE_CHAIN (a))
1405 const struct attribute_spec *as;
1406 const_tree attr;
1408 as = lookup_attribute_spec (get_attribute_name (a));
1409 if (!as || as->affects_type_identity == false)
1410 continue;
1412 attr = lookup_attribute (as->name, CONST_CAST_TREE (a2));
1413 if (!attr || !attribute_value_equal (a, attr))
1414 break;
1416 if (!a)
1418 for (a = a2; a != NULL_TREE; a = TREE_CHAIN (a))
1420 const struct attribute_spec *as;
1422 as = lookup_attribute_spec (get_attribute_name (a));
1423 if (!as || as->affects_type_identity == false)
1424 continue;
1426 if (!lookup_attribute (as->name, CONST_CAST_TREE (a1)))
1427 break;
1428 /* We don't need to compare trees again, as we did this
1429 already in first loop. */
1431 /* All types - affecting identity - are equal, so
1432 there is no need to call target hook for comparison. */
1433 if (!a)
1434 return 1;
1436 if (lookup_attribute ("transaction_safe", CONST_CAST_TREE (a)))
1437 return 0;
1438 if ((lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type1)) != NULL)
1439 ^ (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type2)) != NULL))
1440 return 0;
1441 /* As some type combinations - like default calling-convention - might
1442 be compatible, we have to call the target hook to get the final result. */
1443 return targetm.comp_type_attributes (type1, type2);
1446 /* PREDICATE acts as a function of type:
1448 (const_tree attr, const attribute_spec *as) -> bool
1450 where ATTR is an attribute and AS is its possibly-null specification.
1451 Return a list of every attribute in attribute list ATTRS for which
1452 PREDICATE is true. Return ATTRS itself if PREDICATE returns true
1453 for every attribute. */
1455 template<typename Predicate>
1456 tree
1457 remove_attributes_matching (tree attrs, Predicate predicate)
1459 tree new_attrs = NULL_TREE;
1460 tree *ptr = &new_attrs;
1461 const_tree start = attrs;
1462 for (const_tree attr = attrs; attr; attr = TREE_CHAIN (attr))
1464 tree name = get_attribute_name (attr);
1465 const attribute_spec *as = lookup_attribute_spec (name);
1466 const_tree end;
1467 if (!predicate (attr, as))
1468 end = attr;
1469 else if (start == attrs)
1470 continue;
1471 else
1472 end = TREE_CHAIN (attr);
1474 for (; start != end; start = TREE_CHAIN (start))
1476 *ptr = tree_cons (TREE_PURPOSE (start),
1477 TREE_VALUE (start), NULL_TREE);
1478 TREE_CHAIN (*ptr) = NULL_TREE;
1479 ptr = &TREE_CHAIN (*ptr);
1481 start = TREE_CHAIN (attr);
1483 gcc_assert (!start || start == attrs);
1484 return start ? attrs : new_attrs;
1487 /* If VALUE is true, return the subset of ATTRS that affect type identity,
1488 otherwise return the subset of ATTRS that don't affect type identity. */
1490 tree
1491 affects_type_identity_attributes (tree attrs, bool value)
1493 auto predicate = [value](const_tree, const attribute_spec *as) -> bool
1495 return bool (as && as->affects_type_identity) == value;
1497 return remove_attributes_matching (attrs, predicate);
1500 /* Remove attributes that affect type identity from ATTRS unless the
1501 same attributes occur in OK_ATTRS. */
1503 tree
1504 restrict_type_identity_attributes_to (tree attrs, tree ok_attrs)
1506 auto predicate = [ok_attrs](const_tree attr,
1507 const attribute_spec *as) -> bool
1509 if (!as || !as->affects_type_identity)
1510 return true;
1512 for (tree ok_attr = lookup_attribute (as->name, ok_attrs);
1513 ok_attr;
1514 ok_attr = lookup_attribute (as->name, TREE_CHAIN (ok_attr)))
1515 if (simple_cst_equal (TREE_VALUE (ok_attr), TREE_VALUE (attr)) == 1)
1516 return true;
1518 return false;
1520 return remove_attributes_matching (attrs, predicate);
1523 /* Return a type like TTYPE except that its TYPE_ATTRIBUTE
1524 is ATTRIBUTE.
1526 Record such modified types already made so we don't make duplicates. */
1528 tree
1529 build_type_attribute_variant (tree ttype, tree attribute)
1531 return build_type_attribute_qual_variant (ttype, attribute,
1532 TYPE_QUALS (ttype));
1535 /* A variant of lookup_attribute() that can be used with an identifier
1536 as the first argument, and where the identifier can be either
1537 'text' or '__text__'.
1539 Given an attribute ATTR_IDENTIFIER, and a list of attributes LIST,
1540 return a pointer to the attribute's list element if the attribute
1541 is part of the list, or NULL_TREE if not found. If the attribute
1542 appears more than once, this only returns the first occurrence; the
1543 TREE_CHAIN of the return value should be passed back in if further
1544 occurrences are wanted. ATTR_IDENTIFIER must be an identifier but
1545 can be in the form 'text' or '__text__'. */
1546 static tree
1547 lookup_ident_attribute (tree attr_identifier, tree list)
1549 gcc_checking_assert (TREE_CODE (attr_identifier) == IDENTIFIER_NODE);
1551 while (list)
1553 gcc_checking_assert (TREE_CODE (get_attribute_name (list))
1554 == IDENTIFIER_NODE);
1556 if (cmp_attrib_identifiers (attr_identifier,
1557 get_attribute_name (list)))
1558 /* Found it. */
1559 break;
1560 list = TREE_CHAIN (list);
1563 return list;
1566 /* Remove any instances of attribute ATTR_NAME in LIST and return the
1567 modified list. */
1569 tree
1570 remove_attribute (const char *attr_name, tree list)
1572 tree *p;
1573 gcc_checking_assert (attr_name[0] != '_');
1575 for (p = &list; *p;)
1577 tree l = *p;
1579 tree attr = get_attribute_name (l);
1580 if (is_attribute_p (attr_name, attr))
1581 *p = TREE_CHAIN (l);
1582 else
1583 p = &TREE_CHAIN (l);
1586 return list;
1589 /* Return an attribute list that is the union of a1 and a2. */
1591 tree
1592 merge_attributes (tree a1, tree a2)
1594 tree attributes;
1596 /* Either one unset? Take the set one. */
1598 if ((attributes = a1) == 0)
1599 attributes = a2;
1601 /* One that completely contains the other? Take it. */
1603 else if (a2 != 0 && ! attribute_list_contained (a1, a2))
1605 if (attribute_list_contained (a2, a1))
1606 attributes = a2;
1607 else
1609 /* Pick the longest list, and hang on the other list. */
1611 if (list_length (a1) < list_length (a2))
1612 attributes = a2, a2 = a1;
1614 for (; a2 != 0; a2 = TREE_CHAIN (a2))
1616 tree a;
1617 for (a = lookup_ident_attribute (get_attribute_name (a2),
1618 attributes);
1619 a != NULL_TREE && !attribute_value_equal (a, a2);
1620 a = lookup_ident_attribute (get_attribute_name (a2),
1621 TREE_CHAIN (a)))
1623 if (a == NULL_TREE)
1625 a1 = copy_node (a2);
1626 TREE_CHAIN (a1) = attributes;
1627 attributes = a1;
1632 return attributes;
1635 /* Given types T1 and T2, merge their attributes and return
1636 the result. */
1638 tree
1639 merge_type_attributes (tree t1, tree t2)
1641 return merge_attributes (TYPE_ATTRIBUTES (t1),
1642 TYPE_ATTRIBUTES (t2));
1645 /* Given decls OLDDECL and NEWDECL, merge their attributes and return
1646 the result. */
1648 tree
1649 merge_decl_attributes (tree olddecl, tree newdecl)
1651 return merge_attributes (DECL_ATTRIBUTES (olddecl),
1652 DECL_ATTRIBUTES (newdecl));
1655 /* Duplicate all attributes with name NAME in ATTR list to *ATTRS if
1656 they are missing there. */
1658 void
1659 duplicate_one_attribute (tree *attrs, tree attr, const char *name)
1661 attr = lookup_attribute (name, attr);
1662 if (!attr)
1663 return;
1664 tree a = lookup_attribute (name, *attrs);
1665 while (attr)
1667 tree a2;
1668 for (a2 = a; a2; a2 = lookup_attribute (name, TREE_CHAIN (a2)))
1669 if (attribute_value_equal (attr, a2))
1670 break;
1671 if (!a2)
1673 a2 = copy_node (attr);
1674 TREE_CHAIN (a2) = *attrs;
1675 *attrs = a2;
1677 attr = lookup_attribute (name, TREE_CHAIN (attr));
1681 /* Duplicate all attributes from user DECL to the corresponding
1682 builtin that should be propagated. */
1684 void
1685 copy_attributes_to_builtin (tree decl)
1687 tree b = builtin_decl_explicit (DECL_FUNCTION_CODE (decl));
1688 if (b)
1689 duplicate_one_attribute (&DECL_ATTRIBUTES (b),
1690 DECL_ATTRIBUTES (decl), "omp declare simd");
1693 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
1695 /* Specialization of merge_decl_attributes for various Windows targets.
1697 This handles the following situation:
1699 __declspec (dllimport) int foo;
1700 int foo;
1702 The second instance of `foo' nullifies the dllimport. */
1704 tree
1705 merge_dllimport_decl_attributes (tree old, tree new_tree)
1707 tree a;
1708 int delete_dllimport_p = 1;
1710 /* What we need to do here is remove from `old' dllimport if it doesn't
1711 appear in `new'. dllimport behaves like extern: if a declaration is
1712 marked dllimport and a definition appears later, then the object
1713 is not dllimport'd. We also remove a `new' dllimport if the old list
1714 contains dllexport: dllexport always overrides dllimport, regardless
1715 of the order of declaration. */
1716 if (!VAR_OR_FUNCTION_DECL_P (new_tree))
1717 delete_dllimport_p = 0;
1718 else if (DECL_DLLIMPORT_P (new_tree)
1719 && lookup_attribute ("dllexport", DECL_ATTRIBUTES (old)))
1721 DECL_DLLIMPORT_P (new_tree) = 0;
1722 warning (OPT_Wattributes, "%q+D already declared with dllexport "
1723 "attribute: dllimport ignored", new_tree);
1725 else if (DECL_DLLIMPORT_P (old) && !DECL_DLLIMPORT_P (new_tree))
1727 /* Warn about overriding a symbol that has already been used, e.g.:
1728 extern int __attribute__ ((dllimport)) foo;
1729 int* bar () {return &foo;}
1730 int foo;
1732 if (TREE_USED (old))
1734 warning (0, "%q+D redeclared without dllimport attribute "
1735 "after being referenced with dll linkage", new_tree);
1736 /* If we have used a variable's address with dllimport linkage,
1737 keep the old DECL_DLLIMPORT_P flag: the ADDR_EXPR using the
1738 decl may already have had TREE_CONSTANT computed.
1739 We still remove the attribute so that assembler code refers
1740 to '&foo rather than '_imp__foo'. */
1741 if (VAR_P (old) && TREE_ADDRESSABLE (old))
1742 DECL_DLLIMPORT_P (new_tree) = 1;
1745 /* Let an inline definition silently override the external reference,
1746 but otherwise warn about attribute inconsistency. */
1747 else if (VAR_P (new_tree) || !DECL_DECLARED_INLINE_P (new_tree))
1748 warning (OPT_Wattributes, "%q+D redeclared without dllimport "
1749 "attribute: previous dllimport ignored", new_tree);
1751 else
1752 delete_dllimport_p = 0;
1754 a = merge_attributes (DECL_ATTRIBUTES (old), DECL_ATTRIBUTES (new_tree));
1756 if (delete_dllimport_p)
1757 a = remove_attribute ("dllimport", a);
1759 return a;
1762 /* Handle a "dllimport" or "dllexport" attribute; arguments as in
1763 struct attribute_spec.handler. */
1765 tree
1766 handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
1767 bool *no_add_attrs)
1769 tree node = *pnode;
1770 bool is_dllimport;
1772 /* These attributes may apply to structure and union types being created,
1773 but otherwise should pass to the declaration involved. */
1774 if (!DECL_P (node))
1776 if (flags & ((int) ATTR_FLAG_DECL_NEXT | (int) ATTR_FLAG_FUNCTION_NEXT
1777 | (int) ATTR_FLAG_ARRAY_NEXT))
1779 *no_add_attrs = true;
1780 return tree_cons (name, args, NULL_TREE);
1782 if (TREE_CODE (node) == RECORD_TYPE
1783 || TREE_CODE (node) == UNION_TYPE)
1785 node = TYPE_NAME (node);
1786 if (!node)
1787 return NULL_TREE;
1789 else
1791 warning (OPT_Wattributes, "%qE attribute ignored",
1792 name);
1793 *no_add_attrs = true;
1794 return NULL_TREE;
1798 if (!VAR_OR_FUNCTION_DECL_P (node) && TREE_CODE (node) != TYPE_DECL)
1800 *no_add_attrs = true;
1801 warning (OPT_Wattributes, "%qE attribute ignored",
1802 name);
1803 return NULL_TREE;
1806 if (TREE_CODE (node) == TYPE_DECL
1807 && TREE_CODE (TREE_TYPE (node)) != RECORD_TYPE
1808 && TREE_CODE (TREE_TYPE (node)) != UNION_TYPE)
1810 *no_add_attrs = true;
1811 warning (OPT_Wattributes, "%qE attribute ignored",
1812 name);
1813 return NULL_TREE;
1816 is_dllimport = is_attribute_p ("dllimport", name);
1818 /* Report error on dllimport ambiguities seen now before they cause
1819 any damage. */
1820 if (is_dllimport)
1822 /* Honor any target-specific overrides. */
1823 if (!targetm.valid_dllimport_attribute_p (node))
1824 *no_add_attrs = true;
1826 else if (TREE_CODE (node) == FUNCTION_DECL
1827 && DECL_DECLARED_INLINE_P (node))
1829 warning (OPT_Wattributes, "inline function %q+D declared as "
1830 "dllimport: attribute ignored", node);
1831 *no_add_attrs = true;
1833 /* Like MS, treat definition of dllimported variables and
1834 non-inlined functions on declaration as syntax errors. */
1835 else if (TREE_CODE (node) == FUNCTION_DECL && DECL_INITIAL (node))
1837 error ("function %q+D definition is marked dllimport", node);
1838 *no_add_attrs = true;
1841 else if (VAR_P (node))
1843 if (DECL_INITIAL (node))
1845 error ("variable %q+D definition is marked dllimport",
1846 node);
1847 *no_add_attrs = true;
1850 /* `extern' needn't be specified with dllimport.
1851 Specify `extern' now and hope for the best. Sigh. */
1852 DECL_EXTERNAL (node) = 1;
1853 /* Also, implicitly give dllimport'd variables declared within
1854 a function global scope, unless declared static. */
1855 if (current_function_decl != NULL_TREE && !TREE_STATIC (node))
1856 TREE_PUBLIC (node) = 1;
1857 /* Clear TREE_STATIC because DECL_EXTERNAL is set, unless
1858 it is a C++ static data member. */
1859 if (DECL_CONTEXT (node) == NULL_TREE
1860 || !RECORD_OR_UNION_TYPE_P (DECL_CONTEXT (node)))
1861 TREE_STATIC (node) = 0;
1864 if (*no_add_attrs == false)
1865 DECL_DLLIMPORT_P (node) = 1;
1867 else if (TREE_CODE (node) == FUNCTION_DECL
1868 && DECL_DECLARED_INLINE_P (node)
1869 && flag_keep_inline_dllexport)
1870 /* An exported function, even if inline, must be emitted. */
1871 DECL_EXTERNAL (node) = 0;
1873 /* Report error if symbol is not accessible at global scope. */
1874 if (!TREE_PUBLIC (node) && VAR_OR_FUNCTION_DECL_P (node))
1876 error ("external linkage required for symbol %q+D because of "
1877 "%qE attribute", node, name);
1878 *no_add_attrs = true;
1881 /* A dllexport'd entity must have default visibility so that other
1882 program units (shared libraries or the main executable) can see
1883 it. A dllimport'd entity must have default visibility so that
1884 the linker knows that undefined references within this program
1885 unit can be resolved by the dynamic linker. */
1886 if (!*no_add_attrs)
1888 if (DECL_VISIBILITY_SPECIFIED (node)
1889 && DECL_VISIBILITY (node) != VISIBILITY_DEFAULT)
1890 error ("%qE implies default visibility, but %qD has already "
1891 "been declared with a different visibility",
1892 name, node);
1893 DECL_VISIBILITY (node) = VISIBILITY_DEFAULT;
1894 DECL_VISIBILITY_SPECIFIED (node) = 1;
1897 return NULL_TREE;
1900 #endif /* TARGET_DLLIMPORT_DECL_ATTRIBUTES */
1902 /* Given two lists of attributes, return true if list l2 is
1903 equivalent to l1. */
1906 attribute_list_equal (const_tree l1, const_tree l2)
1908 if (l1 == l2)
1909 return 1;
1911 return attribute_list_contained (l1, l2)
1912 && attribute_list_contained (l2, l1);
1915 /* Given two lists of attributes, return true if list L2 is
1916 completely contained within L1. */
1917 /* ??? This would be faster if attribute names were stored in a canonicalized
1918 form. Otherwise, if L1 uses `foo' and L2 uses `__foo__', the long method
1919 must be used to show these elements are equivalent (which they are). */
1920 /* ??? It's not clear that attributes with arguments will always be handled
1921 correctly. */
1924 attribute_list_contained (const_tree l1, const_tree l2)
1926 const_tree t1, t2;
1928 /* First check the obvious, maybe the lists are identical. */
1929 if (l1 == l2)
1930 return 1;
1932 /* Maybe the lists are similar. */
1933 for (t1 = l1, t2 = l2;
1934 t1 != 0 && t2 != 0
1935 && get_attribute_name (t1) == get_attribute_name (t2)
1936 && TREE_VALUE (t1) == TREE_VALUE (t2);
1937 t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1940 /* Maybe the lists are equal. */
1941 if (t1 == 0 && t2 == 0)
1942 return 1;
1944 for (; t2 != 0; t2 = TREE_CHAIN (t2))
1946 const_tree attr;
1947 /* This CONST_CAST is okay because lookup_attribute does not
1948 modify its argument and the return value is assigned to a
1949 const_tree. */
1950 for (attr = lookup_ident_attribute (get_attribute_name (t2),
1951 CONST_CAST_TREE (l1));
1952 attr != NULL_TREE && !attribute_value_equal (t2, attr);
1953 attr = lookup_ident_attribute (get_attribute_name (t2),
1954 TREE_CHAIN (attr)))
1957 if (attr == NULL_TREE)
1958 return 0;
1961 return 1;
1964 /* The backbone of lookup_attribute(). ATTR_LEN is the string length
1965 of ATTR_NAME, and LIST is not NULL_TREE.
1967 The function is called from lookup_attribute in order to optimize
1968 for size. */
1970 tree
1971 private_lookup_attribute (const char *attr_name, size_t attr_len, tree list)
1973 while (list)
1975 tree attr = get_attribute_name (list);
1976 size_t ident_len = IDENTIFIER_LENGTH (attr);
1977 if (cmp_attribs (attr_name, attr_len, IDENTIFIER_POINTER (attr),
1978 ident_len))
1979 break;
1980 list = TREE_CHAIN (list);
1983 return list;
1986 /* Return true if the function decl or type NODE has been declared
1987 with attribute ANAME among attributes ATTRS. */
1989 static bool
1990 has_attribute (tree node, tree attrs, const char *aname)
1992 if (!strcmp (aname, "const"))
1994 if (DECL_P (node) && TREE_READONLY (node))
1995 return true;
1997 else if (!strcmp (aname, "malloc"))
1999 if (DECL_P (node) && DECL_IS_MALLOC (node))
2000 return true;
2002 else if (!strcmp (aname, "noreturn"))
2004 if (DECL_P (node) && TREE_THIS_VOLATILE (node))
2005 return true;
2007 else if (!strcmp (aname, "nothrow"))
2009 if (TREE_NOTHROW (node))
2010 return true;
2012 else if (!strcmp (aname, "pure"))
2014 if (DECL_P (node) && DECL_PURE_P (node))
2015 return true;
2018 return lookup_attribute (aname, attrs);
2021 /* Return the number of mismatched function or type attributes between
2022 the "template" function declaration TMPL and DECL. The word "template"
2023 doesn't necessarily refer to a C++ template but rather a declaration
2024 whose attributes should be matched by those on DECL. For a non-zero
2025 return value set *ATTRSTR to a string representation of the list of
2026 mismatched attributes with quoted names.
2027 ATTRLIST is a list of additional attributes that SPEC should be
2028 taken to ultimately be declared with. */
2030 unsigned
2031 decls_mismatched_attributes (tree tmpl, tree decl, tree attrlist,
2032 const char* const blacklist[],
2033 pretty_printer *attrstr)
2035 if (TREE_CODE (tmpl) != FUNCTION_DECL)
2036 return 0;
2038 /* Avoid warning if either declaration or its type is deprecated. */
2039 if (TREE_DEPRECATED (tmpl)
2040 || TREE_DEPRECATED (decl))
2041 return 0;
2043 const tree tmpls[] = { tmpl, TREE_TYPE (tmpl) };
2044 const tree decls[] = { decl, TREE_TYPE (decl) };
2046 if (TREE_DEPRECATED (tmpls[1])
2047 || TREE_DEPRECATED (decls[1])
2048 || TREE_DEPRECATED (TREE_TYPE (tmpls[1]))
2049 || TREE_DEPRECATED (TREE_TYPE (decls[1])))
2050 return 0;
2052 tree tmpl_attrs[] = { DECL_ATTRIBUTES (tmpl), TYPE_ATTRIBUTES (tmpls[1]) };
2053 tree decl_attrs[] = { DECL_ATTRIBUTES (decl), TYPE_ATTRIBUTES (decls[1]) };
2055 if (!decl_attrs[0])
2056 decl_attrs[0] = attrlist;
2057 else if (!decl_attrs[1])
2058 decl_attrs[1] = attrlist;
2060 /* Avoid warning if the template has no attributes. */
2061 if (!tmpl_attrs[0] && !tmpl_attrs[1])
2062 return 0;
2064 /* Avoid warning if either declaration contains an attribute on
2065 the white list below. */
2066 const char* const whitelist[] = {
2067 "error", "warning"
2070 for (unsigned i = 0; i != 2; ++i)
2071 for (unsigned j = 0; j != sizeof whitelist / sizeof *whitelist; ++j)
2072 if (lookup_attribute (whitelist[j], tmpl_attrs[i])
2073 || lookup_attribute (whitelist[j], decl_attrs[i]))
2074 return 0;
2076 /* Put together a list of the black-listed attributes that the template
2077 is declared with and the declaration is not, in case it's not apparent
2078 from the most recent declaration of the template. */
2079 unsigned nattrs = 0;
2081 for (unsigned i = 0; blacklist[i]; ++i)
2083 /* Attribute leaf only applies to extern functions. Avoid mentioning
2084 it when it's missing from a static declaration. */
2085 if (!TREE_PUBLIC (decl)
2086 && !strcmp ("leaf", blacklist[i]))
2087 continue;
2089 for (unsigned j = 0; j != 2; ++j)
2091 if (!has_attribute (tmpls[j], tmpl_attrs[j], blacklist[i]))
2092 continue;
2094 bool found = false;
2095 unsigned kmax = 1 + !!decl_attrs[1];
2096 for (unsigned k = 0; k != kmax; ++k)
2098 if (has_attribute (decls[k], decl_attrs[k], blacklist[i]))
2100 found = true;
2101 break;
2105 if (!found)
2107 if (nattrs)
2108 pp_string (attrstr, ", ");
2109 pp_begin_quote (attrstr, pp_show_color (global_dc->printer));
2110 pp_string (attrstr, blacklist[i]);
2111 pp_end_quote (attrstr, pp_show_color (global_dc->printer));
2112 ++nattrs;
2115 break;
2119 return nattrs;
2122 /* Issue a warning for the declaration ALIAS for TARGET where ALIAS
2123 specifies either attributes that are incompatible with those of
2124 TARGET, or attributes that are missing and that declaring ALIAS
2125 with would benefit. */
2127 void
2128 maybe_diag_alias_attributes (tree alias, tree target)
2130 /* Do not expect attributes to match between aliases and ifunc
2131 resolvers. There is no obvious correspondence between them. */
2132 if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (alias)))
2133 return;
2135 const char* const blacklist[] = {
2136 "alloc_align", "alloc_size", "cold", "const", "hot", "leaf", "malloc",
2137 "nonnull", "noreturn", "nothrow", "pure", "returns_nonnull",
2138 "returns_twice", NULL
2141 pretty_printer attrnames;
2142 if (warn_attribute_alias > 1)
2144 /* With -Wattribute-alias=2 detect alias declarations that are more
2145 restrictive than their targets first. Those indicate potential
2146 codegen bugs. */
2147 if (unsigned n = decls_mismatched_attributes (alias, target, NULL_TREE,
2148 blacklist, &attrnames))
2150 auto_diagnostic_group d;
2151 if (warning_n (DECL_SOURCE_LOCATION (alias),
2152 OPT_Wattribute_alias_, n,
2153 "%qD specifies more restrictive attribute than "
2154 "its target %qD: %s",
2155 "%qD specifies more restrictive attributes than "
2156 "its target %qD: %s",
2157 alias, target, pp_formatted_text (&attrnames)))
2158 inform (DECL_SOURCE_LOCATION (target),
2159 "%qD target declared here", alias);
2160 return;
2164 /* Detect alias declarations that are less restrictive than their
2165 targets. Those suggest potential optimization opportunities
2166 (solved by adding the missing attribute(s) to the alias). */
2167 if (unsigned n = decls_mismatched_attributes (target, alias, NULL_TREE,
2168 blacklist, &attrnames))
2170 auto_diagnostic_group d;
2171 if (warning_n (DECL_SOURCE_LOCATION (alias),
2172 OPT_Wmissing_attributes, n,
2173 "%qD specifies less restrictive attribute than "
2174 "its target %qD: %s",
2175 "%qD specifies less restrictive attributes than "
2176 "its target %qD: %s",
2177 alias, target, pp_formatted_text (&attrnames)))
2178 inform (DECL_SOURCE_LOCATION (target),
2179 "%qD target declared here", alias);
2183 /* Initialize a mapping RWM for a call to a function declared with
2184 attribute access in ATTRS. Each attribute positional operand
2185 inserts one entry into the mapping with the operand number as
2186 the key. */
2188 void
2189 init_attr_rdwr_indices (rdwr_map *rwm, tree attrs)
2191 if (!attrs)
2192 return;
2194 for (tree access = attrs;
2195 (access = lookup_attribute ("access", access));
2196 access = TREE_CHAIN (access))
2198 /* The TREE_VALUE of an attribute is a TREE_LIST whose TREE_VALUE
2199 is the attribute argument's value. */
2200 tree mode = TREE_VALUE (access);
2201 if (!mode)
2202 return;
2204 /* The (optional) list of VLA bounds. */
2205 tree vblist = TREE_CHAIN (mode);
2206 mode = TREE_VALUE (mode);
2207 if (TREE_CODE (mode) != STRING_CST)
2208 continue;
2209 gcc_assert (TREE_CODE (mode) == STRING_CST);
2211 if (vblist)
2212 vblist = nreverse (copy_list (TREE_VALUE (vblist)));
2214 for (const char *m = TREE_STRING_POINTER (mode); *m; )
2216 attr_access acc = { };
2218 /* Skip the internal-only plus sign. */
2219 if (*m == '+')
2220 ++m;
2222 acc.str = m;
2223 acc.mode = acc.from_mode_char (*m);
2224 acc.sizarg = UINT_MAX;
2226 const char *end;
2227 acc.ptrarg = strtoul (++m, const_cast<char**>(&end), 10);
2228 m = end;
2230 if (*m == '[')
2232 /* Forms containing the square bracket are internal-only
2233 (not specified by an attribute declaration), and used
2234 for various forms of array and VLA parameters. */
2235 acc.internal_p = true;
2237 /* Search to the closing bracket and look at the preceding
2238 code: it determines the form of the most significant
2239 bound of the array. Others prior to it encode the form
2240 of interior VLA bounds. They're not of interest here. */
2241 end = strchr (m, ']');
2242 const char *p = end;
2243 gcc_assert (p);
2245 while (ISDIGIT (p[-1]))
2246 --p;
2248 if (ISDIGIT (*p))
2250 /* A digit denotes a constant bound (as in T[3]). */
2251 acc.static_p = p[-1] == 's';
2252 acc.minsize = strtoull (p, NULL, 10);
2254 else if (' ' == p[-1])
2256 /* A space denotes an ordinary array of unspecified bound
2257 (as in T[]). */
2258 acc.minsize = 0;
2260 else if ('*' == p[-1] || '$' == p[-1])
2262 /* An asterisk denotes a VLA. When the closing bracket
2263 is followed by a comma and a dollar sign its bound is
2264 on the list. Otherwise it's a VLA with an unspecified
2265 bound. */
2266 acc.static_p = p[-2] == 's';
2267 acc.minsize = HOST_WIDE_INT_M1U;
2270 m = end + 1;
2273 if (*m == ',')
2275 ++m;
2278 if (*m == '$')
2280 ++m;
2281 if (!acc.size && vblist)
2283 /* Extract the list of VLA bounds for the current
2284 parameter, store it in ACC.SIZE, and advance
2285 to the list of bounds for the next VLA parameter.
2287 acc.size = TREE_VALUE (vblist);
2288 vblist = TREE_CHAIN (vblist);
2292 if (ISDIGIT (*m))
2294 /* Extract the positional argument. It's absent
2295 for VLAs whose bound doesn't name a function
2296 parameter. */
2297 unsigned pos = strtoul (m, const_cast<char**>(&end), 10);
2298 if (acc.sizarg == UINT_MAX)
2299 acc.sizarg = pos;
2300 m = end;
2303 while (*m == '$');
2306 acc.end = m;
2308 bool existing;
2309 auto &ref = rwm->get_or_insert (acc.ptrarg, &existing);
2310 if (existing)
2312 /* Merge the new spec with the existing. */
2313 if (acc.minsize == HOST_WIDE_INT_M1U)
2314 ref.minsize = HOST_WIDE_INT_M1U;
2316 if (acc.sizarg != UINT_MAX)
2317 ref.sizarg = acc.sizarg;
2319 if (acc.mode)
2320 ref.mode = acc.mode;
2322 else
2323 ref = acc;
2325 /* Unconditionally add an entry for the required pointer
2326 operand of the attribute, and one for the optional size
2327 operand when it's specified. */
2328 if (acc.sizarg != UINT_MAX)
2329 rwm->put (acc.sizarg, acc);
2334 /* Return the access specification for a function parameter PARM
2335 or null if the current function has no such specification. */
2337 attr_access *
2338 get_parm_access (rdwr_map &rdwr_idx, tree parm,
2339 tree fndecl /* = current_function_decl */)
2341 tree fntype = TREE_TYPE (fndecl);
2342 init_attr_rdwr_indices (&rdwr_idx, TYPE_ATTRIBUTES (fntype));
2344 if (rdwr_idx.is_empty ())
2345 return NULL;
2347 unsigned argpos = 0;
2348 tree fnargs = DECL_ARGUMENTS (fndecl);
2349 for (tree arg = fnargs; arg; arg = TREE_CHAIN (arg), ++argpos)
2350 if (arg == parm)
2351 return rdwr_idx.get (argpos);
2353 return NULL;
2356 /* Return the internal representation as STRING_CST. Internal positional
2357 arguments are zero-based. */
2359 tree
2360 attr_access::to_internal_string () const
2362 return build_string (end - str, str);
2365 /* Return the human-readable representation of the external attribute
2366 specification (as it might appear in the source code) as STRING_CST.
2367 External positional arguments are one-based. */
2369 tree
2370 attr_access::to_external_string () const
2372 char buf[80];
2373 gcc_assert (mode != access_deferred);
2374 int len = snprintf (buf, sizeof buf, "access (%s, %u",
2375 mode_names[mode], ptrarg + 1);
2376 if (sizarg != UINT_MAX)
2377 len += snprintf (buf + len, sizeof buf - len, ", %u", sizarg + 1);
2378 strcpy (buf + len, ")");
2379 return build_string (len + 2, buf);
2382 /* Return the number of specified VLA bounds and set *nunspec to
2383 the number of unspecified ones (those designated by [*]). */
2385 unsigned
2386 attr_access::vla_bounds (unsigned *nunspec) const
2388 unsigned nbounds = 0;
2389 *nunspec = 0;
2390 /* STR points to the beginning of the specified string for the current
2391 argument that may be followed by the string for the next argument. */
2392 for (const char* p = strchr (str, ']'); p && *p != '['; --p)
2394 if (*p == '*')
2395 ++*nunspec;
2396 else if (*p == '$')
2397 ++nbounds;
2399 return nbounds;
2402 /* Reset front end-specific attribute access data from ATTRS.
2403 Called from the free_lang_data pass. */
2405 /* static */ void
2406 attr_access::free_lang_data (tree attrs)
2408 for (tree acs = attrs; (acs = lookup_attribute ("access", acs));
2409 acs = TREE_CHAIN (acs))
2411 tree vblist = TREE_VALUE (acs);
2412 vblist = TREE_CHAIN (vblist);
2413 if (!vblist)
2414 continue;
2416 for (vblist = TREE_VALUE (vblist); vblist; vblist = TREE_CHAIN (vblist))
2418 tree *pvbnd = &TREE_VALUE (vblist);
2419 if (!*pvbnd || DECL_P (*pvbnd))
2420 continue;
2422 /* VLA bounds that are expressions as opposed to DECLs are
2423 only used in the front end. Reset them to keep front end
2424 trees leaking into the middle end (see pr97172) and to
2425 free up memory. */
2426 *pvbnd = NULL_TREE;
2430 for (tree argspec = attrs; (argspec = lookup_attribute ("arg spec", argspec));
2431 argspec = TREE_CHAIN (argspec))
2433 /* Same as above. */
2434 tree *pvblist = &TREE_VALUE (argspec);
2435 *pvblist = NULL_TREE;
2439 /* Defined in attr_access. */
2440 constexpr char attr_access::mode_chars[];
2441 constexpr char attr_access::mode_names[][11];
2443 /* Format an array, including a VLA, pointed to by TYPE and used as
2444 a function parameter as a human-readable string. ACC describes
2445 an access to the parameter and is used to determine the outermost
2446 form of the array including its bound which is otherwise obviated
2447 by its decay to pointer. Return the formatted string. */
2449 std::string
2450 attr_access::array_as_string (tree type) const
2452 std::string typstr;
2454 if (type == error_mark_node)
2455 return std::string ();
2457 if (this->str)
2459 /* For array parameters (but not pointers) create a temporary array
2460 type that corresponds to the form of the parameter including its
2461 qualifiers even though they apply to the pointer, not the array
2462 type. */
2463 const bool vla_p = minsize == HOST_WIDE_INT_M1U;
2464 tree eltype = TREE_TYPE (type);
2465 tree index_type = NULL_TREE;
2467 if (minsize == HOST_WIDE_INT_M1U)
2469 /* Determine if this is a VLA (an array whose most significant
2470 bound is nonconstant and whose access string has "$]" in it)
2471 extract the bound expression from SIZE. */
2472 const char *p = end;
2473 for ( ; p != str && *p-- != ']'; );
2474 if (*p == '$')
2475 /* SIZE may have been cleared. Use it with care. */
2476 index_type = build_index_type (size ? TREE_VALUE (size) : size);
2478 else if (minsize)
2479 index_type = build_index_type (size_int (minsize - 1));
2481 tree arat = NULL_TREE;
2482 if (static_p || vla_p)
2484 tree flag = static_p ? integer_one_node : NULL_TREE;
2485 /* Hack: there's no language-independent way to encode
2486 the "static" specifier or the "*" notation in an array type.
2487 Add a "fake" attribute to have the pretty-printer add "static"
2488 or "*". The "[static N]" notation is only valid in the most
2489 significant bound but [*] can be used for any bound. Because
2490 [*] is represented the same as [0] this hack only works for
2491 the most significant bound like static and the others are
2492 rendered as [0]. */
2493 arat = build_tree_list (get_identifier ("array"), flag);
2496 const int quals = TYPE_QUALS (type);
2497 type = build_array_type (eltype, index_type);
2498 type = build_type_attribute_qual_variant (type, arat, quals);
2501 /* Format the type using the current pretty printer. The generic tree
2502 printer does a terrible job. */
2503 pretty_printer *pp = global_dc->printer->clone ();
2504 pp_printf (pp, "%qT", type);
2505 typstr = pp_formatted_text (pp);
2506 delete pp;
2508 return typstr;
2511 #if CHECKING_P
2513 namespace selftest
2516 /* Helper types to verify the consistency attribute exclusions. */
2518 typedef std::pair<const char *, const char *> excl_pair;
2520 struct excl_hash_traits: typed_noop_remove<excl_pair>
2522 typedef excl_pair value_type;
2523 typedef value_type compare_type;
2525 static hashval_t hash (const value_type &x)
2527 hashval_t h1 = htab_hash_string (x.first);
2528 hashval_t h2 = htab_hash_string (x.second);
2529 return h1 ^ h2;
2532 static bool equal (const value_type &x, const value_type &y)
2534 return !strcmp (x.first, y.first) && !strcmp (x.second, y.second);
2537 static void mark_deleted (value_type &x)
2539 x = value_type (NULL, NULL);
2542 static const bool empty_zero_p = false;
2544 static void mark_empty (value_type &x)
2546 x = value_type ("", "");
2549 static bool is_deleted (const value_type &x)
2551 return !x.first && !x.second;
2554 static bool is_empty (const value_type &x)
2556 return !*x.first && !*x.second;
2561 /* Self-test to verify that each attribute exclusion is symmetric,
2562 meaning that if attribute A is encoded as incompatible with
2563 attribute B then the opposite relationship is also encoded.
2564 This test also detects most cases of misspelled attribute names
2565 in exclusions. */
2567 static void
2568 test_attribute_exclusions ()
2570 /* Iterate over the array of attribute tables first (with TI0 as
2571 the index) and over the array of attribute_spec in each table
2572 (with SI0 as the index). */
2573 const size_t ntables = ARRAY_SIZE (attribute_tables);
2575 /* Set of pairs of mutually exclusive attributes. */
2576 typedef hash_set<excl_pair, false, excl_hash_traits> exclusion_set;
2577 exclusion_set excl_set;
2579 for (size_t ti0 = 0; ti0 != ntables; ++ti0)
2580 for (size_t s0 = 0; attribute_tables[ti0][s0].name; ++s0)
2582 const attribute_spec::exclusions *excl
2583 = attribute_tables[ti0][s0].exclude;
2585 /* Skip each attribute that doesn't define exclusions. */
2586 if (!excl)
2587 continue;
2589 const char *attr_name = attribute_tables[ti0][s0].name;
2591 /* Iterate over the set of exclusions for every attribute
2592 (with EI0 as the index) adding the exclusions defined
2593 for each to the set. */
2594 for (size_t ei0 = 0; excl[ei0].name; ++ei0)
2596 const char *excl_name = excl[ei0].name;
2598 if (!strcmp (attr_name, excl_name))
2599 continue;
2601 excl_set.add (excl_pair (attr_name, excl_name));
2605 /* Traverse the set of mutually exclusive pairs of attributes
2606 and verify that they are symmetric. */
2607 for (exclusion_set::iterator it = excl_set.begin ();
2608 it != excl_set.end ();
2609 ++it)
2611 if (!excl_set.contains (excl_pair ((*it).second, (*it).first)))
2613 /* An exclusion for an attribute has been found that
2614 doesn't have a corresponding exclusion in the opposite
2615 direction. */
2616 char desc[120];
2617 sprintf (desc, "'%s' attribute exclusion '%s' must be symmetric",
2618 (*it).first, (*it).second);
2619 fail (SELFTEST_LOCATION, desc);
2624 void
2625 attribute_c_tests ()
2627 test_attribute_exclusions ();
2630 } /* namespace selftest */
2632 #endif /* CHECKING_P */