Commit 2db9b7cd by Marc Glisse Committed by Marc Glisse

Refactor fileptr_type_node handling

2017-06-23  Marc Glisse  <marc.glisse@inria.fr>

gcc/
	* tree.h (builtin_structptr_type): New type.
	(builtin_structptr_types): Declare new array.
	* tree.c (builtin_structptr_types): New array.
	(free_lang_data, build_common_tree_nodes): Use it.

gcc/c-family/
	* c-common.c (c_common_nodes_and_builtins): Use builtin_structptr_types.

gcc/cp/
	* decl.c (duplicate_decls): Use builtin_structptr_types.

gcc/lto/
	* lto-lang.c (lto_init): Use builtin_structptr_types.

From-SVN: r249585
parent 70fdc808
2017-06-23 Marc Glisse <marc.glisse@inria.fr>
* tree.h (builtin_structptr_type): New type.
(builtin_structptr_types): Declare new array.
* tree.c (builtin_structptr_types): New array.
(free_lang_data, build_common_tree_nodes): Use it.
2017-06-23 Jonathan Wakely <jwakely@redhat.com> 2017-06-23 Jonathan Wakely <jwakely@redhat.com>
PR c++/81187 PR c++/81187
......
2017-06-23 Marc Glisse <marc.glisse@inria.fr>
* c-common.c (c_common_nodes_and_builtins): Use builtin_structptr_types.
2017-06-15 Martin Sebor <msebor@redhat.com> 2017-06-15 Martin Sebor <msebor@redhat.com>
PR c++/80560 PR c++/80560
......
...@@ -4181,10 +4181,14 @@ c_common_nodes_and_builtins (void) ...@@ -4181,10 +4181,14 @@ c_common_nodes_and_builtins (void)
if (c_dialect_cxx ()) if (c_dialect_cxx ())
{ {
/* For C++, make fileptr_type_node a distinct void * type until /* For C++, make fileptr_type_node a distinct void * type until
FILE type is defined. */ FILE type is defined. Likewise for const struct tm*. */
fileptr_type_node = build_variant_type_copy (ptr_type_node); for (unsigned i = 0;
/* Likewise for const struct tm*. */ i < sizeof (builtin_structptr_types)
const_tm_ptr_type_node = build_variant_type_copy (const_ptr_type_node); / sizeof (builtin_structptr_type);
++i)
builtin_structptr_types[i].node =
build_variant_type_copy (builtin_structptr_types[i].base);
} }
record_builtin_type (RID_VOID, NULL, void_type_node); record_builtin_type (RID_VOID, NULL, void_type_node);
......
2017-06-23 Marc Glisse <marc.glisse@inria.fr>
* decl.c (duplicate_decls): Use builtin_structptr_types.
2017-06-22 Nathan Sidwell <nathan@acm.org> 2017-06-22 Nathan Sidwell <nathan@acm.org>
Reorder IDENTIFIER flags Reorder IDENTIFIER flags
......
...@@ -1470,17 +1470,22 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) ...@@ -1470,17 +1470,22 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
t2 = TYPE_ARG_TYPES (TREE_TYPE (olddecl)); t2 = TYPE_ARG_TYPES (TREE_TYPE (olddecl));
t1 || t2; t1 || t2;
t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2)) t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
{
if (!t1 || !t2) if (!t1 || !t2)
break; break;
/* Deal with fileptr_type_node. FILE type is not known /* FILE, tm types are not known at the time
at the time we create the builtins. */ we create the builtins. */
else if (TREE_VALUE (t2) == fileptr_type_node) for (unsigned i = 0;
i < sizeof (builtin_structptr_types)
/ sizeof (builtin_structptr_type);
++i)
if (TREE_VALUE (t2) == builtin_structptr_types[i].node)
{ {
tree t = TREE_VALUE (t1); tree t = TREE_VALUE (t1);
if (TYPE_PTR_P (t) if (TYPE_PTR_P (t)
&& TYPE_IDENTIFIER (TREE_TYPE (t)) && TYPE_IDENTIFIER (TREE_TYPE (t))
== get_identifier ("FILE") == get_identifier (builtin_structptr_types[i].str)
&& compparms (TREE_CHAIN (t1), TREE_CHAIN (t2))) && compparms (TREE_CHAIN (t1), TREE_CHAIN (t2)))
{ {
tree oldargs = TYPE_ARG_TYPES (TREE_TYPE (olddecl)); tree oldargs = TYPE_ARG_TYPES (TREE_TYPE (olddecl));
...@@ -1493,30 +1498,13 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) ...@@ -1493,30 +1498,13 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
newdecl_is_friend); newdecl_is_friend);
TYPE_ARG_TYPES (TREE_TYPE (olddecl)) = oldargs; TYPE_ARG_TYPES (TREE_TYPE (olddecl)) = oldargs;
} }
goto next_arg;
} }
/* Likewise for const struct tm*. */
else if (TREE_VALUE (t2) == const_tm_ptr_type_node)
{
tree t = TREE_VALUE (t1);
if (TYPE_PTR_P (t)
&& TYPE_IDENTIFIER (TREE_TYPE (t))
== get_identifier ("tm")
&& compparms (TREE_CHAIN (t1), TREE_CHAIN (t2)))
{
tree oldargs = TYPE_ARG_TYPES (TREE_TYPE (olddecl));
TYPE_ARG_TYPES (TREE_TYPE (olddecl)) if (! same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
= TYPE_ARG_TYPES (TREE_TYPE (newdecl));
types_match = decls_match (newdecl, olddecl);
if (types_match)
return duplicate_decls (newdecl, olddecl,
newdecl_is_friend);
TYPE_ARG_TYPES (TREE_TYPE (olddecl)) = oldargs;
}
}
else if (! same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
break; break;
next_arg:;
}
warning_at (DECL_SOURCE_LOCATION (newdecl), warning_at (DECL_SOURCE_LOCATION (newdecl),
OPT_Wbuiltin_declaration_mismatch, OPT_Wbuiltin_declaration_mismatch,
......
2017-06-23 Marc Glisse <marc.glisse@inria.fr>
* lto-lang.c (lto_init): Use builtin_structptr_types.
2017-06-15 Jan Hubicka <hubicka@ucw.cz> 2017-06-15 Jan Hubicka <hubicka@ucw.cz>
Thomas Preud'homme <thomas.preudhomme@arm.com> Thomas Preud'homme <thomas.preudhomme@arm.com>
......
...@@ -1220,13 +1220,17 @@ lto_init (void) ...@@ -1220,13 +1220,17 @@ lto_init (void)
/* In the C++ front-end, fileptr_type_node is defined as a variant /* In the C++ front-end, fileptr_type_node is defined as a variant
copy of ptr_type_node, rather than ptr_node itself. The copy of ptr_type_node, rather than ptr_node itself. The
distinction should only be relevant to the front-end, so we distinction should only be relevant to the front-end, so we
always use the C definition here in lto1. */ always use the C definition here in lto1.
gcc_assert (fileptr_type_node == ptr_type_node); Likewise for const struct tm*. */
gcc_assert (TYPE_MAIN_VARIANT (fileptr_type_node) == ptr_type_node); for (unsigned i = 0;
/* Likewise for const struct tm*. */ i < sizeof (builtin_structptr_types) / sizeof (builtin_structptr_type);
gcc_assert (const_tm_ptr_type_node == const_ptr_type_node); ++i)
gcc_assert (TYPE_MAIN_VARIANT (const_tm_ptr_type_node) {
== const_ptr_type_node); gcc_assert (builtin_structptr_types[i].node
== builtin_structptr_types[i].base);
gcc_assert (TYPE_MAIN_VARIANT (builtin_structptr_types[i].node)
== builtin_structptr_types[i].base);
}
lto_build_c_type_nodes (); lto_build_c_type_nodes ();
gcc_assert (va_list_type_node); gcc_assert (va_list_type_node);
......
...@@ -5983,8 +5983,10 @@ free_lang_data (void) ...@@ -5983,8 +5983,10 @@ free_lang_data (void)
free_lang_data_in_cgraph (); free_lang_data_in_cgraph ();
/* Create gimple variants for common types. */ /* Create gimple variants for common types. */
fileptr_type_node = ptr_type_node; for (unsigned i = 0;
const_tm_ptr_type_node = const_ptr_type_node; i < sizeof (builtin_structptr_types) / sizeof (builtin_structptr_type);
++i)
builtin_structptr_types[i].node = builtin_structptr_types[i].base;
/* Reset some langhooks. Do not reset types_compatible_p, it may /* Reset some langhooks. Do not reset types_compatible_p, it may
still be used indirectly via the get_alias_set langhook. */ still be used indirectly via the get_alias_set langhook. */
...@@ -10449,8 +10451,10 @@ build_common_tree_nodes (bool signed_char) ...@@ -10449,8 +10451,10 @@ build_common_tree_nodes (bool signed_char)
ptr_type_node = build_pointer_type (void_type_node); ptr_type_node = build_pointer_type (void_type_node);
const_ptr_type_node const_ptr_type_node
= build_pointer_type (build_type_variant (void_type_node, 1, 0)); = build_pointer_type (build_type_variant (void_type_node, 1, 0));
fileptr_type_node = ptr_type_node; for (unsigned i = 0;
const_tm_ptr_type_node = const_ptr_type_node; i < sizeof (builtin_structptr_types) / sizeof (builtin_structptr_type);
++i)
builtin_structptr_types[i].node = builtin_structptr_types[i].base;
pointer_sized_int_node = build_nonstandard_integer_type (POINTER_SIZE, 1); pointer_sized_int_node = build_nonstandard_integer_type (POINTER_SIZE, 1);
...@@ -14544,6 +14548,16 @@ get_nonnull_args (const_tree fntype) ...@@ -14544,6 +14548,16 @@ get_nonnull_args (const_tree fntype)
return argmap; return argmap;
} }
/* List of pointer types used to declare builtins before we have seen their
real declaration.
Keep the size up to date in tree.h ! */
const builtin_structptr_type builtin_structptr_types[2] =
{
{ fileptr_type_node, ptr_type_node, "FILE" },
{ const_tm_ptr_type_node, const_ptr_type_node, "tm" }
};
#if CHECKING_P #if CHECKING_P
namespace selftest { namespace selftest {
......
...@@ -5523,4 +5523,13 @@ desired_pro_or_demotion_p (const_tree to_type, const_tree from_type) ...@@ -5523,4 +5523,13 @@ desired_pro_or_demotion_p (const_tree to_type, const_tree from_type)
return to_type_precision <= TYPE_PRECISION (from_type); return to_type_precision <= TYPE_PRECISION (from_type);
} }
/* Pointer type used to declare builtins before we have seen its real
declaration. */
struct builtin_structptr_type
{
tree& node;
tree& base;
const char *str;
};
extern const builtin_structptr_type builtin_structptr_types[2];
#endif /* GCC_TREE_H */ #endif /* GCC_TREE_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment