xref: /netbsd/external/gpl3/gcc/dist/gcc/attribs.c (revision dd083157)
1 /* Functions dealing with attribute handling, used by most front ends.
2    Copyright (C) 1992-2020 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
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.
10 
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.
15 
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/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "target.h"
24 #include "tree.h"
25 #include "stringpool.h"
26 #include "diagnostic-core.h"
27 #include "attribs.h"
28 #include "stor-layout.h"
29 #include "langhooks.h"
30 #include "plugin.h"
31 #include "selftest.h"
32 #include "hash-set.h"
33 #include "diagnostic.h"
34 #include "pretty-print.h"
35 #include "intl.h"
36 
37 /* Table of the tables of attributes (common, language, format, machine)
38    searched.  */
39 static const struct attribute_spec *attribute_tables[4];
40 
41 /* Substring representation.  */
42 
43 struct substring
44 {
45   const char *str;
46   int length;
47 };
48 
49 /* Simple hash function to avoid need to scan whole string.  */
50 
51 static inline hashval_t
substring_hash(const char * str,int l)52 substring_hash (const char *str, int l)
53 {
54   return str[0] + str[l - 1] * 256 + l * 65536;
55 }
56 
57 /* Used for attribute_hash.  */
58 
59 struct attribute_hasher : nofree_ptr_hash <attribute_spec>
60 {
61   typedef substring *compare_type;
62   static inline hashval_t hash (const attribute_spec *);
63   static inline bool equal (const attribute_spec *, const substring *);
64 };
65 
66 inline hashval_t
hash(const attribute_spec * spec)67 attribute_hasher::hash (const attribute_spec *spec)
68 {
69   const int l = strlen (spec->name);
70   return substring_hash (spec->name, l);
71 }
72 
73 inline bool
equal(const attribute_spec * spec,const substring * str)74 attribute_hasher::equal (const attribute_spec *spec, const substring *str)
75 {
76   return (strncmp (spec->name, str->str, str->length) == 0
77 	  && !spec->name[str->length]);
78 }
79 
80 /* Scoped attribute name representation.  */
81 
82 struct scoped_attributes
83 {
84   const char *ns;
85   vec<attribute_spec> attributes;
86   hash_table<attribute_hasher> *attribute_hash;
87 };
88 
89 /* The table of scope attributes.  */
90 static vec<scoped_attributes> attributes_table;
91 
92 static scoped_attributes* find_attribute_namespace (const char*);
93 static void register_scoped_attribute (const struct attribute_spec *,
94 				       scoped_attributes *);
95 
96 static bool attributes_initialized = false;
97 
98 /* Default empty table of attributes.  */
99 
100 static const struct attribute_spec empty_attribute_table[] =
101 {
102   { NULL, 0, 0, false, false, false, false, NULL, NULL }
103 };
104 
105 /* Return base name of the attribute.  Ie '__attr__' is turned into 'attr'.
106    To avoid need for copying, we simply return length of the string.  */
107 
108 static void
extract_attribute_substring(struct substring * str)109 extract_attribute_substring (struct substring *str)
110 {
111   if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
112       && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
113     {
114       str->length -= 4;
115       str->str += 2;
116     }
117 }
118 
119 /* Insert an array of attributes ATTRIBUTES into a namespace.  This
120    array must be NULL terminated.  NS is the name of attribute
121    namespace.  The function returns the namespace into which the
122    attributes have been registered.  */
123 
124 scoped_attributes *
register_scoped_attributes(const struct attribute_spec * attributes,const char * ns)125 register_scoped_attributes (const struct attribute_spec *attributes,
126 			    const char *ns)
127 {
128   scoped_attributes *result = NULL;
129 
130   /* See if we already have attributes in the namespace NS.  */
131   result = find_attribute_namespace (ns);
132 
133   if (result == NULL)
134     {
135       /* We don't have any namespace NS yet.  Create one.  */
136       scoped_attributes sa;
137 
138       if (attributes_table.is_empty ())
139 	attributes_table.create (64);
140 
141       memset (&sa, 0, sizeof (sa));
142       sa.ns = ns;
143       sa.attributes.create (64);
144       result = attributes_table.safe_push (sa);
145       result->attribute_hash = new hash_table<attribute_hasher> (200);
146     }
147 
148   /* Really add the attributes to their namespace now.  */
149   for (unsigned i = 0; attributes[i].name != NULL; ++i)
150     {
151       result->attributes.safe_push (attributes[i]);
152       register_scoped_attribute (&attributes[i], result);
153     }
154 
155   gcc_assert (result != NULL);
156 
157   return result;
158 }
159 
160 /* Return the namespace which name is NS, NULL if none exist.  */
161 
162 static scoped_attributes*
find_attribute_namespace(const char * ns)163 find_attribute_namespace (const char* ns)
164 {
165   unsigned ix;
166   scoped_attributes *iter;
167 
168   FOR_EACH_VEC_ELT (attributes_table, ix, iter)
169     if (ns == iter->ns
170 	|| (iter->ns != NULL
171 	    && ns != NULL
172 	    && !strcmp (iter->ns, ns)))
173       return iter;
174   return NULL;
175 }
176 
177 /* Make some sanity checks on the attribute tables.  */
178 
179 static void
check_attribute_tables(void)180 check_attribute_tables (void)
181 {
182   for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
183     for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
184       {
185 	/* The name must not begin and end with __.  */
186 	const char *name = attribute_tables[i][j].name;
187 	int len = strlen (name);
188 
189 	gcc_assert (!(name[0] == '_' && name[1] == '_'
190 		      && name[len - 1] == '_' && name[len - 2] == '_'));
191 
192 	/* The minimum and maximum lengths must be consistent.  */
193 	gcc_assert (attribute_tables[i][j].min_length >= 0);
194 
195 	gcc_assert (attribute_tables[i][j].max_length == -1
196 		    || (attribute_tables[i][j].max_length
197 			>= attribute_tables[i][j].min_length));
198 
199 	/* An attribute cannot require both a DECL and a TYPE.  */
200 	gcc_assert (!attribute_tables[i][j].decl_required
201 		    || !attribute_tables[i][j].type_required);
202 
203 	  /* If an attribute requires a function type, in particular
204 	     it requires a type.  */
205 	gcc_assert (!attribute_tables[i][j].function_type_required
206 		    || attribute_tables[i][j].type_required);
207       }
208 
209   /* Check that each name occurs just once in each table.  */
210   for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
211     for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
212       for (size_t k = j + 1; attribute_tables[i][k].name != NULL; k++)
213 	gcc_assert (strcmp (attribute_tables[i][j].name,
214 			    attribute_tables[i][k].name));
215 
216   /* Check that no name occurs in more than one table.  Names that
217      begin with '*' are exempt, and may be overridden.  */
218   for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
219     for (size_t j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
220       for (size_t k = 0; attribute_tables[i][k].name != NULL; k++)
221 	for (size_t l = 0; attribute_tables[j][l].name != NULL; l++)
222 	  gcc_assert (attribute_tables[i][k].name[0] == '*'
223 		      || strcmp (attribute_tables[i][k].name,
224 				 attribute_tables[j][l].name));
225 }
226 
227 /* Initialize attribute tables, and make some sanity checks if checking is
228    enabled.  */
229 
230 void
init_attributes(void)231 init_attributes (void)
232 {
233   size_t i;
234 
235   if (attributes_initialized)
236     return;
237 
238   attribute_tables[0] = lang_hooks.common_attribute_table;
239   attribute_tables[1] = lang_hooks.attribute_table;
240   attribute_tables[2] = lang_hooks.format_attribute_table;
241   attribute_tables[3] = targetm.attribute_table;
242 
243   /* Translate NULL pointers to pointers to the empty table.  */
244   for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
245     if (attribute_tables[i] == NULL)
246       attribute_tables[i] = empty_attribute_table;
247 
248   if (flag_checking)
249     check_attribute_tables ();
250 
251   for (i = 0; i < ARRAY_SIZE (attribute_tables); ++i)
252     /* Put all the GNU attributes into the "gnu" namespace.  */
253     register_scoped_attributes (attribute_tables[i], "gnu");
254 
255   invoke_plugin_callbacks (PLUGIN_ATTRIBUTES, NULL);
256   attributes_initialized = true;
257 }
258 
259 /* Insert a single ATTR into the attribute table.  */
260 
261 void
register_attribute(const struct attribute_spec * attr)262 register_attribute (const struct attribute_spec *attr)
263 {
264   register_scoped_attribute (attr, find_attribute_namespace ("gnu"));
265 }
266 
267 /* Insert a single attribute ATTR into a namespace of attributes.  */
268 
269 static void
register_scoped_attribute(const struct attribute_spec * attr,scoped_attributes * name_space)270 register_scoped_attribute (const struct attribute_spec *attr,
271 			   scoped_attributes *name_space)
272 {
273   struct substring str;
274   attribute_spec **slot;
275 
276   gcc_assert (attr != NULL && name_space != NULL);
277 
278   gcc_assert (name_space->attribute_hash);
279 
280   str.str = attr->name;
281   str.length = strlen (str.str);
282 
283   /* Attribute names in the table must be in the form 'text' and not
284      in the form '__text__'.  */
285   gcc_assert (str.length > 0 && str.str[0] != '_');
286 
287   slot = name_space->attribute_hash
288 	 ->find_slot_with_hash (&str, substring_hash (str.str, str.length),
289 				INSERT);
290   gcc_assert (!*slot || attr->name[0] == '*');
291   *slot = CONST_CAST (struct attribute_spec *, attr);
292 }
293 
294 /* Return the spec for the scoped attribute with namespace NS and
295    name NAME.   */
296 
297 static const struct attribute_spec *
lookup_scoped_attribute_spec(const_tree ns,const_tree name)298 lookup_scoped_attribute_spec (const_tree ns, const_tree name)
299 {
300   struct substring attr;
301   scoped_attributes *attrs;
302 
303   const char *ns_str = (ns != NULL_TREE) ? IDENTIFIER_POINTER (ns): NULL;
304 
305   attrs = find_attribute_namespace (ns_str);
306 
307   if (attrs == NULL)
308     return NULL;
309 
310   attr.str = IDENTIFIER_POINTER (name);
311   attr.length = IDENTIFIER_LENGTH (name);
312   extract_attribute_substring (&attr);
313   return attrs->attribute_hash->find_with_hash (&attr,
314 						substring_hash (attr.str,
315 							       	attr.length));
316 }
317 
318 /* Return the spec for the attribute named NAME.  If NAME is a TREE_LIST,
319    it also specifies the attribute namespace.  */
320 
321 const struct attribute_spec *
lookup_attribute_spec(const_tree name)322 lookup_attribute_spec (const_tree name)
323 {
324   tree ns;
325   if (TREE_CODE (name) == TREE_LIST)
326     {
327       ns = TREE_PURPOSE (name);
328       name = TREE_VALUE (name);
329     }
330   else
331     ns = get_identifier ("gnu");
332   return lookup_scoped_attribute_spec (ns, name);
333 }
334 
335 
336 /* Return the namespace of the attribute ATTR.  This accessor works on
337    GNU and C++11 (scoped) attributes.  On GNU attributes,
338    it returns an identifier tree for the string "gnu".
339 
340    Please read the comments of cxx11_attribute_p to understand the
341    format of attributes.  */
342 
343 tree
get_attribute_namespace(const_tree attr)344 get_attribute_namespace (const_tree attr)
345 {
346   if (cxx11_attribute_p (attr))
347     return TREE_PURPOSE (TREE_PURPOSE (attr));
348   return get_identifier ("gnu");
349 }
350 
351 /* Check LAST_DECL and NODE of the same symbol for attributes that are
352    recorded in SPEC to be mutually exclusive with ATTRNAME, diagnose
353    them, and return true if any have been found.  NODE can be a DECL
354    or a TYPE.  */
355 
356 static bool
diag_attr_exclusions(tree last_decl,tree node,tree attrname,const attribute_spec * spec)357 diag_attr_exclusions (tree last_decl, tree node, tree attrname,
358 		      const attribute_spec *spec)
359 {
360   const attribute_spec::exclusions *excl = spec->exclude;
361 
362   tree_code code = TREE_CODE (node);
363 
364   if ((code == FUNCTION_DECL && !excl->function
365        && (!excl->type || !spec->affects_type_identity))
366       || (code == VAR_DECL && !excl->variable
367 	  && (!excl->type || !spec->affects_type_identity))
368       || (((code == TYPE_DECL || RECORD_OR_UNION_TYPE_P (node)) && !excl->type)))
369     return false;
370 
371   /* True if an attribute that's mutually exclusive with ATTRNAME
372      has been found.  */
373   bool found = false;
374 
375   if (last_decl && last_decl != node && TREE_TYPE (last_decl) != node)
376     {
377       /* Check both the last DECL and its type for conflicts with
378 	 the attribute being added to the current decl or type.  */
379       found |= diag_attr_exclusions (last_decl, last_decl, attrname, spec);
380       tree decl_type = TREE_TYPE (last_decl);
381       found |= diag_attr_exclusions (last_decl, decl_type, attrname, spec);
382     }
383 
384   /* NODE is either the current DECL to which the attribute is being
385      applied or its TYPE.  For the former, consider the attributes on
386      both the DECL and its type.  */
387   tree attrs[2];
388 
389   if (DECL_P (node))
390     {
391       attrs[0] = DECL_ATTRIBUTES (node);
392       attrs[1] = TYPE_ATTRIBUTES (TREE_TYPE (node));
393     }
394   else
395     {
396       attrs[0] = TYPE_ATTRIBUTES (node);
397       attrs[1] = NULL_TREE;
398     }
399 
400   /* Iterate over the mutually exclusive attribute names and verify
401      that the symbol doesn't contain it.  */
402   for (unsigned i = 0; i != sizeof attrs / sizeof *attrs; ++i)
403     {
404       if (!attrs[i])
405 	continue;
406 
407       for ( ; excl->name; ++excl)
408 	{
409 	  /* Avoid checking the attribute against itself.  */
410 	  if (is_attribute_p (excl->name, attrname))
411 	    continue;
412 
413 	  if (!lookup_attribute (excl->name, attrs[i]))
414 	    continue;
415 
416 	  /* An exclusion may apply either to a function declaration,
417 	     type declaration, or a field/variable declaration, or
418 	     any subset of the three.  */
419 	  if (TREE_CODE (node) == FUNCTION_DECL
420 	      && !excl->function)
421 	    continue;
422 
423 	  if (TREE_CODE (node) == TYPE_DECL
424 	      && !excl->type)
425 	    continue;
426 
427 	  if ((TREE_CODE (node) == FIELD_DECL
428 	       || TREE_CODE (node) == VAR_DECL)
429 	      && !excl->variable)
430 	    continue;
431 
432 	  found = true;
433 
434 	  /* Print a note?  */
435 	  bool note = last_decl != NULL_TREE;
436 	  auto_diagnostic_group d;
437 	  if (TREE_CODE (node) == FUNCTION_DECL
438 	      && fndecl_built_in_p (node))
439 	    note &= warning (OPT_Wattributes,
440 			     "ignoring attribute %qE in declaration of "
441 			     "a built-in function %qD because it conflicts "
442 			     "with attribute %qs",
443 			     attrname, node, excl->name);
444 	  else
445 	    note &= warning (OPT_Wattributes,
446 			     "ignoring attribute %qE because "
447 			     "it conflicts with attribute %qs",
448 			     attrname, excl->name);
449 
450 	  if (note)
451 	    inform (DECL_SOURCE_LOCATION (last_decl),
452 		    "previous declaration here");
453 	}
454     }
455 
456   return found;
457 }
458 
459 /* Process the attributes listed in ATTRIBUTES and install them in *NODE,
460    which is either a DECL (including a TYPE_DECL) or a TYPE.  If a DECL,
461    it should be modified in place; if a TYPE, a copy should be created
462    unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS.  FLAGS gives further
463    information, in the form of a bitwise OR of flags in enum attribute_flags
464    from tree.h.  Depending on these flags, some attributes may be
465    returned to be applied at a later stage (for example, to apply
466    a decl attribute to the declaration rather than to its type).  */
467 
468 tree
decl_attributes(tree * node,tree attributes,int flags,tree last_decl)469 decl_attributes (tree *node, tree attributes, int flags,
470 		 tree last_decl /* = NULL_TREE */)
471 {
472   tree returned_attrs = NULL_TREE;
473 
474   if (TREE_TYPE (*node) == error_mark_node || attributes == error_mark_node)
475     return NULL_TREE;
476 
477   if (!attributes_initialized)
478     init_attributes ();
479 
480   /* If this is a function and the user used #pragma GCC optimize, add the
481      options to the attribute((optimize(...))) list.  */
482   if (TREE_CODE (*node) == FUNCTION_DECL && current_optimize_pragma)
483     {
484       tree cur_attr = lookup_attribute ("optimize", attributes);
485       tree opts = copy_list (current_optimize_pragma);
486 
487       if (! cur_attr)
488 	attributes
489 	  = tree_cons (get_identifier ("optimize"), opts, attributes);
490       else
491 	TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
492     }
493 
494   if (TREE_CODE (*node) == FUNCTION_DECL
495       && optimization_current_node != optimization_default_node
496       && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
497     DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
498 
499   /* If this is a function and the user used #pragma GCC target, add the
500      options to the attribute((target(...))) list.  */
501   if (TREE_CODE (*node) == FUNCTION_DECL
502       && current_target_pragma
503       && targetm.target_option.valid_attribute_p (*node, NULL_TREE,
504 						  current_target_pragma, 0))
505     {
506       tree cur_attr = lookup_attribute ("target", attributes);
507       tree opts = copy_list (current_target_pragma);
508 
509       if (! cur_attr)
510 	attributes = tree_cons (get_identifier ("target"), opts, attributes);
511       else
512 	TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
513     }
514 
515   /* A "naked" function attribute implies "noinline" and "noclone" for
516      those targets that support it.  */
517   if (TREE_CODE (*node) == FUNCTION_DECL
518       && attributes
519       && lookup_attribute ("naked", attributes) != NULL
520       && lookup_attribute_spec (get_identifier ("naked")))
521     {
522       if (lookup_attribute ("noinline", attributes) == NULL)
523 	attributes = tree_cons (get_identifier ("noinline"), NULL, attributes);
524 
525       if (lookup_attribute ("noclone", attributes) == NULL)
526 	attributes = tree_cons (get_identifier ("noclone"),  NULL, attributes);
527     }
528 
529   /* A "noipa" function attribute implies "noinline", "noclone" and "no_icf"
530      for those targets that support it.  */
531   if (TREE_CODE (*node) == FUNCTION_DECL
532       && attributes
533       && lookup_attribute ("noipa", attributes) != NULL
534       && lookup_attribute_spec (get_identifier ("noipa")))
535     {
536       if (lookup_attribute ("noinline", attributes) == NULL)
537 	attributes = tree_cons (get_identifier ("noinline"), NULL, attributes);
538 
539       if (lookup_attribute ("noclone", attributes) == NULL)
540 	attributes = tree_cons (get_identifier ("noclone"),  NULL, attributes);
541 
542       if (lookup_attribute ("no_icf", attributes) == NULL)
543 	attributes = tree_cons (get_identifier ("no_icf"),  NULL, attributes);
544     }
545 
546   targetm.insert_attributes (*node, &attributes);
547 
548   /* Note that attributes on the same declaration are not necessarily
549      in the same order as in the source.  */
550   for (tree attr = attributes; attr; attr = TREE_CHAIN (attr))
551     {
552       tree ns = get_attribute_namespace (attr);
553       tree name = get_attribute_name (attr);
554       tree args = TREE_VALUE (attr);
555       tree *anode = node;
556       const struct attribute_spec *spec
557 	= lookup_scoped_attribute_spec (ns, name);
558       int fn_ptr_quals = 0;
559       tree fn_ptr_tmp = NULL_TREE;
560       const bool cxx11_attr_p = cxx11_attribute_p (attr);
561 
562       if (spec == NULL)
563 	{
564 	  if (!(flags & (int) ATTR_FLAG_BUILT_IN))
565 	    {
566 	      if (ns == NULL_TREE || !cxx11_attr_p)
567 		warning (OPT_Wattributes, "%qE attribute directive ignored",
568 			 name);
569 	      else
570 		warning (OPT_Wattributes,
571 			 "%<%E::%E%> scoped attribute directive ignored",
572 			 ns, name);
573 	    }
574 	  continue;
575 	}
576       else
577 	{
578 	  int nargs = list_length (args);
579 	  if (nargs < spec->min_length
580 	      || (spec->max_length >= 0
581 		  && nargs > spec->max_length))
582 	    {
583 	      error ("wrong number of arguments specified for %qE attribute",
584 		     name);
585 	      if (spec->max_length < 0)
586 		inform (input_location, "expected %i or more, found %i",
587 			spec->min_length, nargs);
588 	      else
589 		inform (input_location, "expected between %i and %i, found %i",
590 			spec->min_length, spec->max_length, nargs);
591 	      continue;
592 	    }
593 	}
594       gcc_assert (is_attribute_p (spec->name, name));
595 
596       if (spec->decl_required && !DECL_P (*anode))
597 	{
598 	  if (flags & ((int) ATTR_FLAG_DECL_NEXT
599 		       | (int) ATTR_FLAG_FUNCTION_NEXT
600 		       | (int) ATTR_FLAG_ARRAY_NEXT))
601 	    {
602 	      /* Pass on this attribute to be tried again.  */
603 	      tree attr = tree_cons (name, args, NULL_TREE);
604 	      returned_attrs = chainon (returned_attrs, attr);
605 	      continue;
606 	    }
607 	  else
608 	    {
609 	      warning (OPT_Wattributes, "%qE attribute does not apply to types",
610 		       name);
611 	      continue;
612 	    }
613 	}
614 
615       /* If we require a type, but were passed a decl, set up to make a
616 	 new type and update the one in the decl.  ATTR_FLAG_TYPE_IN_PLACE
617 	 would have applied if we'd been passed a type, but we cannot modify
618 	 the decl's type in place here.  */
619       if (spec->type_required && DECL_P (*anode))
620 	{
621 	  anode = &TREE_TYPE (*anode);
622 	  flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
623 	}
624 
625       if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
626 	  && TREE_CODE (*anode) != METHOD_TYPE)
627 	{
628 	  if (TREE_CODE (*anode) == POINTER_TYPE
629 	      && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
630 		  || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
631 	    {
632 	      /* OK, this is a bit convoluted.  We can't just make a copy
633 		 of the pointer type and modify its TREE_TYPE, because if
634 		 we change the attributes of the target type the pointer
635 		 type needs to have a different TYPE_MAIN_VARIANT.  So we
636 		 pull out the target type now, frob it as appropriate, and
637 		 rebuild the pointer type later.
638 
639 		 This would all be simpler if attributes were part of the
640 		 declarator, grumble grumble.  */
641 	      fn_ptr_tmp = TREE_TYPE (*anode);
642 	      fn_ptr_quals = TYPE_QUALS (*anode);
643 	      anode = &fn_ptr_tmp;
644 	      flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
645 	    }
646 	  else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
647 	    {
648 	      /* Pass on this attribute to be tried again.  */
649 	      tree attr = tree_cons (name, args, NULL_TREE);
650 	      returned_attrs = chainon (returned_attrs, attr);
651 	      continue;
652 	    }
653 
654 	  if (TREE_CODE (*anode) != FUNCTION_TYPE
655 	      && TREE_CODE (*anode) != METHOD_TYPE)
656 	    {
657 	      warning (OPT_Wattributes,
658 		       "%qE attribute only applies to function types",
659 		       name);
660 	      continue;
661 	    }
662 	}
663 
664       if (TYPE_P (*anode)
665 	  && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
666 	  && TYPE_SIZE (*anode) != NULL_TREE)
667 	{
668 	  warning (OPT_Wattributes, "type attributes ignored after type is already defined");
669 	  continue;
670 	}
671 
672       bool no_add_attrs = false;
673 
674       /* Check for exclusions with other attributes on the current
675 	 declation as well as the last declaration of the same
676 	 symbol already processed (if one exists).  Detect and
677 	 reject incompatible attributes.  */
678       bool built_in = flags & ATTR_FLAG_BUILT_IN;
679       if (spec->exclude
680 	  && (flag_checking || !built_in)
681 	  && !error_operand_p (last_decl))
682 	{
683 	  /* Always check attributes on user-defined functions.
684 	     Check them on built-ins only when -fchecking is set.
685 	     Ignore __builtin_unreachable -- it's both const and
686 	     noreturn.  */
687 
688 	  if (!built_in
689 	      || !DECL_P (*anode)
690 	      || DECL_BUILT_IN_CLASS (*anode) != BUILT_IN_NORMAL
691 	      || (DECL_FUNCTION_CODE (*anode) != BUILT_IN_UNREACHABLE
692 		  && (DECL_FUNCTION_CODE (*anode)
693 		      != BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE)))
694 	    {
695 	      bool no_add = diag_attr_exclusions (last_decl, *anode, name, spec);
696 	      if (!no_add && anode != node)
697 		no_add = diag_attr_exclusions (last_decl, *node, name, spec);
698 	      no_add_attrs |= no_add;
699 	    }
700 	}
701 
702       if (no_add_attrs)
703 	continue;
704 
705       if (spec->handler != NULL)
706 	{
707 	  int cxx11_flag = (cxx11_attr_p ? ATTR_FLAG_CXX11 : 0);
708 
709 	  /* Pass in an array of the current declaration followed
710 	     by the last pushed/merged declaration if  one exists.
711 	     If the handler changes CUR_AND_LAST_DECL[0] replace
712 	     *ANODE with its value.  */
713 	  tree cur_and_last_decl[] = { *anode, last_decl };
714 	  tree ret = (spec->handler) (cur_and_last_decl, name, args,
715 				      flags|cxx11_flag, &no_add_attrs);
716 
717 	  *anode = cur_and_last_decl[0];
718 	  if (ret == error_mark_node)
719 	    {
720 	      warning (OPT_Wattributes, "%qE attribute ignored", name);
721 	      no_add_attrs = true;
722 	    }
723 	  else
724 	    returned_attrs = chainon (ret, returned_attrs);
725 	}
726 
727       /* Layout the decl in case anything changed.  */
728       if (spec->type_required && DECL_P (*node)
729 	  && (VAR_P (*node)
730 	      || TREE_CODE (*node) == PARM_DECL
731 	      || TREE_CODE (*node) == RESULT_DECL))
732 	relayout_decl (*node);
733 
734       if (!no_add_attrs)
735 	{
736 	  tree old_attrs;
737 	  tree a;
738 
739 	  if (DECL_P (*anode))
740 	    old_attrs = DECL_ATTRIBUTES (*anode);
741 	  else
742 	    old_attrs = TYPE_ATTRIBUTES (*anode);
743 
744 	  for (a = lookup_attribute (spec->name, old_attrs);
745 	       a != NULL_TREE;
746 	       a = lookup_attribute (spec->name, TREE_CHAIN (a)))
747 	    {
748 	      if (simple_cst_equal (TREE_VALUE (a), args) == 1)
749 		break;
750 	    }
751 
752 	  if (a == NULL_TREE)
753 	    {
754 	      /* This attribute isn't already in the list.  */
755 	      tree r;
756 	      /* Preserve the C++11 form.  */
757 	      if (cxx11_attr_p)
758 		r = tree_cons (build_tree_list (ns, name), args, old_attrs);
759 	      else
760 		r = tree_cons (name, args, old_attrs);
761 
762 	      if (DECL_P (*anode))
763 		DECL_ATTRIBUTES (*anode) = r;
764 	      else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
765 		{
766 		  TYPE_ATTRIBUTES (*anode) = r;
767 		  /* If this is the main variant, also push the attributes
768 		     out to the other variants.  */
769 		  if (*anode == TYPE_MAIN_VARIANT (*anode))
770 		    {
771 		      for (tree variant = *anode; variant;
772 			   variant = TYPE_NEXT_VARIANT (variant))
773 			{
774 			  if (TYPE_ATTRIBUTES (variant) == old_attrs)
775 			    TYPE_ATTRIBUTES (variant)
776 			      = TYPE_ATTRIBUTES (*anode);
777 			  else if (!lookup_attribute
778 				   (spec->name, TYPE_ATTRIBUTES (variant)))
779 			    TYPE_ATTRIBUTES (variant) = tree_cons
780 			      (name, args, TYPE_ATTRIBUTES (variant));
781 			}
782 		    }
783 		}
784 	      else
785 		*anode = build_type_attribute_variant (*anode, r);
786 	    }
787 	}
788 
789       if (fn_ptr_tmp)
790 	{
791 	  /* Rebuild the function pointer type and put it in the
792 	     appropriate place.  */
793 	  fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
794 	  if (fn_ptr_quals)
795 	    fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals);
796 	  if (DECL_P (*node))
797 	    TREE_TYPE (*node) = fn_ptr_tmp;
798 	  else
799 	    {
800 	      gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
801 	      *node = fn_ptr_tmp;
802 	    }
803 	}
804     }
805 
806   return returned_attrs;
807 }
808 
809 /* Return TRUE iff ATTR has been parsed by the front-end as a C++-11
810    attribute.
811 
812    When G++ parses a C++11 attribute, it is represented as
813    a TREE_LIST which TREE_PURPOSE is itself a TREE_LIST.  TREE_PURPOSE
814    (TREE_PURPOSE (ATTR)) is the namespace of the attribute, and the
815    TREE_VALUE (TREE_PURPOSE (ATTR)) is its non-qualified name.  Please
816    use get_attribute_namespace and get_attribute_name to retrieve the
817    namespace and name of the attribute, as these accessors work with
818    GNU attributes as well.  */
819 
820 bool
cxx11_attribute_p(const_tree attr)821 cxx11_attribute_p (const_tree attr)
822 {
823   if (attr == NULL_TREE
824       || TREE_CODE (attr) != TREE_LIST)
825     return false;
826 
827   return (TREE_CODE (TREE_PURPOSE (attr)) == TREE_LIST);
828 }
829 
830 /* Return the name of the attribute ATTR.  This accessor works on GNU
831    and C++11 (scoped) attributes.
832 
833    Please read the comments of cxx11_attribute_p to understand the
834    format of attributes.  */
835 
836 tree
get_attribute_name(const_tree attr)837 get_attribute_name (const_tree attr)
838 {
839   if (cxx11_attribute_p (attr))
840     return TREE_VALUE (TREE_PURPOSE (attr));
841   return TREE_PURPOSE (attr);
842 }
843 
844 /* Subroutine of set_method_tm_attributes.  Apply TM attribute ATTR
845    to the method FNDECL.  */
846 
847 void
apply_tm_attr(tree fndecl,tree attr)848 apply_tm_attr (tree fndecl, tree attr)
849 {
850   decl_attributes (&TREE_TYPE (fndecl), tree_cons (attr, NULL, NULL), 0);
851 }
852 
853 /* Makes a function attribute of the form NAME(ARG_NAME) and chains
854    it to CHAIN.  */
855 
856 tree
make_attribute(const char * name,const char * arg_name,tree chain)857 make_attribute (const char *name, const char *arg_name, tree chain)
858 {
859   tree attr_name;
860   tree attr_arg_name;
861   tree attr_args;
862   tree attr;
863 
864   attr_name = get_identifier (name);
865   attr_arg_name = build_string (strlen (arg_name), arg_name);
866   attr_args = tree_cons (NULL_TREE, attr_arg_name, NULL_TREE);
867   attr = tree_cons (attr_name, attr_args, chain);
868   return attr;
869 }
870 
871 
872 /* Common functions used for target clone support.  */
873 
874 /* Comparator function to be used in qsort routine to sort attribute
875    specification strings to "target".  */
876 
877 static int
attr_strcmp(const void * v1,const void * v2)878 attr_strcmp (const void *v1, const void *v2)
879 {
880   const char *c1 = *(char *const*)v1;
881   const char *c2 = *(char *const*)v2;
882   return strcmp (c1, c2);
883 }
884 
885 /* ARGLIST is the argument to target attribute.  This function tokenizes
886    the comma separated arguments, sorts them and returns a string which
887    is a unique identifier for the comma separated arguments.   It also
888    replaces non-identifier characters "=,-" with "_".  */
889 
890 char *
sorted_attr_string(tree arglist)891 sorted_attr_string (tree arglist)
892 {
893   tree arg;
894   size_t str_len_sum = 0;
895   char **args = NULL;
896   char *attr_str, *ret_str;
897   char *attr = NULL;
898   unsigned int argnum = 1;
899   unsigned int i;
900 
901   for (arg = arglist; arg; arg = TREE_CHAIN (arg))
902     {
903       const char *str = TREE_STRING_POINTER (TREE_VALUE (arg));
904       size_t len = strlen (str);
905       str_len_sum += len + 1;
906       if (arg != arglist)
907 	argnum++;
908       for (i = 0; i < strlen (str); i++)
909 	if (str[i] == ',')
910 	  argnum++;
911     }
912 
913   attr_str = XNEWVEC (char, str_len_sum);
914   str_len_sum = 0;
915   for (arg = arglist; arg; arg = TREE_CHAIN (arg))
916     {
917       const char *str = TREE_STRING_POINTER (TREE_VALUE (arg));
918       size_t len = strlen (str);
919       memcpy (attr_str + str_len_sum, str, len);
920       attr_str[str_len_sum + len] = TREE_CHAIN (arg) ? ',' : '\0';
921       str_len_sum += len + 1;
922     }
923 
924   /* Replace "=,-" with "_".  */
925   for (i = 0; i < strlen (attr_str); i++)
926     if (attr_str[i] == '=' || attr_str[i]== '-')
927       attr_str[i] = '_';
928 
929   if (argnum == 1)
930     return attr_str;
931 
932   args = XNEWVEC (char *, argnum);
933 
934   i = 0;
935   attr = strtok (attr_str, ",");
936   while (attr != NULL)
937     {
938       args[i] = attr;
939       i++;
940       attr = strtok (NULL, ",");
941     }
942 
943   qsort (args, argnum, sizeof (char *), attr_strcmp);
944 
945   ret_str = XNEWVEC (char, str_len_sum);
946   str_len_sum = 0;
947   for (i = 0; i < argnum; i++)
948     {
949       size_t len = strlen (args[i]);
950       memcpy (ret_str + str_len_sum, args[i], len);
951       ret_str[str_len_sum + len] = i < argnum - 1 ? '_' : '\0';
952       str_len_sum += len + 1;
953     }
954 
955   XDELETEVEC (args);
956   XDELETEVEC (attr_str);
957   return ret_str;
958 }
959 
960 
961 /* This function returns true if FN1 and FN2 are versions of the same function,
962    that is, the target strings of the function decls are different.  This assumes
963    that FN1 and FN2 have the same signature.  */
964 
965 bool
common_function_versions(tree fn1,tree fn2)966 common_function_versions (tree fn1, tree fn2)
967 {
968   tree attr1, attr2;
969   char *target1, *target2;
970   bool result;
971 
972   if (TREE_CODE (fn1) != FUNCTION_DECL
973       || TREE_CODE (fn2) != FUNCTION_DECL)
974     return false;
975 
976   attr1 = lookup_attribute ("target", DECL_ATTRIBUTES (fn1));
977   attr2 = lookup_attribute ("target", DECL_ATTRIBUTES (fn2));
978 
979   /* At least one function decl should have the target attribute specified.  */
980   if (attr1 == NULL_TREE && attr2 == NULL_TREE)
981     return false;
982 
983   /* Diagnose missing target attribute if one of the decls is already
984      multi-versioned.  */
985   if (attr1 == NULL_TREE || attr2 == NULL_TREE)
986     {
987       if (DECL_FUNCTION_VERSIONED (fn1) || DECL_FUNCTION_VERSIONED (fn2))
988 	{
989 	  if (attr2 != NULL_TREE)
990 	    {
991 	      std::swap (fn1, fn2);
992 	      attr1 = attr2;
993 	    }
994 	  error_at (DECL_SOURCE_LOCATION (fn2),
995 		    "missing %<target%> attribute for multi-versioned %qD",
996 		    fn2);
997 	  inform (DECL_SOURCE_LOCATION (fn1),
998 		  "previous declaration of %qD", fn1);
999 	  /* Prevent diagnosing of the same error multiple times.  */
1000 	  DECL_ATTRIBUTES (fn2)
1001 	    = tree_cons (get_identifier ("target"),
1002 			 copy_node (TREE_VALUE (attr1)),
1003 			 DECL_ATTRIBUTES (fn2));
1004 	}
1005       return false;
1006     }
1007 
1008   target1 = sorted_attr_string (TREE_VALUE (attr1));
1009   target2 = sorted_attr_string (TREE_VALUE (attr2));
1010 
1011   /* The sorted target strings must be different for fn1 and fn2
1012      to be versions.  */
1013   if (strcmp (target1, target2) == 0)
1014     result = false;
1015   else
1016     result = true;
1017 
1018   XDELETEVEC (target1);
1019   XDELETEVEC (target2);
1020 
1021   return result;
1022 }
1023 
1024 /* Return a new name by appending SUFFIX to the DECL name.  If make_unique
1025    is true, append the full path name of the source file.  */
1026 
1027 char *
make_unique_name(tree decl,const char * suffix,bool make_unique)1028 make_unique_name (tree decl, const char *suffix, bool make_unique)
1029 {
1030   char *global_var_name;
1031   int name_len;
1032   const char *name;
1033   const char *unique_name = NULL;
1034 
1035   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1036 
1037   /* Get a unique name that can be used globally without any chances
1038      of collision at link time.  */
1039   if (make_unique)
1040     unique_name = IDENTIFIER_POINTER (get_file_function_name ("\0"));
1041 
1042   name_len = strlen (name) + strlen (suffix) + 2;
1043 
1044   if (make_unique)
1045     name_len += strlen (unique_name) + 1;
1046   global_var_name = XNEWVEC (char, name_len);
1047 
1048   /* Use '.' to concatenate names as it is demangler friendly.  */
1049   if (make_unique)
1050     snprintf (global_var_name, name_len, "%s.%s.%s", name, unique_name,
1051 	      suffix);
1052   else
1053     snprintf (global_var_name, name_len, "%s.%s", name, suffix);
1054 
1055   return global_var_name;
1056 }
1057 
1058 /* Make a dispatcher declaration for the multi-versioned function DECL.
1059    Calls to DECL function will be replaced with calls to the dispatcher
1060    by the front-end.  Return the decl created.  */
1061 
1062 tree
make_dispatcher_decl(const tree decl)1063 make_dispatcher_decl (const tree decl)
1064 {
1065   tree func_decl;
1066   char *func_name;
1067   tree fn_type, func_type;
1068 
1069   func_name = xstrdup (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
1070 
1071   fn_type = TREE_TYPE (decl);
1072   func_type = build_function_type (TREE_TYPE (fn_type),
1073 				   TYPE_ARG_TYPES (fn_type));
1074 
1075   func_decl = build_fn_decl (func_name, func_type);
1076   XDELETEVEC (func_name);
1077   TREE_USED (func_decl) = 1;
1078   DECL_CONTEXT (func_decl) = NULL_TREE;
1079   DECL_INITIAL (func_decl) = error_mark_node;
1080   DECL_ARTIFICIAL (func_decl) = 1;
1081   /* Mark this func as external, the resolver will flip it again if
1082      it gets generated.  */
1083   DECL_EXTERNAL (func_decl) = 1;
1084   /* This will be of type IFUNCs have to be externally visible.  */
1085   TREE_PUBLIC (func_decl) = 1;
1086 
1087   return func_decl;
1088 }
1089 
1090 /* Returns true if decl is multi-versioned and DECL is the default function,
1091    that is it is not tagged with target specific optimization.  */
1092 
1093 bool
is_function_default_version(const tree decl)1094 is_function_default_version (const tree decl)
1095 {
1096   if (TREE_CODE (decl) != FUNCTION_DECL
1097       || !DECL_FUNCTION_VERSIONED (decl))
1098     return false;
1099   tree attr = lookup_attribute ("target", DECL_ATTRIBUTES (decl));
1100   gcc_assert (attr);
1101   attr = TREE_VALUE (TREE_VALUE (attr));
1102   return (TREE_CODE (attr) == STRING_CST
1103 	  && strcmp (TREE_STRING_POINTER (attr), "default") == 0);
1104 }
1105 
1106 /* Return a declaration like DDECL except that its DECL_ATTRIBUTES
1107    is ATTRIBUTE.  */
1108 
1109 tree
build_decl_attribute_variant(tree ddecl,tree attribute)1110 build_decl_attribute_variant (tree ddecl, tree attribute)
1111 {
1112   DECL_ATTRIBUTES (ddecl) = attribute;
1113   return ddecl;
1114 }
1115 
1116 /* Return a type like TTYPE except that its TYPE_ATTRIBUTE
1117    is ATTRIBUTE and its qualifiers are QUALS.
1118 
1119    Record such modified types already made so we don't make duplicates.  */
1120 
1121 tree
build_type_attribute_qual_variant(tree otype,tree attribute,int quals)1122 build_type_attribute_qual_variant (tree otype, tree attribute, int quals)
1123 {
1124   tree ttype = otype;
1125   if (! attribute_list_equal (TYPE_ATTRIBUTES (ttype), attribute))
1126     {
1127       tree ntype;
1128 
1129       /* Building a distinct copy of a tagged type is inappropriate; it
1130 	 causes breakage in code that expects there to be a one-to-one
1131 	 relationship between a struct and its fields.
1132 	 build_duplicate_type is another solution (as used in
1133 	 handle_transparent_union_attribute), but that doesn't play well
1134 	 with the stronger C++ type identity model.  */
1135       if (TREE_CODE (ttype) == RECORD_TYPE
1136 	  || TREE_CODE (ttype) == UNION_TYPE
1137 	  || TREE_CODE (ttype) == QUAL_UNION_TYPE
1138 	  || TREE_CODE (ttype) == ENUMERAL_TYPE)
1139 	{
1140 	  warning (OPT_Wattributes,
1141 		   "ignoring attributes applied to %qT after definition",
1142 		   TYPE_MAIN_VARIANT (ttype));
1143 	  return build_qualified_type (ttype, quals);
1144 	}
1145 
1146       ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
1147       if (lang_hooks.types.copy_lang_qualifiers
1148 	  && otype != TYPE_MAIN_VARIANT (otype))
1149 	ttype = (lang_hooks.types.copy_lang_qualifiers
1150 		 (ttype, TYPE_MAIN_VARIANT (otype)));
1151 
1152       tree dtype = ntype = build_distinct_type_copy (ttype);
1153 
1154       TYPE_ATTRIBUTES (ntype) = attribute;
1155 
1156       hashval_t hash = type_hash_canon_hash (ntype);
1157       ntype = type_hash_canon (hash, ntype);
1158 
1159       if (ntype != dtype)
1160 	/* This variant was already in the hash table, don't mess with
1161 	   TYPE_CANONICAL.  */;
1162       else if (TYPE_STRUCTURAL_EQUALITY_P (ttype)
1163 	       || !comp_type_attributes (ntype, ttype))
1164 	/* If the target-dependent attributes make NTYPE different from
1165 	   its canonical type, we will need to use structural equality
1166 	   checks for this type.
1167 
1168 	   We shouldn't get here for stripping attributes from a type;
1169 	   the no-attribute type might not need structural comparison.  But
1170 	   we can if was discarded from type_hash_table.  */
1171 	SET_TYPE_STRUCTURAL_EQUALITY (ntype);
1172       else if (TYPE_CANONICAL (ntype) == ntype)
1173 	TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
1174 
1175       ttype = build_qualified_type (ntype, quals);
1176       if (lang_hooks.types.copy_lang_qualifiers
1177 	  && otype != TYPE_MAIN_VARIANT (otype))
1178 	ttype = lang_hooks.types.copy_lang_qualifiers (ttype, otype);
1179     }
1180   else if (TYPE_QUALS (ttype) != quals)
1181     ttype = build_qualified_type (ttype, quals);
1182 
1183   return ttype;
1184 }
1185 
1186 /* Compare two identifier nodes representing attributes.
1187    Return true if they are the same, false otherwise.  */
1188 
1189 static bool
cmp_attrib_identifiers(const_tree attr1,const_tree attr2)1190 cmp_attrib_identifiers (const_tree attr1, const_tree attr2)
1191 {
1192   /* Make sure we're dealing with IDENTIFIER_NODEs.  */
1193   gcc_checking_assert (TREE_CODE (attr1) == IDENTIFIER_NODE
1194 		       && TREE_CODE (attr2) == IDENTIFIER_NODE);
1195 
1196   /* Identifiers can be compared directly for equality.  */
1197   if (attr1 == attr2)
1198     return true;
1199 
1200   return cmp_attribs (IDENTIFIER_POINTER (attr1), IDENTIFIER_LENGTH (attr1),
1201 		      IDENTIFIER_POINTER (attr2), IDENTIFIER_LENGTH (attr2));
1202 }
1203 
1204 /* Compare two constructor-element-type constants.  Return 1 if the lists
1205    are known to be equal; otherwise return 0.  */
1206 
1207 static bool
simple_cst_list_equal(const_tree l1,const_tree l2)1208 simple_cst_list_equal (const_tree l1, const_tree l2)
1209 {
1210   while (l1 != NULL_TREE && l2 != NULL_TREE)
1211     {
1212       if (simple_cst_equal (TREE_VALUE (l1), TREE_VALUE (l2)) != 1)
1213 	return false;
1214 
1215       l1 = TREE_CHAIN (l1);
1216       l2 = TREE_CHAIN (l2);
1217     }
1218 
1219   return l1 == l2;
1220 }
1221 
1222 /* Check if "omp declare simd" attribute arguments, CLAUSES1 and CLAUSES2, are
1223    the same.  */
1224 
1225 static bool
omp_declare_simd_clauses_equal(tree clauses1,tree clauses2)1226 omp_declare_simd_clauses_equal (tree clauses1, tree clauses2)
1227 {
1228   tree cl1, cl2;
1229   for (cl1 = clauses1, cl2 = clauses2;
1230        cl1 && cl2;
1231        cl1 = OMP_CLAUSE_CHAIN (cl1), cl2 = OMP_CLAUSE_CHAIN (cl2))
1232     {
1233       if (OMP_CLAUSE_CODE (cl1) != OMP_CLAUSE_CODE (cl2))
1234 	return false;
1235       if (OMP_CLAUSE_CODE (cl1) != OMP_CLAUSE_SIMDLEN)
1236 	{
1237 	  if (simple_cst_equal (OMP_CLAUSE_DECL (cl1),
1238 				OMP_CLAUSE_DECL (cl2)) != 1)
1239 	    return false;
1240 	}
1241       switch (OMP_CLAUSE_CODE (cl1))
1242 	{
1243 	case OMP_CLAUSE_ALIGNED:
1244 	  if (simple_cst_equal (OMP_CLAUSE_ALIGNED_ALIGNMENT (cl1),
1245 				OMP_CLAUSE_ALIGNED_ALIGNMENT (cl2)) != 1)
1246 	    return false;
1247 	  break;
1248 	case OMP_CLAUSE_LINEAR:
1249 	  if (simple_cst_equal (OMP_CLAUSE_LINEAR_STEP (cl1),
1250 				OMP_CLAUSE_LINEAR_STEP (cl2)) != 1)
1251 	    return false;
1252 	  break;
1253 	case OMP_CLAUSE_SIMDLEN:
1254 	  if (simple_cst_equal (OMP_CLAUSE_SIMDLEN_EXPR (cl1),
1255 				OMP_CLAUSE_SIMDLEN_EXPR (cl2)) != 1)
1256 	    return false;
1257 	default:
1258 	  break;
1259 	}
1260     }
1261   return true;
1262 }
1263 
1264 
1265 /* Compare two attributes for their value identity.  Return true if the
1266    attribute values are known to be equal; otherwise return false.  */
1267 
1268 bool
attribute_value_equal(const_tree attr1,const_tree attr2)1269 attribute_value_equal (const_tree attr1, const_tree attr2)
1270 {
1271   if (TREE_VALUE (attr1) == TREE_VALUE (attr2))
1272     return true;
1273 
1274   if (TREE_VALUE (attr1) != NULL_TREE
1275       && TREE_CODE (TREE_VALUE (attr1)) == TREE_LIST
1276       && TREE_VALUE (attr2) != NULL_TREE
1277       && TREE_CODE (TREE_VALUE (attr2)) == TREE_LIST)
1278     {
1279       /* Handle attribute format.  */
1280       if (is_attribute_p ("format", get_attribute_name (attr1)))
1281 	{
1282 	  attr1 = TREE_VALUE (attr1);
1283 	  attr2 = TREE_VALUE (attr2);
1284 	  /* Compare the archetypes (printf/scanf/strftime/...).  */
1285 	  if (!cmp_attrib_identifiers (TREE_VALUE (attr1), TREE_VALUE (attr2)))
1286 	    return false;
1287 	  /* Archetypes are the same.  Compare the rest.  */
1288 	  return (simple_cst_list_equal (TREE_CHAIN (attr1),
1289 					 TREE_CHAIN (attr2)) == 1);
1290 	}
1291       return (simple_cst_list_equal (TREE_VALUE (attr1),
1292 				     TREE_VALUE (attr2)) == 1);
1293     }
1294 
1295   if (TREE_VALUE (attr1)
1296       && TREE_CODE (TREE_VALUE (attr1)) == OMP_CLAUSE
1297       && TREE_VALUE (attr2)
1298       && TREE_CODE (TREE_VALUE (attr2)) == OMP_CLAUSE)
1299     return omp_declare_simd_clauses_equal (TREE_VALUE (attr1),
1300 					   TREE_VALUE (attr2));
1301 
1302   return (simple_cst_equal (TREE_VALUE (attr1), TREE_VALUE (attr2)) == 1);
1303 }
1304 
1305 /* Return 0 if the attributes for two types are incompatible, 1 if they
1306    are compatible, and 2 if they are nearly compatible (which causes a
1307    warning to be generated).  */
1308 int
comp_type_attributes(const_tree type1,const_tree type2)1309 comp_type_attributes (const_tree type1, const_tree type2)
1310 {
1311   const_tree a1 = TYPE_ATTRIBUTES (type1);
1312   const_tree a2 = TYPE_ATTRIBUTES (type2);
1313   const_tree a;
1314 
1315   if (a1 == a2)
1316     return 1;
1317   for (a = a1; a != NULL_TREE; a = TREE_CHAIN (a))
1318     {
1319       const struct attribute_spec *as;
1320       const_tree attr;
1321 
1322       as = lookup_attribute_spec (get_attribute_name (a));
1323       if (!as || as->affects_type_identity == false)
1324 	continue;
1325 
1326       attr = lookup_attribute (as->name, CONST_CAST_TREE (a2));
1327       if (!attr || !attribute_value_equal (a, attr))
1328 	break;
1329     }
1330   if (!a)
1331     {
1332       for (a = a2; a != NULL_TREE; a = TREE_CHAIN (a))
1333 	{
1334 	  const struct attribute_spec *as;
1335 
1336 	  as = lookup_attribute_spec (get_attribute_name (a));
1337 	  if (!as || as->affects_type_identity == false)
1338 	    continue;
1339 
1340 	  if (!lookup_attribute (as->name, CONST_CAST_TREE (a1)))
1341 	    break;
1342 	  /* We don't need to compare trees again, as we did this
1343 	     already in first loop.  */
1344 	}
1345       /* All types - affecting identity - are equal, so
1346 	 there is no need to call target hook for comparison.  */
1347       if (!a)
1348 	return 1;
1349     }
1350   if (lookup_attribute ("transaction_safe", CONST_CAST_TREE (a)))
1351     return 0;
1352   if ((lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type1)) != NULL)
1353       ^ (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type2)) != NULL))
1354     return 0;
1355   /* As some type combinations - like default calling-convention - might
1356      be compatible, we have to call the target hook to get the final result.  */
1357   return targetm.comp_type_attributes (type1, type2);
1358 }
1359 
1360 /* Return a type like TTYPE except that its TYPE_ATTRIBUTE
1361    is ATTRIBUTE.
1362 
1363    Record such modified types already made so we don't make duplicates.  */
1364 
1365 tree
build_type_attribute_variant(tree ttype,tree attribute)1366 build_type_attribute_variant (tree ttype, tree attribute)
1367 {
1368   return build_type_attribute_qual_variant (ttype, attribute,
1369 					    TYPE_QUALS (ttype));
1370 }
1371 
1372 /* A variant of lookup_attribute() that can be used with an identifier
1373    as the first argument, and where the identifier can be either
1374    'text' or '__text__'.
1375 
1376    Given an attribute ATTR_IDENTIFIER, and a list of attributes LIST,
1377    return a pointer to the attribute's list element if the attribute
1378    is part of the list, or NULL_TREE if not found.  If the attribute
1379    appears more than once, this only returns the first occurrence; the
1380    TREE_CHAIN of the return value should be passed back in if further
1381    occurrences are wanted.  ATTR_IDENTIFIER must be an identifier but
1382    can be in the form 'text' or '__text__'.  */
1383 static tree
lookup_ident_attribute(tree attr_identifier,tree list)1384 lookup_ident_attribute (tree attr_identifier, tree list)
1385 {
1386   gcc_checking_assert (TREE_CODE (attr_identifier) == IDENTIFIER_NODE);
1387 
1388   while (list)
1389     {
1390       gcc_checking_assert (TREE_CODE (get_attribute_name (list))
1391 			   == IDENTIFIER_NODE);
1392 
1393       if (cmp_attrib_identifiers (attr_identifier,
1394 				  get_attribute_name (list)))
1395 	/* Found it.  */
1396 	break;
1397       list = TREE_CHAIN (list);
1398     }
1399 
1400   return list;
1401 }
1402 
1403 /* Remove any instances of attribute ATTR_NAME in LIST and return the
1404    modified list.  */
1405 
1406 tree
remove_attribute(const char * attr_name,tree list)1407 remove_attribute (const char *attr_name, tree list)
1408 {
1409   tree *p;
1410   gcc_checking_assert (attr_name[0] != '_');
1411 
1412   for (p = &list; *p;)
1413     {
1414       tree l = *p;
1415 
1416       tree attr = get_attribute_name (l);
1417       if (is_attribute_p (attr_name, attr))
1418 	*p = TREE_CHAIN (l);
1419       else
1420 	p = &TREE_CHAIN (l);
1421     }
1422 
1423   return list;
1424 }
1425 
1426 /* Return an attribute list that is the union of a1 and a2.  */
1427 
1428 tree
merge_attributes(tree a1,tree a2)1429 merge_attributes (tree a1, tree a2)
1430 {
1431   tree attributes;
1432 
1433   /* Either one unset?  Take the set one.  */
1434 
1435   if ((attributes = a1) == 0)
1436     attributes = a2;
1437 
1438   /* One that completely contains the other?  Take it.  */
1439 
1440   else if (a2 != 0 && ! attribute_list_contained (a1, a2))
1441     {
1442       if (attribute_list_contained (a2, a1))
1443 	attributes = a2;
1444       else
1445 	{
1446 	  /* Pick the longest list, and hang on the other list.  */
1447 
1448 	  if (list_length (a1) < list_length (a2))
1449 	    attributes = a2, a2 = a1;
1450 
1451 	  for (; a2 != 0; a2 = TREE_CHAIN (a2))
1452 	    {
1453 	      tree a;
1454 	      for (a = lookup_ident_attribute (get_attribute_name (a2),
1455 					       attributes);
1456 		   a != NULL_TREE && !attribute_value_equal (a, a2);
1457 		   a = lookup_ident_attribute (get_attribute_name (a2),
1458 					       TREE_CHAIN (a)))
1459 		;
1460 	      if (a == NULL_TREE)
1461 		{
1462 		  a1 = copy_node (a2);
1463 		  TREE_CHAIN (a1) = attributes;
1464 		  attributes = a1;
1465 		}
1466 	    }
1467 	}
1468     }
1469   return attributes;
1470 }
1471 
1472 /* Given types T1 and T2, merge their attributes and return
1473   the result.  */
1474 
1475 tree
merge_type_attributes(tree t1,tree t2)1476 merge_type_attributes (tree t1, tree t2)
1477 {
1478   return merge_attributes (TYPE_ATTRIBUTES (t1),
1479 			   TYPE_ATTRIBUTES (t2));
1480 }
1481 
1482 /* Given decls OLDDECL and NEWDECL, merge their attributes and return
1483    the result.  */
1484 
1485 tree
merge_decl_attributes(tree olddecl,tree newdecl)1486 merge_decl_attributes (tree olddecl, tree newdecl)
1487 {
1488   return merge_attributes (DECL_ATTRIBUTES (olddecl),
1489 			   DECL_ATTRIBUTES (newdecl));
1490 }
1491 
1492 /* Duplicate all attributes with name NAME in ATTR list to *ATTRS if
1493    they are missing there.  */
1494 
1495 void
duplicate_one_attribute(tree * attrs,tree attr,const char * name)1496 duplicate_one_attribute (tree *attrs, tree attr, const char *name)
1497 {
1498   attr = lookup_attribute (name, attr);
1499   if (!attr)
1500     return;
1501   tree a = lookup_attribute (name, *attrs);
1502   while (attr)
1503     {
1504       tree a2;
1505       for (a2 = a; a2; a2 = lookup_attribute (name, TREE_CHAIN (a2)))
1506 	if (attribute_value_equal (attr, a2))
1507 	  break;
1508       if (!a2)
1509 	{
1510 	  a2 = copy_node (attr);
1511 	  TREE_CHAIN (a2) = *attrs;
1512 	  *attrs = a2;
1513 	}
1514       attr = lookup_attribute (name, TREE_CHAIN (attr));
1515     }
1516 }
1517 
1518 /* Duplicate all attributes from user DECL to the corresponding
1519    builtin that should be propagated.  */
1520 
1521 void
copy_attributes_to_builtin(tree decl)1522 copy_attributes_to_builtin (tree decl)
1523 {
1524   tree b = builtin_decl_explicit (DECL_FUNCTION_CODE (decl));
1525   if (b)
1526     duplicate_one_attribute (&DECL_ATTRIBUTES (b),
1527 			     DECL_ATTRIBUTES (decl), "omp declare simd");
1528 }
1529 
1530 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
1531 
1532 /* Specialization of merge_decl_attributes for various Windows targets.
1533 
1534    This handles the following situation:
1535 
1536      __declspec (dllimport) int foo;
1537      int foo;
1538 
1539    The second instance of `foo' nullifies the dllimport.  */
1540 
1541 tree
merge_dllimport_decl_attributes(tree old,tree new_tree)1542 merge_dllimport_decl_attributes (tree old, tree new_tree)
1543 {
1544   tree a;
1545   int delete_dllimport_p = 1;
1546 
1547   /* What we need to do here is remove from `old' dllimport if it doesn't
1548      appear in `new'.  dllimport behaves like extern: if a declaration is
1549      marked dllimport and a definition appears later, then the object
1550      is not dllimport'd.  We also remove a `new' dllimport if the old list
1551      contains dllexport:  dllexport always overrides dllimport, regardless
1552      of the order of declaration.  */
1553   if (!VAR_OR_FUNCTION_DECL_P (new_tree))
1554     delete_dllimport_p = 0;
1555   else if (DECL_DLLIMPORT_P (new_tree)
1556      	   && lookup_attribute ("dllexport", DECL_ATTRIBUTES (old)))
1557     {
1558       DECL_DLLIMPORT_P (new_tree) = 0;
1559       warning (OPT_Wattributes, "%q+D already declared with dllexport "
1560 	       "attribute: dllimport ignored", new_tree);
1561     }
1562   else if (DECL_DLLIMPORT_P (old) && !DECL_DLLIMPORT_P (new_tree))
1563     {
1564       /* Warn about overriding a symbol that has already been used, e.g.:
1565 	   extern int __attribute__ ((dllimport)) foo;
1566 	   int* bar () {return &foo;}
1567 	   int foo;
1568       */
1569       if (TREE_USED (old))
1570 	{
1571 	  warning (0, "%q+D redeclared without dllimport attribute "
1572 		   "after being referenced with dll linkage", new_tree);
1573 	  /* If we have used a variable's address with dllimport linkage,
1574 	      keep the old DECL_DLLIMPORT_P flag: the ADDR_EXPR using the
1575 	      decl may already have had TREE_CONSTANT computed.
1576 	      We still remove the attribute so that assembler code refers
1577 	      to '&foo rather than '_imp__foo'.  */
1578 	  if (VAR_P (old) && TREE_ADDRESSABLE (old))
1579 	    DECL_DLLIMPORT_P (new_tree) = 1;
1580 	}
1581 
1582       /* Let an inline definition silently override the external reference,
1583 	 but otherwise warn about attribute inconsistency.  */
1584       else if (VAR_P (new_tree) || !DECL_DECLARED_INLINE_P (new_tree))
1585 	warning (OPT_Wattributes, "%q+D redeclared without dllimport "
1586 		 "attribute: previous dllimport ignored", new_tree);
1587     }
1588   else
1589     delete_dllimport_p = 0;
1590 
1591   a = merge_attributes (DECL_ATTRIBUTES (old), DECL_ATTRIBUTES (new_tree));
1592 
1593   if (delete_dllimport_p)
1594     a = remove_attribute ("dllimport", a);
1595 
1596   return a;
1597 }
1598 
1599 /* Handle a "dllimport" or "dllexport" attribute; arguments as in
1600    struct attribute_spec.handler.  */
1601 
1602 tree
handle_dll_attribute(tree * pnode,tree name,tree args,int flags,bool * no_add_attrs)1603 handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
1604 		      bool *no_add_attrs)
1605 {
1606   tree node = *pnode;
1607   bool is_dllimport;
1608 
1609   /* These attributes may apply to structure and union types being created,
1610      but otherwise should pass to the declaration involved.  */
1611   if (!DECL_P (node))
1612     {
1613       if (flags & ((int) ATTR_FLAG_DECL_NEXT | (int) ATTR_FLAG_FUNCTION_NEXT
1614 		   | (int) ATTR_FLAG_ARRAY_NEXT))
1615 	{
1616 	  *no_add_attrs = true;
1617 	  return tree_cons (name, args, NULL_TREE);
1618 	}
1619       if (TREE_CODE (node) == RECORD_TYPE
1620 	  || TREE_CODE (node) == UNION_TYPE)
1621 	{
1622 	  node = TYPE_NAME (node);
1623 	  if (!node)
1624 	    return NULL_TREE;
1625 	}
1626       else
1627 	{
1628 	  warning (OPT_Wattributes, "%qE attribute ignored",
1629 		   name);
1630 	  *no_add_attrs = true;
1631 	  return NULL_TREE;
1632 	}
1633     }
1634 
1635   if (!VAR_OR_FUNCTION_DECL_P (node) && TREE_CODE (node) != TYPE_DECL)
1636     {
1637       *no_add_attrs = true;
1638       warning (OPT_Wattributes, "%qE attribute ignored",
1639 	       name);
1640       return NULL_TREE;
1641     }
1642 
1643   if (TREE_CODE (node) == TYPE_DECL
1644       && TREE_CODE (TREE_TYPE (node)) != RECORD_TYPE
1645       && TREE_CODE (TREE_TYPE (node)) != UNION_TYPE)
1646     {
1647       *no_add_attrs = true;
1648       warning (OPT_Wattributes, "%qE attribute ignored",
1649 	       name);
1650       return NULL_TREE;
1651     }
1652 
1653   is_dllimport = is_attribute_p ("dllimport", name);
1654 
1655   /* Report error on dllimport ambiguities seen now before they cause
1656      any damage.  */
1657   if (is_dllimport)
1658     {
1659       /* Honor any target-specific overrides.  */
1660       if (!targetm.valid_dllimport_attribute_p (node))
1661 	*no_add_attrs = true;
1662 
1663      else if (TREE_CODE (node) == FUNCTION_DECL
1664 	      && DECL_DECLARED_INLINE_P (node))
1665 	{
1666 	  warning (OPT_Wattributes, "inline function %q+D declared as "
1667 		  "dllimport: attribute ignored", node);
1668 	  *no_add_attrs = true;
1669 	}
1670       /* Like MS, treat definition of dllimported variables and
1671 	 non-inlined functions on declaration as syntax errors.  */
1672      else if (TREE_CODE (node) == FUNCTION_DECL && DECL_INITIAL (node))
1673 	{
1674 	  error ("function %q+D definition is marked dllimport", node);
1675 	  *no_add_attrs = true;
1676 	}
1677 
1678      else if (VAR_P (node))
1679 	{
1680 	  if (DECL_INITIAL (node))
1681 	    {
1682 	      error ("variable %q+D definition is marked dllimport",
1683 		     node);
1684 	      *no_add_attrs = true;
1685 	    }
1686 
1687 	  /* `extern' needn't be specified with dllimport.
1688 	     Specify `extern' now and hope for the best.  Sigh.  */
1689 	  DECL_EXTERNAL (node) = 1;
1690 	  /* Also, implicitly give dllimport'd variables declared within
1691 	     a function global scope, unless declared static.  */
1692 	  if (current_function_decl != NULL_TREE && !TREE_STATIC (node))
1693 	    TREE_PUBLIC (node) = 1;
1694 	  /* Clear TREE_STATIC because DECL_EXTERNAL is set, unless
1695 	     it is a C++ static data member.  */
1696 	  if (DECL_CONTEXT (node) == NULL_TREE
1697 	      || !RECORD_OR_UNION_TYPE_P (DECL_CONTEXT (node)))
1698 	    TREE_STATIC (node) = 0;
1699 	}
1700 
1701       if (*no_add_attrs == false)
1702 	DECL_DLLIMPORT_P (node) = 1;
1703     }
1704   else if (TREE_CODE (node) == FUNCTION_DECL
1705 	   && DECL_DECLARED_INLINE_P (node)
1706 	   && flag_keep_inline_dllexport)
1707     /* An exported function, even if inline, must be emitted.  */
1708     DECL_EXTERNAL (node) = 0;
1709 
1710   /*  Report error if symbol is not accessible at global scope.  */
1711   if (!TREE_PUBLIC (node) && VAR_OR_FUNCTION_DECL_P (node))
1712     {
1713       error ("external linkage required for symbol %q+D because of "
1714 	     "%qE attribute", node, name);
1715       *no_add_attrs = true;
1716     }
1717 
1718   /* A dllexport'd entity must have default visibility so that other
1719      program units (shared libraries or the main executable) can see
1720      it.  A dllimport'd entity must have default visibility so that
1721      the linker knows that undefined references within this program
1722      unit can be resolved by the dynamic linker.  */
1723   if (!*no_add_attrs)
1724     {
1725       if (DECL_VISIBILITY_SPECIFIED (node)
1726 	  && DECL_VISIBILITY (node) != VISIBILITY_DEFAULT)
1727 	error ("%qE implies default visibility, but %qD has already "
1728 	       "been declared with a different visibility",
1729 	       name, node);
1730       DECL_VISIBILITY (node) = VISIBILITY_DEFAULT;
1731       DECL_VISIBILITY_SPECIFIED (node) = 1;
1732     }
1733 
1734   return NULL_TREE;
1735 }
1736 
1737 #endif /* TARGET_DLLIMPORT_DECL_ATTRIBUTES  */
1738 
1739 /* Given two lists of attributes, return true if list l2 is
1740    equivalent to l1.  */
1741 
1742 int
attribute_list_equal(const_tree l1,const_tree l2)1743 attribute_list_equal (const_tree l1, const_tree l2)
1744 {
1745   if (l1 == l2)
1746     return 1;
1747 
1748   return attribute_list_contained (l1, l2)
1749 	 && attribute_list_contained (l2, l1);
1750 }
1751 
1752 /* Given two lists of attributes, return true if list L2 is
1753    completely contained within L1.  */
1754 /* ??? This would be faster if attribute names were stored in a canonicalized
1755    form.  Otherwise, if L1 uses `foo' and L2 uses `__foo__', the long method
1756    must be used to show these elements are equivalent (which they are).  */
1757 /* ??? It's not clear that attributes with arguments will always be handled
1758    correctly.  */
1759 
1760 int
attribute_list_contained(const_tree l1,const_tree l2)1761 attribute_list_contained (const_tree l1, const_tree l2)
1762 {
1763   const_tree t1, t2;
1764 
1765   /* First check the obvious, maybe the lists are identical.  */
1766   if (l1 == l2)
1767     return 1;
1768 
1769   /* Maybe the lists are similar.  */
1770   for (t1 = l1, t2 = l2;
1771        t1 != 0 && t2 != 0
1772        && get_attribute_name (t1) == get_attribute_name (t2)
1773        && TREE_VALUE (t1) == TREE_VALUE (t2);
1774        t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1775     ;
1776 
1777   /* Maybe the lists are equal.  */
1778   if (t1 == 0 && t2 == 0)
1779     return 1;
1780 
1781   for (; t2 != 0; t2 = TREE_CHAIN (t2))
1782     {
1783       const_tree attr;
1784       /* This CONST_CAST is okay because lookup_attribute does not
1785 	 modify its argument and the return value is assigned to a
1786 	 const_tree.  */
1787       for (attr = lookup_ident_attribute (get_attribute_name (t2),
1788 					  CONST_CAST_TREE (l1));
1789 	   attr != NULL_TREE && !attribute_value_equal (t2, attr);
1790 	   attr = lookup_ident_attribute (get_attribute_name (t2),
1791 					  TREE_CHAIN (attr)))
1792 	;
1793 
1794       if (attr == NULL_TREE)
1795 	return 0;
1796     }
1797 
1798   return 1;
1799 }
1800 
1801 /* The backbone of lookup_attribute().  ATTR_LEN is the string length
1802    of ATTR_NAME, and LIST is not NULL_TREE.
1803 
1804    The function is called from lookup_attribute in order to optimize
1805    for size.  */
1806 
1807 tree
private_lookup_attribute(const char * attr_name,size_t attr_len,tree list)1808 private_lookup_attribute (const char *attr_name, size_t attr_len, tree list)
1809 {
1810   while (list)
1811     {
1812       tree attr = get_attribute_name (list);
1813       size_t ident_len = IDENTIFIER_LENGTH (attr);
1814       if (cmp_attribs (attr_name, attr_len, IDENTIFIER_POINTER (attr),
1815 		       ident_len))
1816 	break;
1817       list = TREE_CHAIN (list);
1818     }
1819 
1820   return list;
1821 }
1822 
1823 /* Return true if the function decl or type NODE has been declared
1824    with attribute ANAME among attributes ATTRS.  */
1825 
1826 static bool
has_attribute(tree node,tree attrs,const char * aname)1827 has_attribute (tree node, tree attrs, const char *aname)
1828 {
1829   if (!strcmp (aname, "const"))
1830     {
1831       if (DECL_P (node) && TREE_READONLY (node))
1832 	return true;
1833     }
1834   else if (!strcmp (aname, "malloc"))
1835     {
1836       if (DECL_P (node) && DECL_IS_MALLOC (node))
1837 	return true;
1838     }
1839   else if (!strcmp (aname, "noreturn"))
1840     {
1841       if (DECL_P (node) && TREE_THIS_VOLATILE (node))
1842 	return true;
1843     }
1844   else if (!strcmp (aname, "nothrow"))
1845     {
1846       if (TREE_NOTHROW (node))
1847 	return true;
1848     }
1849   else if (!strcmp (aname, "pure"))
1850     {
1851       if (DECL_P (node) && DECL_PURE_P (node))
1852 	return true;
1853     }
1854 
1855   return lookup_attribute (aname, attrs);
1856 }
1857 
1858 /* Return the number of mismatched function or type attributes between
1859    the "template" function declaration TMPL and DECL.  The word "template"
1860    doesn't necessarily refer to a C++ template but rather a declaration
1861    whose attributes should be matched by those on DECL.  For a non-zero
1862    return value set *ATTRSTR to a string representation of the list of
1863    mismatched attributes with quoted names.
1864    ATTRLIST is a list of additional attributes that SPEC should be
1865    taken to ultimately be declared with.  */
1866 
1867 unsigned
decls_mismatched_attributes(tree tmpl,tree decl,tree attrlist,const char * const blacklist[],pretty_printer * attrstr)1868 decls_mismatched_attributes (tree tmpl, tree decl, tree attrlist,
1869 			     const char* const blacklist[],
1870 			     pretty_printer *attrstr)
1871 {
1872   if (TREE_CODE (tmpl) != FUNCTION_DECL)
1873     return 0;
1874 
1875   /* Avoid warning if either declaration or its type is deprecated.  */
1876   if (TREE_DEPRECATED (tmpl)
1877       || TREE_DEPRECATED (decl))
1878     return 0;
1879 
1880   const tree tmpls[] = { tmpl, TREE_TYPE (tmpl) };
1881   const tree decls[] = { decl, TREE_TYPE (decl) };
1882 
1883   if (TREE_DEPRECATED (tmpls[1])
1884       || TREE_DEPRECATED (decls[1])
1885       || TREE_DEPRECATED (TREE_TYPE (tmpls[1]))
1886       || TREE_DEPRECATED (TREE_TYPE (decls[1])))
1887     return 0;
1888 
1889   tree tmpl_attrs[] = { DECL_ATTRIBUTES (tmpl), TYPE_ATTRIBUTES (tmpls[1]) };
1890   tree decl_attrs[] = { DECL_ATTRIBUTES (decl), TYPE_ATTRIBUTES (decls[1]) };
1891 
1892   if (!decl_attrs[0])
1893     decl_attrs[0] = attrlist;
1894   else if (!decl_attrs[1])
1895     decl_attrs[1] = attrlist;
1896 
1897   /* Avoid warning if the template has no attributes.  */
1898   if (!tmpl_attrs[0] && !tmpl_attrs[1])
1899     return 0;
1900 
1901   /* Avoid warning if either declaration contains an attribute on
1902      the white list below.  */
1903   const char* const whitelist[] = {
1904     "error", "warning"
1905   };
1906 
1907   for (unsigned i = 0; i != 2; ++i)
1908     for (unsigned j = 0; j != sizeof whitelist / sizeof *whitelist; ++j)
1909       if (lookup_attribute (whitelist[j], tmpl_attrs[i])
1910 	  || lookup_attribute (whitelist[j], decl_attrs[i]))
1911 	return 0;
1912 
1913   /* Put together a list of the black-listed attributes that the template
1914      is declared with and the declaration is not, in case it's not apparent
1915      from the most recent declaration of the template.  */
1916   unsigned nattrs = 0;
1917 
1918   for (unsigned i = 0; blacklist[i]; ++i)
1919     {
1920       /* Attribute leaf only applies to extern functions.  Avoid mentioning
1921 	 it when it's missing from a static declaration.  */
1922       if (!TREE_PUBLIC (decl)
1923 	  && !strcmp ("leaf", blacklist[i]))
1924 	continue;
1925 
1926       for (unsigned j = 0; j != 2; ++j)
1927 	{
1928 	  if (!has_attribute (tmpls[j], tmpl_attrs[j], blacklist[i]))
1929 	    continue;
1930 
1931 	  bool found = false;
1932 	  unsigned kmax = 1 + !!decl_attrs[1];
1933 	  for (unsigned k = 0; k != kmax; ++k)
1934 	    {
1935 	      if (has_attribute (decls[k], decl_attrs[k], blacklist[i]))
1936 		{
1937 		  found = true;
1938 		  break;
1939 		}
1940 	    }
1941 
1942 	  if (!found)
1943 	    {
1944 	      if (nattrs)
1945 		pp_string (attrstr, ", ");
1946 	      pp_begin_quote (attrstr, pp_show_color (global_dc->printer));
1947 	      pp_string (attrstr, blacklist[i]);
1948 	      pp_end_quote (attrstr, pp_show_color (global_dc->printer));
1949 	      ++nattrs;
1950 	    }
1951 
1952 	  break;
1953 	}
1954     }
1955 
1956   return nattrs;
1957 }
1958 
1959 /* Issue a warning for the declaration ALIAS for TARGET where ALIAS
1960    specifies either attributes that are incompatible with those of
1961    TARGET, or attributes that are missing and that declaring ALIAS
1962    with would benefit.  */
1963 
1964 void
maybe_diag_alias_attributes(tree alias,tree target)1965 maybe_diag_alias_attributes (tree alias, tree target)
1966 {
1967   /* Do not expect attributes to match between aliases and ifunc
1968      resolvers.  There is no obvious correspondence between them.  */
1969   if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (alias)))
1970     return;
1971 
1972   const char* const blacklist[] = {
1973     "alloc_align", "alloc_size", "cold", "const", "hot", "leaf", "malloc",
1974     "nonnull", "noreturn", "nothrow", "pure", "returns_nonnull",
1975     "returns_twice", NULL
1976   };
1977 
1978   pretty_printer attrnames;
1979   if (warn_attribute_alias > 1)
1980     {
1981       /* With -Wattribute-alias=2 detect alias declarations that are more
1982 	 restrictive than their targets first.  Those indicate potential
1983 	 codegen bugs.  */
1984       if (unsigned n = decls_mismatched_attributes (alias, target, NULL_TREE,
1985 						    blacklist, &attrnames))
1986 	{
1987 	  auto_diagnostic_group d;
1988 	  if (warning_n (DECL_SOURCE_LOCATION (alias),
1989 			 OPT_Wattribute_alias_, n,
1990 			 "%qD specifies more restrictive attribute than "
1991 			 "its target %qD: %s",
1992 			 "%qD specifies more restrictive attributes than "
1993 			 "its target %qD: %s",
1994 			 alias, target, pp_formatted_text (&attrnames)))
1995 	    inform (DECL_SOURCE_LOCATION (target),
1996 		    "%qD target declared here", alias);
1997 	  return;
1998 	}
1999     }
2000 
2001   /* Detect alias declarations that are less restrictive than their
2002      targets.  Those suggest potential optimization opportunities
2003      (solved by adding the missing attribute(s) to the alias).  */
2004   if (unsigned n = decls_mismatched_attributes (target, alias, NULL_TREE,
2005 						blacklist, &attrnames))
2006     {
2007       auto_diagnostic_group d;
2008       if (warning_n (DECL_SOURCE_LOCATION (alias),
2009 		     OPT_Wmissing_attributes, n,
2010 		     "%qD specifies less restrictive attribute than "
2011 		     "its target %qD: %s",
2012 		     "%qD specifies less restrictive attributes than "
2013 		     "its target %qD: %s",
2014 		     alias, target, pp_formatted_text (&attrnames)))
2015 	inform (DECL_SOURCE_LOCATION (target),
2016 		"%qD target declared here", alias);
2017     }
2018 }
2019 
2020 
2021 #if CHECKING_P
2022 
2023 namespace selftest
2024 {
2025 
2026 /* Helper types to verify the consistency attribute exclusions.  */
2027 
2028 typedef std::pair<const char *, const char *> excl_pair;
2029 
2030 struct excl_hash_traits: typed_noop_remove<excl_pair>
2031 {
2032   typedef excl_pair  value_type;
2033   typedef value_type compare_type;
2034 
hashexcl_hash_traits2035   static hashval_t hash (const value_type &x)
2036   {
2037     hashval_t h1 = htab_hash_string (x.first);
2038     hashval_t h2 = htab_hash_string (x.second);
2039     return h1 ^ h2;
2040   }
2041 
equalexcl_hash_traits2042   static bool equal (const value_type &x, const value_type &y)
2043   {
2044     return !strcmp (x.first, y.first) && !strcmp (x.second, y.second);
2045   }
2046 
mark_deletedexcl_hash_traits2047   static void mark_deleted (value_type &x)
2048   {
2049     x = value_type (NULL, NULL);
2050   }
2051 
2052   static const bool empty_zero_p = false;
2053 
mark_emptyexcl_hash_traits2054   static void mark_empty (value_type &x)
2055   {
2056     x = value_type ("", "");
2057   }
2058 
is_deletedexcl_hash_traits2059   static bool is_deleted (const value_type &x)
2060   {
2061     return !x.first && !x.second;
2062   }
2063 
is_emptyexcl_hash_traits2064   static bool is_empty (const value_type &x)
2065   {
2066     return !*x.first && !*x.second;
2067   }
2068 };
2069 
2070 
2071 /* Self-test to verify that each attribute exclusion is symmetric,
2072    meaning that if attribute A is encoded as incompatible with
2073    attribute B then the opposite relationship is also encoded.
2074    This test also detects most cases of misspelled attribute names
2075    in exclusions.  */
2076 
2077 static void
test_attribute_exclusions()2078 test_attribute_exclusions ()
2079 {
2080   /* Iterate over the array of attribute tables first (with TI0 as
2081      the index) and over the array of attribute_spec in each table
2082      (with SI0 as the index).  */
2083   const size_t ntables = ARRAY_SIZE (attribute_tables);
2084 
2085   /* Set of pairs of mutually exclusive attributes.  */
2086   typedef hash_set<excl_pair, false, excl_hash_traits> exclusion_set;
2087   exclusion_set excl_set;
2088 
2089   for (size_t ti0 = 0; ti0 != ntables; ++ti0)
2090     for (size_t s0 = 0; attribute_tables[ti0][s0].name; ++s0)
2091       {
2092 	const attribute_spec::exclusions *excl
2093 	  = attribute_tables[ti0][s0].exclude;
2094 
2095 	/* Skip each attribute that doesn't define exclusions.  */
2096 	if (!excl)
2097 	  continue;
2098 
2099 	const char *attr_name = attribute_tables[ti0][s0].name;
2100 
2101 	/* Iterate over the set of exclusions for every attribute
2102 	   (with EI0 as the index) adding the exclusions defined
2103 	   for each to the set.  */
2104 	for (size_t ei0 = 0; excl[ei0].name; ++ei0)
2105 	  {
2106 	    const char *excl_name = excl[ei0].name;
2107 
2108 	    if (!strcmp (attr_name, excl_name))
2109 	      continue;
2110 
2111 	    excl_set.add (excl_pair (attr_name, excl_name));
2112 	  }
2113       }
2114 
2115   /* Traverse the set of mutually exclusive pairs of attributes
2116      and verify that they are symmetric.  */
2117   for (exclusion_set::iterator it = excl_set.begin ();
2118        it != excl_set.end ();
2119        ++it)
2120     {
2121       if (!excl_set.contains (excl_pair ((*it).second, (*it).first)))
2122 	{
2123 	  /* An exclusion for an attribute has been found that
2124 	     doesn't have a corresponding exclusion in the opposite
2125 	     direction.  */
2126 	  char desc[120];
2127 	  sprintf (desc, "'%s' attribute exclusion '%s' must be symmetric",
2128 		   (*it).first, (*it).second);
2129 	  fail (SELFTEST_LOCATION, desc);
2130 	}
2131     }
2132 }
2133 
2134 void
attribute_c_tests()2135 attribute_c_tests ()
2136 {
2137   test_attribute_exclusions ();
2138 }
2139 
2140 } /* namespace selftest */
2141 
2142 #endif /* CHECKING_P */
2143