Hi!
On 2026-05-15T14:17:10+0200, Thomas Schwinge <[email protected]> wrote:
I've now rebased [Paul's v4] onto recent GCC trunk, [...]
Regarding 'c_register_addr_space':
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -2894,6 +2921,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);
+ TREE_LANG_FLAG_0 (id) = 1;
+ ridpointers[rid] = id;
+}
+
/* The C version of the register_builtin_type langhook. */
void
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -840,12 +840,11 @@ 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. */
@@ -996,6 +995,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);
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -13856,25 +13856,6 @@ c_parse_final_cleanups (void)
ext_block = NULL;
}
-/* 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_IS_RESERVED_WORD (id) = 1;
- ridpointers [rid] = id;
-}
-
/* Return identifier to look up for omp declare reduction. */
tree
--- a/gcc/cp/tree.cc
+++ b/gcc/cp/tree.cc
@@ -6828,15 +6831,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. */
The original C front end 'c_register_addr_space' code had:
C_IS_RESERVED_WORD (id) = 1;
Now we're using:
TREE_LANG_FLAG_0 (id) = 1;
(That's the 'gcc/c/c-tree.h' definition of 'C_IS_RESERVED_WORD' expanded.)
That happens to work for C++ front end, but only by chance; as of
Subversion r249571 (Git commit 84c0088f38ce49f390401d11a581cd1a57a008d5)
"Reorder IDENTIFIER flags", the correct incantation for the C++ front end
is:
set_identifier_kind (id, cik_keyword);
Therefore, 'c_register_addr_space' can no longer be in
'gcc/c-family/c-common.cc' (at least not without further surgery), and so
I'm restoring the original definitions in 'gcc/c/c-decl.cc' and
'gcc/cp/tree.cc', and then implement it properly in the latter.
See the attached (incremental to Paul's v4)
"c++: parser - Support for target address spaces in C++:
'c_register_addr_space'",
which I intend to merge into the v5 of this patch, unless there's any
objection, of course. With this, the changes related to
'c_register_addr_space' of trunk vs. upcoming v5 are just:
--- gcc/c-family/c-common.h
+++ gcc/c-family/c-common.h
@@ -841,12 +841,13 @@ 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. */
+/* In c-decl.cc and cp/tree.cc. */
extern void c_register_addr_space (const char *str, addr_space_t as);
/* In c-common.cc. */
--- gcc/cp/tree.cc
+++ gcc/cp/tree.cc
@@ -6991,13 +6999,23 @@ 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. */
+/* Register reserved keyword WORD as qualifier for address space AS. */
+
void
-c_register_addr_space (const char * /*word*/, addr_space_t /*as*/)
+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);
+ set_identifier_kind (id, cik_keyword);
+ ridpointers [rid] = id;
}
/* Return the number of operands in T that we care about for things like
--- gcc/doc/tm.texi.in
+++ gcc/doc/tm.texi.in
@@ -7374,7 +7374,7 @@ Internally, address spaces are represented as a
small integer in the
range 0 to 15 with address space 0 being reserved for the generic
address space.
-To register a named address space qualifier keyword with the C front end,
+To register a named address space qualifier keyword for GNU C and GNU C++,
the target may call the @code{c_register_addr_space} routine. For
example,
the SPU port uses the following to declare @code{__ea} as the keyword for
named address space #1:
(For avoidance of doubt: 'C_SET_RID_CODE (id, rid);' remains valid for
both the C and C++ front ends.)
For simplicity of the patch, I've not changed the 'c_' prefix of
'c_register_addr_space', to make it generic ('register_named_addr_space'
maybe?), but I'm happy to do that, if that's better?