Skip to content

Commit

Permalink
c++: init_priority and SUPPORTS_INIT_PRIORITY [PR107638]
Browse files Browse the repository at this point in the history
The commit r13-3706-gd0a492faa6478c for correcting the result of
__has_attribute(init_priority) causes a bootstrap failure on hppa64-hpux
because it assumes SUPPORTS_INIT_PRIORITY expands to a simple constant,
but on this target SUPPORTS_INIT_PRIORITY is defined as

  #define SUPPORTS_INIT_PRIORITY (TARGET_GNU_LD ? 1 : 0)

(where TARGET_GNU_LD expands to something in terms of global_options)
which means we can't use this macro to statically exclude the entry
for init_priority when defining the cxx_attribute_table.

So instead of trying to exclude init_priority from the attribute table
for sake of __has_attribute, this patch just makes __has_attribute
handle init_priority specially.

Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?  Also sanity checked by artificially defining SUPPORTS_INIT_PRIORITY
to 0.

	PR c++/107638

gcc/c-family/ChangeLog:

	* c-lex.cc (c_common_has_attribute): Return 1 for init_priority
	iff SUPPORTS_INIT_PRIORITY.

gcc/cp/ChangeLog:

	* tree.cc (cxx_attribute_table): Don't conditionally exclude
	the init_priority entry.
	(handle_init_priority_attribute): Remove ATTRIBUTE_UNUSED.
	Return error_mark_node if !SUPPORTS_INIT_PRIORITY.
  • Loading branch information
Patrick Palka authored and ouuleilei-bot committed Nov 11, 2022
1 parent 52672be commit 5274696
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
9 changes: 9 additions & 0 deletions gcc/c-family/c-lex.cc
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,15 @@ c_common_has_attribute (cpp_reader *pfile, bool std_syntax)
result = 201907;
else if (is_attribute_p ("assume", attr_name))
result = 202207;
else if (is_attribute_p ("init_priority", attr_name))
{
/* The (non-standard) init_priority attribute is always
included in the attribute table, but we don't want to
advertise the attribute unless the target actually
supports init priorities. */
result = SUPPORTS_INIT_PRIORITY ? 1 : 0;
attr_name = NULL_TREE;
}
}
else
{
Expand Down
11 changes: 7 additions & 4 deletions gcc/cp/tree.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5036,10 +5036,8 @@ const struct attribute_spec cxx_attribute_table[] =
{
/* { name, min_len, max_len, decl_req, type_req, fn_type_req,
affects_type_identity, handler, exclude } */
#if SUPPORTS_INIT_PRIORITY
{ "init_priority", 1, 1, true, false, false, false,
handle_init_priority_attribute, NULL },
#endif
{ "abi_tag", 1, -1, false, false, false, true,
handle_abi_tag_attribute, NULL },
{ NULL, 0, 0, false, false, false, false, NULL, NULL }
Expand Down Expand Up @@ -5069,13 +5067,19 @@ const struct attribute_spec std_attribute_table[] =

/* Handle an "init_priority" attribute; arguments as in
struct attribute_spec.handler. */
ATTRIBUTE_UNUSED static tree
static tree
handle_init_priority_attribute (tree* node,
tree name,
tree args,
int /*flags*/,
bool* no_add_attrs)
{
if (!SUPPORTS_INIT_PRIORITY)
/* Treat init_priority as an unrecognized attribute (mirroring the
result of __has_attribute) if the target doesn't support init
priorities. */
return error_mark_node;

tree initp_expr = TREE_VALUE (args);
tree decl = *node;
tree type = TREE_TYPE (decl);
Expand Down Expand Up @@ -5133,7 +5137,6 @@ handle_init_priority_attribute (tree* node,
pri);
}

gcc_assert (SUPPORTS_INIT_PRIORITY);
SET_DECL_INIT_PRIORITY (decl, pri);
DECL_HAS_INIT_PRIORITY_P (decl) = 1;
return NULL_TREE;
Expand Down

0 comments on commit 5274696

Please sign in to comment.