]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/attribs.c
runtime: fix isSystemGoroutine for gccgo
[thirdparty/gcc.git] / gcc / attribs.c
CommitLineData
e3f6ce11 1/* Functions dealing with attribute handling, used by most front ends.
aad93da1 2 Copyright (C) 1992-2017 Free Software Foundation, Inc.
e3f6ce11 3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8c4c00c1 8Software Foundation; either version 3, or (at your option) any later
e3f6ce11 9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
8c4c00c1 17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
e3f6ce11 19
20#include "config.h"
21#include "system.h"
805e22b2 22#include "coretypes.h"
7c29e30e 23#include "target.h"
e3f6ce11 24#include "tree.h"
9ed99284 25#include "stringpool.h"
7c29e30e 26#include "diagnostic-core.h"
9ed99284 27#include "attribs.h"
28#include "stor-layout.h"
26ca6c20 29#include "langhooks.h"
e3fced1a 30#include "plugin.h"
e3f6ce11 31
f8e93a2e 32/* Table of the tables of attributes (common, language, format, machine)
e3f6ce11 33 searched. */
34static const struct attribute_spec *attribute_tables[4];
35
5b634bfa 36/* Substring representation. */
37
38struct substring
39{
40 const char *str;
41 int length;
42};
43
d9dd21a8 44/* Simple hash function to avoid need to scan whole string. */
45
46static inline hashval_t
47substring_hash (const char *str, int l)
48{
49 return str[0] + str[l - 1] * 256 + l * 65536;
50}
51
52/* Used for attribute_hash. */
53
770ff93b 54struct attribute_hasher : nofree_ptr_hash <attribute_spec>
d9dd21a8 55{
9969c043 56 typedef substring *compare_type;
57 static inline hashval_t hash (const attribute_spec *);
58 static inline bool equal (const attribute_spec *, const substring *);
d9dd21a8 59};
60
61inline hashval_t
9969c043 62attribute_hasher::hash (const attribute_spec *spec)
d9dd21a8 63{
64 const int l = strlen (spec->name);
65 return substring_hash (spec->name, l);
66}
67
68inline bool
9969c043 69attribute_hasher::equal (const attribute_spec *spec, const substring *str)
d9dd21a8 70{
71 return (strncmp (spec->name, str->str, str->length) == 0
72 && !spec->name[str->length]);
73}
74
ffcdbf9c 75/* Scoped attribute name representation. */
76
77struct scoped_attributes
78{
79 const char *ns;
f1f41a6c 80 vec<attribute_spec> attributes;
c1f445d2 81 hash_table<attribute_hasher> *attribute_hash;
ffcdbf9c 82};
83
ffcdbf9c 84/* The table of scope attributes. */
f1f41a6c 85static vec<scoped_attributes> attributes_table;
ffcdbf9c 86
87static scoped_attributes* find_attribute_namespace (const char*);
88static void register_scoped_attribute (const struct attribute_spec *,
89 scoped_attributes *);
90
e3f6ce11 91static bool attributes_initialized = false;
92
e3f6ce11 93/* Default empty table of attributes. */
5b634bfa 94
e3f6ce11 95static const struct attribute_spec empty_attribute_table[] =
96{
ac86af5d 97 { NULL, 0, 0, false, false, false, NULL, false }
e3f6ce11 98};
99
5b634bfa 100/* Return base name of the attribute. Ie '__attr__' is turned into 'attr'.
101 To avoid need for copying, we simply return length of the string. */
102
103static void
104extract_attribute_substring (struct substring *str)
105{
106 if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
107 && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
108 {
109 str->length -= 4;
110 str->str += 2;
111 }
112}
113
ffcdbf9c 114/* Insert an array of attributes ATTRIBUTES into a namespace. This
115 array must be NULL terminated. NS is the name of attribute
116 namespace. The function returns the namespace into which the
117 attributes have been registered. */
118
119scoped_attributes*
120register_scoped_attributes (const struct attribute_spec * attributes,
121 const char* ns)
122{
123 scoped_attributes *result = NULL;
124
125 /* See if we already have attributes in the namespace NS. */
126 result = find_attribute_namespace (ns);
127
128 if (result == NULL)
129 {
130 /* We don't have any namespace NS yet. Create one. */
131 scoped_attributes sa;
132
f5d49c14 133 if (attributes_table.is_empty ())
f1f41a6c 134 attributes_table.create (64);
ffcdbf9c 135
136 memset (&sa, 0, sizeof (sa));
137 sa.ns = ns;
f1f41a6c 138 sa.attributes.create (64);
139 result = attributes_table.safe_push (sa);
c1f445d2 140 result->attribute_hash = new hash_table<attribute_hasher> (200);
ffcdbf9c 141 }
142
143 /* Really add the attributes to their namespace now. */
144 for (unsigned i = 0; attributes[i].name != NULL; ++i)
145 {
f1f41a6c 146 result->attributes.safe_push (attributes[i]);
ffcdbf9c 147 register_scoped_attribute (&attributes[i], result);
148 }
149
150 gcc_assert (result != NULL);
151
152 return result;
153}
154
155/* Return the namespace which name is NS, NULL if none exist. */
156
157static scoped_attributes*
158find_attribute_namespace (const char* ns)
159{
160 unsigned ix;
161 scoped_attributes *iter;
162
f1f41a6c 163 FOR_EACH_VEC_ELT (attributes_table, ix, iter)
ffcdbf9c 164 if (ns == iter->ns
165 || (iter->ns != NULL
166 && ns != NULL
167 && !strcmp (iter->ns, ns)))
168 return iter;
169 return NULL;
170}
171
382ecba7 172/* Make some sanity checks on the attribute tables. */
173
174static void
175check_attribute_tables (void)
176{
177 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
178 for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
179 {
180 /* The name must not begin and end with __. */
181 const char *name = attribute_tables[i][j].name;
182 int len = strlen (name);
183
184 gcc_assert (!(name[0] == '_' && name[1] == '_'
185 && name[len - 1] == '_' && name[len - 2] == '_'));
186
187 /* The minimum and maximum lengths must be consistent. */
188 gcc_assert (attribute_tables[i][j].min_length >= 0);
189
190 gcc_assert (attribute_tables[i][j].max_length == -1
191 || (attribute_tables[i][j].max_length
192 >= attribute_tables[i][j].min_length));
193
194 /* An attribute cannot require both a DECL and a TYPE. */
195 gcc_assert (!attribute_tables[i][j].decl_required
196 || !attribute_tables[i][j].type_required);
197
198 /* If an attribute requires a function type, in particular
199 it requires a type. */
200 gcc_assert (!attribute_tables[i][j].function_type_required
201 || attribute_tables[i][j].type_required);
202 }
203
204 /* Check that each name occurs just once in each table. */
205 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
206 for (size_t j = 0; attribute_tables[i][j].name != NULL; j++)
207 for (size_t k = j + 1; attribute_tables[i][k].name != NULL; k++)
208 gcc_assert (strcmp (attribute_tables[i][j].name,
209 attribute_tables[i][k].name));
210
211 /* Check that no name occurs in more than one table. Names that
212 begin with '*' are exempt, and may be overridden. */
213 for (size_t i = 0; i < ARRAY_SIZE (attribute_tables); i++)
214 for (size_t j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
215 for (size_t k = 0; attribute_tables[i][k].name != NULL; k++)
216 for (size_t l = 0; attribute_tables[j][l].name != NULL; l++)
217 gcc_assert (attribute_tables[i][k].name[0] == '*'
218 || strcmp (attribute_tables[i][k].name,
219 attribute_tables[j][l].name));
220}
221
222/* Initialize attribute tables, and make some sanity checks if checking is
223 enabled. */
e3f6ce11 224
b7831f3e 225void
aecda0d6 226init_attributes (void)
e3f6ce11 227{
3585dac7 228 size_t i;
e3f6ce11 229
b7831f3e 230 if (attributes_initialized)
231 return;
232
f8e93a2e 233 attribute_tables[0] = lang_hooks.common_attribute_table;
234 attribute_tables[1] = lang_hooks.attribute_table;
235 attribute_tables[2] = lang_hooks.format_attribute_table;
e3f6ce11 236 attribute_tables[3] = targetm.attribute_table;
237
f8e93a2e 238 /* Translate NULL pointers to pointers to the empty table. */
239 for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
240 if (attribute_tables[i] == NULL)
241 attribute_tables[i] = empty_attribute_table;
242
382ecba7 243 if (flag_checking)
244 check_attribute_tables ();
e3f6ce11 245
ffcdbf9c 246 for (i = 0; i < ARRAY_SIZE (attribute_tables); ++i)
247 /* Put all the GNU attributes into the "gnu" namespace. */
248 register_scoped_attributes (attribute_tables[i], "gnu");
249
e3fced1a 250 invoke_plugin_callbacks (PLUGIN_ATTRIBUTES, NULL);
251 attributes_initialized = true;
252}
253
254/* Insert a single ATTR into the attribute table. */
255
256void
48e1416a 257register_attribute (const struct attribute_spec *attr)
ffcdbf9c 258{
259 register_scoped_attribute (attr, find_attribute_namespace ("gnu"));
260}
261
262/* Insert a single attribute ATTR into a namespace of attributes. */
263
264static void
265register_scoped_attribute (const struct attribute_spec *attr,
266 scoped_attributes *name_space)
e3fced1a 267{
4fb84273 268 struct substring str;
d9dd21a8 269 attribute_spec **slot;
4fb84273 270
ffcdbf9c 271 gcc_assert (attr != NULL && name_space != NULL);
272
c1f445d2 273 gcc_assert (name_space->attribute_hash);
ffcdbf9c 274
4fb84273 275 str.str = attr->name;
276 str.length = strlen (str.str);
c55c785f 277
278 /* Attribute names in the table must be in the form 'text' and not
279 in the form '__text__'. */
280 gcc_assert (str.length > 0 && str.str[0] != '_');
281
d9dd21a8 282 slot = name_space->attribute_hash
c1f445d2 283 ->find_slot_with_hash (&str, substring_hash (str.str, str.length),
284 INSERT);
4c0315d0 285 gcc_assert (!*slot || attr->name[0] == '*');
d9dd21a8 286 *slot = CONST_CAST (struct attribute_spec *, attr);
e3f6ce11 287}
2fdd6488 288
ffcdbf9c 289/* Return the spec for the scoped attribute with namespace NS and
290 name NAME. */
2fdd6488 291
0e80b01d 292static const struct attribute_spec *
ffcdbf9c 293lookup_scoped_attribute_spec (const_tree ns, const_tree name)
2fdd6488 294{
295 struct substring attr;
ffcdbf9c 296 scoped_attributes *attrs;
297
298 const char *ns_str = (ns != NULL_TREE) ? IDENTIFIER_POINTER (ns): NULL;
299
300 attrs = find_attribute_namespace (ns_str);
301
302 if (attrs == NULL)
303 return NULL;
2fdd6488 304
305 attr.str = IDENTIFIER_POINTER (name);
306 attr.length = IDENTIFIER_LENGTH (name);
307 extract_attribute_substring (&attr);
c1f445d2 308 return attrs->attribute_hash->find_with_hash (&attr,
309 substring_hash (attr.str,
310 attr.length));
2fdd6488 311}
ffcdbf9c 312
d4701f6c 313/* Return the spec for the attribute named NAME. If NAME is a TREE_LIST,
314 it also specifies the attribute namespace. */
ffcdbf9c 315
316const struct attribute_spec *
317lookup_attribute_spec (const_tree name)
318{
d4701f6c 319 tree ns;
320 if (TREE_CODE (name) == TREE_LIST)
321 {
322 ns = TREE_PURPOSE (name);
323 name = TREE_VALUE (name);
324 }
325 else
326 ns = get_identifier ("gnu");
327 return lookup_scoped_attribute_spec (ns, name);
ffcdbf9c 328}
329
0e80b01d 330
331/* Return the namespace of the attribute ATTR. This accessor works on
332 GNU and C++11 (scoped) attributes. On GNU attributes,
333 it returns an identifier tree for the string "gnu".
334
335 Please read the comments of cxx11_attribute_p to understand the
336 format of attributes. */
337
338static tree
339get_attribute_namespace (const_tree attr)
340{
341 if (cxx11_attribute_p (attr))
342 return TREE_PURPOSE (TREE_PURPOSE (attr));
343 return get_identifier ("gnu");
344}
345
346
e3f6ce11 347/* Process the attributes listed in ATTRIBUTES and install them in *NODE,
348 which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
349 it should be modified in place; if a TYPE, a copy should be created
350 unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS. FLAGS gives further
351 information, in the form of a bitwise OR of flags in enum attribute_flags
352 from tree.h. Depending on these flags, some attributes may be
353 returned to be applied at a later stage (for example, to apply
101cc430 354 a decl attribute to the declaration rather than to its type). */
e3f6ce11 355
356tree
aecda0d6 357decl_attributes (tree *node, tree attributes, int flags)
e3f6ce11 358{
359 tree a;
360 tree returned_attrs = NULL_TREE;
361
ffcdbf9c 362 if (TREE_TYPE (*node) == error_mark_node || attributes == error_mark_node)
1ccba7b7 363 return NULL_TREE;
364
e3f6ce11 365 if (!attributes_initialized)
366 init_attributes ();
367
46f8e3b0 368 /* If this is a function and the user used #pragma GCC optimize, add the
369 options to the attribute((optimize(...))) list. */
370 if (TREE_CODE (*node) == FUNCTION_DECL && current_optimize_pragma)
371 {
372 tree cur_attr = lookup_attribute ("optimize", attributes);
373 tree opts = copy_list (current_optimize_pragma);
374
375 if (! cur_attr)
376 attributes
377 = tree_cons (get_identifier ("optimize"), opts, attributes);
378 else
379 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
380 }
381
382 if (TREE_CODE (*node) == FUNCTION_DECL
383 && optimization_current_node != optimization_default_node
384 && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
385 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
386
24470055 387 /* If this is a function and the user used #pragma GCC target, add the
388 options to the attribute((target(...))) list. */
46f8e3b0 389 if (TREE_CODE (*node) == FUNCTION_DECL
24470055 390 && current_target_pragma
46f8e3b0 391 && targetm.target_option.valid_attribute_p (*node, NULL_TREE,
24470055 392 current_target_pragma, 0))
46f8e3b0 393 {
24470055 394 tree cur_attr = lookup_attribute ("target", attributes);
395 tree opts = copy_list (current_target_pragma);
46f8e3b0 396
397 if (! cur_attr)
24470055 398 attributes = tree_cons (get_identifier ("target"), opts, attributes);
46f8e3b0 399 else
400 TREE_VALUE (cur_attr) = chainon (opts, TREE_VALUE (cur_attr));
401 }
402
cd28ae7a 403 /* A "naked" function attribute implies "noinline" and "noclone" for
404 those targets that support it. */
405 if (TREE_CODE (*node) == FUNCTION_DECL
c55c785f 406 && attributes
cd28ae7a 407 && lookup_attribute_spec (get_identifier ("naked"))
408 && lookup_attribute ("naked", attributes) != NULL)
409 {
410 if (lookup_attribute ("noinline", attributes) == NULL)
411 attributes = tree_cons (get_identifier ("noinline"), NULL, attributes);
412
413 if (lookup_attribute ("noclone", attributes) == NULL)
414 attributes = tree_cons (get_identifier ("noclone"), NULL, attributes);
415 }
416
883b2e73 417 targetm.insert_attributes (*node, &attributes);
e3f6ce11 418
419 for (a = attributes; a; a = TREE_CHAIN (a))
420 {
ffcdbf9c 421 tree ns = get_attribute_namespace (a);
422 tree name = get_attribute_name (a);
e3f6ce11 423 tree args = TREE_VALUE (a);
424 tree *anode = node;
ffcdbf9c 425 const struct attribute_spec *spec =
426 lookup_scoped_attribute_spec (ns, name);
e3f6ce11 427 bool no_add_attrs = 0;
ce6dcb60 428 int fn_ptr_quals = 0;
79bdd5ff 429 tree fn_ptr_tmp = NULL_TREE;
e3f6ce11 430
431 if (spec == NULL)
432 {
c8010b80 433 if (!(flags & (int) ATTR_FLAG_BUILT_IN))
ffcdbf9c 434 {
435 if (ns == NULL_TREE || !cxx11_attribute_p (a))
436 warning (OPT_Wattributes, "%qE attribute directive ignored",
437 name);
438 else
439 warning (OPT_Wattributes,
440 "%<%E::%E%> scoped attribute directive ignored",
441 ns, name);
442 }
e3f6ce11 443 continue;
444 }
445 else if (list_length (args) < spec->min_length
446 || (spec->max_length >= 0
447 && list_length (args) > spec->max_length))
448 {
abd3e6b5 449 error ("wrong number of arguments specified for %qE attribute",
450 name);
e3f6ce11 451 continue;
452 }
5b634bfa 453 gcc_assert (is_attribute_p (spec->name, name));
e3f6ce11 454
ffcdbf9c 455 if (TYPE_P (*node)
456 && cxx11_attribute_p (a)
457 && !(flags & ATTR_FLAG_TYPE_IN_PLACE))
458 {
459 /* This is a c++11 attribute that appertains to a
460 type-specifier, outside of the definition of, a class
461 type. Ignore it. */
2a6eea59 462 if (warning (OPT_Wattributes, "attribute ignored"))
463 inform (input_location,
464 "an attribute that appertains to a type-specifier "
465 "is ignored");
ffcdbf9c 466 continue;
467 }
468
e3f6ce11 469 if (spec->decl_required && !DECL_P (*anode))
470 {
471 if (flags & ((int) ATTR_FLAG_DECL_NEXT
472 | (int) ATTR_FLAG_FUNCTION_NEXT
473 | (int) ATTR_FLAG_ARRAY_NEXT))
474 {
475 /* Pass on this attribute to be tried again. */
476 returned_attrs = tree_cons (name, args, returned_attrs);
477 continue;
478 }
479 else
480 {
abd3e6b5 481 warning (OPT_Wattributes, "%qE attribute does not apply to types",
482 name);
e3f6ce11 483 continue;
484 }
485 }
486
aa9c60c1 487 /* If we require a type, but were passed a decl, set up to make a
488 new type and update the one in the decl. ATTR_FLAG_TYPE_IN_PLACE
489 would have applied if we'd been passed a type, but we cannot modify
490 the decl's type in place here. */
e3f6ce11 491 if (spec->type_required && DECL_P (*anode))
aa9c60c1 492 {
493 anode = &TREE_TYPE (*anode);
b0dc5308 494 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
aa9c60c1 495 }
e3f6ce11 496
497 if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
498 && TREE_CODE (*anode) != METHOD_TYPE)
499 {
500 if (TREE_CODE (*anode) == POINTER_TYPE
501 && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
502 || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
503 {
79bdd5ff 504 /* OK, this is a bit convoluted. We can't just make a copy
505 of the pointer type and modify its TREE_TYPE, because if
506 we change the attributes of the target type the pointer
507 type needs to have a different TYPE_MAIN_VARIANT. So we
508 pull out the target type now, frob it as appropriate, and
509 rebuild the pointer type later.
510
a0c938f0 511 This would all be simpler if attributes were part of the
512 declarator, grumble grumble. */
79bdd5ff 513 fn_ptr_tmp = TREE_TYPE (*anode);
ce6dcb60 514 fn_ptr_quals = TYPE_QUALS (*anode);
79bdd5ff 515 anode = &fn_ptr_tmp;
516 flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
e3f6ce11 517 }
518 else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
519 {
520 /* Pass on this attribute to be tried again. */
521 returned_attrs = tree_cons (name, args, returned_attrs);
522 continue;
523 }
524
525 if (TREE_CODE (*anode) != FUNCTION_TYPE
526 && TREE_CODE (*anode) != METHOD_TYPE)
527 {
9b2d6d13 528 warning (OPT_Wattributes,
abd3e6b5 529 "%qE attribute only applies to function types",
530 name);
e3f6ce11 531 continue;
532 }
533 }
534
4a2849cb 535 if (TYPE_P (*anode)
536 && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
537 && TYPE_SIZE (*anode) != NULL_TREE)
538 {
539 warning (OPT_Wattributes, "type attributes ignored after type is already defined");
540 continue;
541 }
542
e3f6ce11 543 if (spec->handler != NULL)
ffcdbf9c 544 {
545 int cxx11_flag =
546 cxx11_attribute_p (a) ? ATTR_FLAG_CXX11 : 0;
547
548 returned_attrs = chainon ((*spec->handler) (anode, name, args,
549 flags|cxx11_flag,
550 &no_add_attrs),
551 returned_attrs);
552 }
ae4718db 553
554 /* Layout the decl in case anything changed. */
555 if (spec->type_required && DECL_P (*node)
53e9c5c4 556 && (VAR_P (*node)
e56de52f 557 || TREE_CODE (*node) == PARM_DECL
558 || TREE_CODE (*node) == RESULT_DECL))
1c0a6d1e 559 relayout_decl (*node);
ae4718db 560
e3f6ce11 561 if (!no_add_attrs)
562 {
563 tree old_attrs;
564 tree a;
565
566 if (DECL_P (*anode))
567 old_attrs = DECL_ATTRIBUTES (*anode);
568 else
569 old_attrs = TYPE_ATTRIBUTES (*anode);
570
571 for (a = lookup_attribute (spec->name, old_attrs);
572 a != NULL_TREE;
573 a = lookup_attribute (spec->name, TREE_CHAIN (a)))
574 {
575 if (simple_cst_equal (TREE_VALUE (a), args) == 1)
576 break;
577 }
578
579 if (a == NULL_TREE)
580 {
581 /* This attribute isn't already in the list. */
582 if (DECL_P (*anode))
583 DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
584 else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
316e17ae 585 {
586 TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
587 /* If this is the main variant, also push the attributes
588 out to the other variants. */
589 if (*anode == TYPE_MAIN_VARIANT (*anode))
590 {
591 tree variant;
592 for (variant = *anode; variant;
593 variant = TYPE_NEXT_VARIANT (variant))
594 {
595 if (TYPE_ATTRIBUTES (variant) == old_attrs)
596 TYPE_ATTRIBUTES (variant)
597 = TYPE_ATTRIBUTES (*anode);
598 else if (!lookup_attribute
599 (spec->name, TYPE_ATTRIBUTES (variant)))
600 TYPE_ATTRIBUTES (variant) = tree_cons
601 (name, args, TYPE_ATTRIBUTES (variant));
602 }
603 }
604 }
e3f6ce11 605 else
606 *anode = build_type_attribute_variant (*anode,
607 tree_cons (name, args,
608 old_attrs));
609 }
610 }
79bdd5ff 611
612 if (fn_ptr_tmp)
613 {
614 /* Rebuild the function pointer type and put it in the
615 appropriate place. */
616 fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
ce6dcb60 617 if (fn_ptr_quals)
618 fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals);
79bdd5ff 619 if (DECL_P (*node))
620 TREE_TYPE (*node) = fn_ptr_tmp;
79bdd5ff 621 else
64db345d 622 {
623 gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
624 *node = fn_ptr_tmp;
625 }
79bdd5ff 626 }
e3f6ce11 627 }
628
629 return returned_attrs;
630}
4c0315d0 631
ffcdbf9c 632/* Return TRUE iff ATTR has been parsed by the front-end as a C++-11
633 attribute.
634
635 When G++ parses a C++11 attribute, it is represented as
636 a TREE_LIST which TREE_PURPOSE is itself a TREE_LIST. TREE_PURPOSE
637 (TREE_PURPOSE (ATTR)) is the namespace of the attribute, and the
638 TREE_VALUE (TREE_PURPOSE (ATTR)) is its non-qualified name. Please
639 use get_attribute_namespace and get_attribute_name to retrieve the
640 namespace and name of the attribute, as these accessors work with
641 GNU attributes as well. */
642
643bool
644cxx11_attribute_p (const_tree attr)
645{
646 if (attr == NULL_TREE
647 || TREE_CODE (attr) != TREE_LIST)
648 return false;
649
650 return (TREE_CODE (TREE_PURPOSE (attr)) == TREE_LIST);
651}
652
653/* Return the name of the attribute ATTR. This accessor works on GNU
654 and C++11 (scoped) attributes.
655
656 Please read the comments of cxx11_attribute_p to understand the
657 format of attributes. */
658
659tree
660get_attribute_name (const_tree attr)
661{
662 if (cxx11_attribute_p (attr))
663 return TREE_VALUE (TREE_PURPOSE (attr));
664 return TREE_PURPOSE (attr);
665}
666
4c0315d0 667/* Subroutine of set_method_tm_attributes. Apply TM attribute ATTR
668 to the method FNDECL. */
669
670void
671apply_tm_attr (tree fndecl, tree attr)
672{
673 decl_attributes (&TREE_TYPE (fndecl), tree_cons (attr, NULL, NULL), 0);
674}
ab50af2a 675
676/* Makes a function attribute of the form NAME(ARG_NAME) and chains
677 it to CHAIN. */
678
679tree
680make_attribute (const char *name, const char *arg_name, tree chain)
681{
682 tree attr_name;
683 tree attr_arg_name;
684 tree attr_args;
685 tree attr;
686
687 attr_name = get_identifier (name);
688 attr_arg_name = build_string (strlen (arg_name), arg_name);
689 attr_args = tree_cons (NULL_TREE, attr_arg_name, NULL_TREE);
690 attr = tree_cons (attr_name, attr_args, chain);
691 return attr;
692}