... in anticipation of a few coming patches implementing C++ Named
Address Space support.
gcc/c-family/ChangeLog:
* c-common.cc (addr_space_superset): Move here from
../c/c-typeck.cc.
(c_register_addr_space): Move here from ../c/c-decl.cc.
* c-common.h (c_register_addr_space): Move into c-common.cc
section.
(addr_space_superset): Declare.
(c_make_keyword): New. Marks ID as a keyword. Implemented
by both FEs.
(c_unmake_keyword): New. Unmarks ID as a keyword. Implemented
by both FEs.
gcc/c/ChangeLog:
* c-decl.cc (c_make_keyword): Implement.
(c_unmake_keyword): Ditto.
(c_register_addr_space): Move into ../c-family/c-common.cc.
* c-typeck.cc (addr_space_superset): Move into
../c-family/c-common.cc.
gcc/cp/ChangeLog:
* lex.cc (set_identifier_kind): Add comment referencing the two
functions mentioned below.
(c_make_keyword): Implement.
(c_unmake_keyword): Ditto.
* tree.cc (c_register_addr_space): Drop. The implementation is
now in c-family.cc, so no stub is needed.
---
gcc/c-family/c-common.cc | 45 ++++++++++++++++++++++++++++++++++++++++
gcc/c-family/c-common.h | 16 +++++++++++---
gcc/c/c-decl.cc | 26 +++++++++++------------
gcc/c/c-typeck.cc | 26 -----------------------
gcc/cp/lex.cc | 23 ++++++++++++++++++++
gcc/cp/tree.cc | 9 --------
6 files changed, 93 insertions(+), 52 deletions(-)
diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
index 3d7ef128f0d9..e05551e51192 100644
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -660,6 +660,32 @@ c_addr_space_name (addr_space_t as)
return IDENTIFIER_POINTER (ridpointers [rid]);
}
+/* Return true if between two named address spaces, whether there is a superset
+ named address space that encompasses both address spaces. If there is a
+ superset, return which address space is the superset. */
+
+bool
+addr_space_superset (addr_space_t as1, addr_space_t as2, addr_space_t* common)
+{
+ if (as1 == as2)
+ {
+ *common = as1;
+ return true;
+ }
+ else if (targetm.addr_space.subset_p (as1, as2))
+ {
+ *common = as2;
+ return true;
+ }
+ else if (targetm.addr_space.subset_p (as2, as1))
+ {
+ *common = as1;
+ return true;
+ }
+ else
+ return false;
+}
+
/* Push current bindings for the function name VAR_DECLS. */
void
@@ -2899,6 +2925,25 @@ c_build_bitfield_integer_type (unsigned HOST_WIDE_INT
width, int unsignedp)
return build_nonstandard_integer_type (width, unsignedp);
}
+/* Register reserved keyword WORD as qualifier for address space AS. */
+
+void
+c_register_addr_space (const char *word, addr_space_t as)
+{
+ int rid = RID_FIRST_ADDR_SPACE + as;
+ tree id;
+
+ /* Address space qualifiers are only supported
+ in C with GNU extensions enabled. */
+ if (c_dialect_objc () || flag_no_asm)
+ return;
+
+ id = get_identifier (word);
+ C_SET_RID_CODE (id, rid);
+ c_make_keyword (id);
+ ridpointers[rid] = id;
+}
+
/* The C version of the register_builtin_type langhook. */
void
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 40a4771a1f25..569edc064014 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -43,6 +43,10 @@ never after.
#endif
#include "diagnostic-core.h"
+#if CHECKING_P
+# include "target.h"
+#endif
+
/* Usage of TREE_LANG_FLAG_?:
0: IDENTIFIER_MARKED (used by search routines).
C_MAYBE_CONST_EXPR_INT_OPERANDS (in C_MAYBE_CONST_EXPR, for C)
@@ -843,12 +847,10 @@ extern const struct scoped_attribute_specs
c_common_format_attribute_table;
extern tree (*make_fname_decl) (location_t, tree, int);
-/* In c-decl.cc and cp/tree.cc. FIXME. */
-extern void c_register_addr_space (const char *str, addr_space_t as);
-
/* In c-common.cc. */
extern bool in_late_binary_op;
extern const char *c_addr_space_name (addr_space_t as);
+extern bool addr_space_superset (addr_space_t, addr_space_t, addr_space_t *);
extern tree identifier_global_value (tree);
extern tree identifier_global_tag (tree);
extern int names_builtin_p (const char *);
@@ -1002,6 +1004,7 @@ extern bool c_common_init (void);
extern void c_common_finish (void);
extern void c_common_parse_file (void);
extern alias_set_type c_common_get_alias_set (tree);
+extern void c_register_addr_space (const char *, addr_space_t);
extern void c_register_builtin_type (tree, const char*);
extern bool c_promoting_integer_type_p (const_tree);
extern bool self_promoting_args_p (const_tree);
@@ -1133,6 +1136,13 @@ extern tree lookup_name (tree);
extern bool lvalue_p (const_tree);
extern int maybe_adjust_arg_pos_for_attribute (const_tree);
extern bool instantiation_dependent_expression_p (tree);
+/* Make ID into a keyword, in a front end specific manner. Will only be called
+ on normal identifiers. Used in c-common.cc. */
+extern void c_make_keyword (tree id);
+/* Make ID into a regular identifier, in a front end specific manner. Will
+ only be called on identifiers previously given to c_make_keyword. Used in
+ c-common.cc. */
+extern void c_unmake_keyword (tree id);
extern bool vector_targets_convertible_p (const_tree t1, const_tree t2);
extern bool vector_types_convertible_p (const_tree t1, const_tree t2, bool
emit_lax_note);
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index 3c8050a6b13a..cd0601044da0 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -13870,23 +13870,21 @@ c_parse_final_cleanups (void)
ext_block = NULL;
}
-/* Register reserved keyword WORD as qualifier for address space AS. */
+/* c-common.cc uses these two when registering its own keywords. */
+void
+c_make_keyword (tree id)
+{
+ gcc_checking_assert (!C_IS_RESERVED_WORD (id));
+ C_IS_RESERVED_WORD (id) = 1;
+}
void
-c_register_addr_space (const char *word, addr_space_t as)
+c_unmake_keyword (tree id)
{
- int rid = RID_FIRST_ADDR_SPACE + as;
- tree id;
-
- /* Address space qualifiers are only supported
- in C with GNU extensions enabled. */
- if (c_dialect_objc () || flag_no_asm)
- return;
-
- id = get_identifier (word);
- C_SET_RID_CODE (id, rid);
- C_IS_RESERVED_WORD (id) = 1;
- ridpointers [rid] = id;
+ /* We only expect to be clearing identifiers previously made into keywords by
+ c_make_keyword. This is done primarily for self-tests. */
+ gcc_checking_assert (C_IS_RESERVED_WORD (id));
+ C_IS_RESERVED_WORD (id) = 0;
}
/* Return identifier to look up for omp declare reduction. */
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 81ed46f3ed0c..11bf30917ddb 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -316,32 +316,6 @@ c_type_promotes_to (tree type)
return type;
}
-/* Return true if between two named address spaces, whether there is a superset
- named address space that encompasses both address spaces. If there is a
- superset, return which address space is the superset. */
-
-static bool
-addr_space_superset (addr_space_t as1, addr_space_t as2, addr_space_t *common)
-{
- if (as1 == as2)
- {
- *common = as1;
- return true;
- }
- else if (targetm.addr_space.subset_p (as1, as2))
- {
- *common = as2;
- return true;
- }
- else if (targetm.addr_space.subset_p (as2, as1))
- {
- *common = as1;
- return true;
- }
- else
- return false;
-}
-
/* Return a variant of TYPE which has all the type qualifiers of LIKE
as well as those of TYPE. */
diff --git a/gcc/cp/lex.cc b/gcc/cp/lex.cc
index da40be0a5e06..d6fad67cd5b6 100644
--- a/gcc/cp/lex.cc
+++ b/gcc/cp/lex.cc
@@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see
#include "coretypes.h"
#include "cp-tree.h"
#include "stringpool.h"
+#include "c-family/c-common.h"
#include "c-family/c-pragma.h"
#include "c-family/c-objc.h"
#include "gcc-rich-location.h"
@@ -134,6 +135,7 @@ get_identifier_kind_name (tree id)
void
set_identifier_kind (tree id, cp_identifier_kind kind)
{
+ /* See also below. */
gcc_checking_assert (!IDENTIFIER_KIND_BIT_2 (id)
& !IDENTIFIER_KIND_BIT_1 (id)
& !IDENTIFIER_KIND_BIT_0 (id));
@@ -142,6 +144,27 @@ set_identifier_kind (tree id, cp_identifier_kind kind)
IDENTIFIER_KIND_BIT_0 (id) |= (kind >> 0) & 1;
}
+/* c-common.cc uses these two when registering its own keywords. */
+void
+c_make_keyword (tree id)
+{
+ set_identifier_kind (id, cik_keyword);
+}
+
+void
+c_unmake_keyword (tree id)
+{
+ /* We only expect to be clearing identifiers previously made into keywords by
+ c_make_keyword. This is done primarily for self-tests. */
+ static_assert (cik_keyword == 1, "this assert assumes this value");
+ gcc_checking_assert (IDENTIFIER_KIND_BIT_0 (id)
+ && !IDENTIFIER_KIND_BIT_1 (id)
+ && !IDENTIFIER_KIND_BIT_2 (id));
+ IDENTIFIER_KIND_BIT_2 (id) = 0;
+ IDENTIFIER_KIND_BIT_1 (id) = 0;
+ IDENTIFIER_KIND_BIT_0 (id) = 0;
+}
+
/* Create and tag the internal operator name for the overloaded
operator PTR describes. */
diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc
index befdec3ae0de..86ba4fd4fd1a 100644
--- a/gcc/cp/tree.cc
+++ b/gcc/cp/tree.cc
@@ -7041,15 +7041,6 @@ cp_free_lang_data (tree t)
DECL_CHAIN (t) = NULL_TREE;
}
-/* Stub for c-common. Please keep in sync with c-decl.cc.
- FIXME: If address space support is target specific, then this
- should be a C target hook. But currently this is not possible,
- because this function is called via REGISTER_TARGET_PRAGMAS. */
-void
-c_register_addr_space (const char * /*word*/, addr_space_t /*as*/)
-{
-}
-
/* Return the number of operands in T that we care about for things like
mangling. */
--
2.55.0