From: Jason Merrill <jason@redhat.com>
To: Paul Iannetta <piannetta@kalrayinc.com>, gcc-patches@gcc.gnu.org
Subject: Re: [RFC] c++: parser - Support for target address spaces in C++
Date: Thu, 6 Oct 2022 13:34:40 -0400 [thread overview]
Message-ID: <697f23be-7318-1c87-5625-2411b1ab18a3@redhat.com> (raw)
In-Reply-To: <20221006143400.es3u6ebqt3xkw6jp@ws2202.lin.mbt.kalray.eu>
On 10/6/22 10:34, Paul Iannetta wrote:
> Hi,
>
> Presently, GCC supports target address spaces as a GNU extension (cf.
> `info -n "(gcc)Named Address Spaces"`). This is however supported
> only by the C frontend, which is a bit sad, since all the GIMPLE
> machinery is readily available and, moreover, LLVM supports this GNU
> extension both for C and C++.
>
> Here is a first attempt at a patch to enable the support for target
> address spaces in C++. The basic idea is only to make the parser
> recognize address spaces, and lower them into GIMPLE, in the same
> fashion as the C parser. This also makes it possible to merge the
> function `c_register_addr_space` in one place which is better than
> before.
Great.
> The patch still has some drawbacks compared to its C counterpart.
> Namely, much like the `__restrict__` keyword, it is always enabled and
> -std=c++11 won't disable it (whereas -std=c11) would reject address
> spaces. Not also that the mangler ignores address spaces, much like
> it ignores __restrict__.
Hmm? We mangle __restrict:
void f(int *__restrict *p) { } // _Z1fPrPi
but cv-qualifiers (including restrict) are dropped on the top-level type
of a parameter.
If address spaces should be mangled, it probably makes sense to use the
same <extended-qualifier> mangling that we already use for attributes in
write_CV_qualifiers_for_type.
> Depending on the reception, I'll add further testcases and will update
> the relevant part of the documentation.
Please.
> Cheers,
> Paul
>
> Author: Paul Iannetta <piannetta@kalray.eu>
> Date: Wed Oct 5 16:44:36 2022 +0200
>
> Add support for custom address spaces in C++
>
> gcc/
> * tree.h (ENCODE_QUAL_ADDR_SPACE): Missing parentheses.
>
> gcc/c/
> * c-decl.c: Remove c_register_addr_space.
>
> gcc/c-family/
> * c-common.c (c_register_addr_space): Imported from c-decl.c
> * c-common.h: Remove the FIXME.
>
> gcc/cp/
> * cp-tree.h (enum cp_decl_spec): Add addr_space support.
> (struct cp_decl_specifier_seq): Likewise.
> * decl.c (get_type_quals): Likewise.
> * parser.c (cp_parser_type_specifier): Likewise.
> (cp_parser_cv_qualifier_seq_opt): Likewise
> * tree.c: Remove c_register_addr_space stub.
>
> Signed-off-by: Paul Iannetta <piannetta@kalray.eu>
>
> diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
> index 064c2f263f0..282ba54ab70 100644
> --- a/gcc/c-family/c-common.c
> +++ b/gcc/c-family/c-common.c
> @@ -2615,6 +2615,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
> diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
> index ed39b7764bf..f2c1df0c8de 100644
> --- a/gcc/c-family/c-common.h
> +++ b/gcc/c-family/c-common.h
> @@ -808,9 +808,6 @@ extern const struct attribute_spec c_common_format_attribute_table[];
>
> extern tree (*make_fname_decl) (location_t, tree, int);
>
> -/* In c-decl.c and cp/tree.c. FIXME. */
> -extern void c_register_addr_space (const char *str, addr_space_t as);
> -
> /* In c-common.c. */
> extern bool in_late_binary_op;
> extern const char *c_addr_space_name (addr_space_t as);
> @@ -926,6 +923,7 @@ extern void c_common_finish (void);
> extern void c_common_parse_file (void);
> extern FILE *get_dump_info (int, dump_flags_t *);
> 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);
> diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
> index 8e24b522ee4..278d1248d1c 100644
> --- a/gcc/c/c-decl.c
> +++ b/gcc/c/c-decl.c
> @@ -11927,25 +11927,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
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index 15ec4cd199f..4ae971ccb90 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -5974,6 +5974,7 @@ enum cp_decl_spec {
> ds_const,
> ds_volatile,
> ds_restrict,
> + ds_addr_space,
> ds_inline,
> ds_virtual,
> ds_explicit,
> @@ -6046,6 +6047,8 @@ struct cp_decl_specifier_seq {
> /* True iff the alternate "__intN__" form of the __intN type has been
> used. */
> BOOL_BITFIELD int_n_alt: 1;
> + /* The address space that the declaration belongs to. */
> + addr_space_t address_space;
> };
>
> /* The various kinds of declarators. */
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index 03cd0a3a238..b8fc8b58ac7 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -4954,6 +4954,8 @@ get_type_quals (const cp_decl_specifier_seq *declspecs)
> type_quals |= TYPE_QUAL_VOLATILE;
> if (decl_spec_seq_has_spec_p (declspecs, ds_restrict))
> type_quals |= TYPE_QUAL_RESTRICT;
> + if (decl_spec_seq_has_spec_p (declspecs, ds_addr_space))
> + type_quals |= ENCODE_QUAL_ADDR_SPACE (declspecs->address_space);
>
> return type_quals;
> }
> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
> index f48c856fa94..8d6b2a44086 100644
> --- a/gcc/cp/parser.c
> +++ b/gcc/cp/parser.c
> @@ -17796,6 +17796,16 @@ cp_parser_type_specifier (cp_parser* parser,
> break;
> }
>
> +
> + if (RID_FIRST_ADDR_SPACE <= keyword && keyword <= RID_LAST_ADDR_SPACE)
> + {
> + ds = ds_addr_space;
> + if (is_cv_qualifier)
> + *is_cv_qualifier = true;
> + decl_specs->address_space = keyword - RID_FIRST_ADDR_SPACE;
> + }
> +
> +
> /* Handle simple keywords. */
> if (ds != ds_last)
> {
> @@ -21853,6 +21863,7 @@ cp_parser_ptr_operator (cp_parser* parser,
> GNU Extension:
>
> cv-qualifier:
> + address-space-qualifier
> __restrict__
>
> Returns a bitmask representing the cv-qualifiers. */
> @@ -21889,6 +21900,13 @@ cp_parser_cv_qualifier_seq_opt (cp_parser* parser)
> break;
> }
>
> + if (RID_FIRST_ADDR_SPACE <= token->keyword &&
> + token->keyword <= RID_LAST_ADDR_SPACE)
> + {
> + cv_qualifier =
> + ENCODE_QUAL_ADDR_SPACE (token->keyword - RID_FIRST_ADDR_SPACE);
> + }
> +
> if (!cv_qualifier)
> break;
>
> diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
> index 10b818d1370..55b57085618 100644
> --- a/gcc/cp/tree.c
> +++ b/gcc/cp/tree.c
> @@ -5749,15 +5749,6 @@ cp_free_lang_data (tree t)
> DECL_CHAIN (t) = NULL_TREE;
> }
>
> -/* Stub for c-common. Please keep in sync with c-decl.c.
> - 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. */
>
> diff --git a/gcc/tree.h b/gcc/tree.h
> index bb80e81d389..210ef7b85d7 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -2108,7 +2108,7 @@ extern machine_mode vector_type_mode (const_tree);
>
> /* Encode/decode the named memory support as part of the qualifier. If more
> than 8 qualifiers are added, these macros need to be adjusted. */
> -#define ENCODE_QUAL_ADDR_SPACE(NUM) ((NUM & 0xFF) << 8)
> +#define ENCODE_QUAL_ADDR_SPACE(NUM) (((NUM) & 0xFF) << 8)
> #define DECODE_QUAL_ADDR_SPACE(X) (((X) >> 8) & 0xFF)
>
> /* Return all qualifiers except for the address space qualifiers. */
>
>
>
>
next prev parent reply other threads:[~2022-10-06 17:34 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-06 14:34 Paul Iannetta
2022-10-06 17:34 ` Jason Merrill [this message]
2022-10-09 16:12 ` [PATCH] " Paul Iannetta
2022-10-10 19:20 ` Jason Merrill
2022-10-11 22:03 ` [PATCH v2] " Paul Iannetta
2022-10-12 1:49 ` Jason Merrill
2022-10-13 0:52 ` Paul Iannetta
2022-10-13 5:46 ` Jakub Jelinek
2022-10-13 15:14 ` Paul Iannetta
2022-10-13 15:02 ` Jason Merrill
2022-10-13 15:23 ` Paul Iannetta
2022-10-13 15:47 ` Jason Merrill
2022-10-13 16:02 ` Paul Iannetta
2022-10-13 19:41 ` Jason Merrill
2022-10-13 21:57 ` Paul Iannetta
2022-10-14 15:19 ` Jason Merrill
2022-10-18 7:37 ` [PATCH v3] " Paul Iannetta
2022-10-18 14:24 ` Jason Merrill
2022-10-18 17:01 ` Paul Iannetta
2022-10-19 18:55 ` Jason Merrill
2022-10-26 7:18 ` Paul Iannetta
2022-10-26 16:28 ` Jason Merrill
2022-11-10 15:42 ` [PATCH v4] " Paul Iannetta
2022-11-03 13:38 ` [PATCH v3] " Georg-Johann Lay
2022-11-10 14:08 ` Paul Iannetta
2022-11-10 16:40 ` Georg-Johann Lay
2022-11-14 17:55 ` Jason Merrill
2022-11-15 12:15 ` Georg-Johann Lay
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=697f23be-7318-1c87-5625-2411b1ab18a3@redhat.com \
--to=jason@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=piannetta@kalrayinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).