From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x52b.google.com (mail-pg1-x52b.google.com [IPv6:2607:f8b0:4864:20::52b]) by sourceware.org (Postfix) with ESMTPS id 1E5283858D32 for ; Thu, 6 Oct 2022 16:52:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1E5283858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pg1-x52b.google.com with SMTP id s206so2376258pgs.3 for ; Thu, 06 Oct 2022 09:52:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=6E0u97ZJzmi1leltAEVYap3RrLpmOqnao0F0vP51nYA=; b=RzItl/7cjmBd2Etw0fL2ucUndcpXbPcpKuRIqcL7Aeu8XKQ6Sj6XMu0VLTjzyzHOJ2 JN28/BFl+HQStBMvp7E9F+k8nT373iPOtiGD5GeWLhmNApWsSiV8FTMdbFbe1b8iez1/ ixmM8PNLoljQgwGCAxA/Nse3eYLEONhooVASx2+dfM+nRCogvgEEVaVGq4jp7UxP8Y0E m0elditQ2bkgKHKpipHgycHZTsohVPukE0hmJRZQIaVrPwKSyc24XkQHud9Vlztpm0Nv YX3BKmKY/8Hl82ZgZ7WlW3ItBe9prgxGOIwGpp0Zdb9OJG4WvgMltcPwv9/ZEJCqz85e i3cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=6E0u97ZJzmi1leltAEVYap3RrLpmOqnao0F0vP51nYA=; b=0L89QNqURy3jFjMZYcd22/+D0zsa+WKOXCmDSkDR0ulSnHJpAwHk+9p41Bylv+irHN 4KGW+lpiNDBsN1/b88bqJ6QZh5w5htxVtY3XqzClhEKKpuBM6ZwNdZwG90kd30JpDtuX 82HyCMvS04m/gucGRYTHVY194eUnlSzB+21vdKQWChXBftWJFMUxQBKa8a11TzTbuR0k faeo3tklbIhntXfbO8E86VfHuHrrkHfVOe/H3h7iVeWPNY1/hKKABQBFotj6fr7KbOvB x05g9JihuMidStLhSv3rhqg0zcucAp7Oh8eZEZV4/ErfqmH+alp4gUxbVY3njRVb+h0c kw+w== X-Gm-Message-State: ACrzQf1kNbgISBd+ArhNv3ARk4dtYFGVkaDEAvrPQHZMSUvB9qfLu7xZ UojL/9k9weK6sxxd8VfX/smCkb2ejipKatJScnA= X-Google-Smtp-Source: AMsMyM51ywcQ00GS9pMO7WpJ/qbvRdskMRAb8bEEmnLxSx2LsKHTGo85mT/HGXIDBFy6/82gxAhjAuBZ48yTk86e7jU= X-Received: by 2002:a05:6a00:15c4:b0:54a:13f1:1118 with SMTP id o4-20020a056a0015c400b0054a13f11118mr805449pfu.52.1665075178042; Thu, 06 Oct 2022 09:52:58 -0700 (PDT) MIME-Version: 1.0 References: <20221006141326.n75ctqeushu47phs@ws2202.lin.mbt.kalray.eu> In-Reply-To: <20221006141326.n75ctqeushu47phs@ws2202.lin.mbt.kalray.eu> From: Andrew Pinski Date: Thu, 6 Oct 2022 09:52:45 -0700 Message-ID: Subject: Re: [RFC] c++: parser - Support for target address spaces in C++ To: Paul Iannetta Cc: gcc@gcc.gnu.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Thu, Oct 6, 2022 at 7:15 AM Paul Iannetta via Gcc 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. > > 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__. Without the mangler support or overloading support, there would will be wrong code emitted as some named address spaces don't overlap with the unnamed ones. E.g. on SPU (which has been since removed), the name address support was added to support automatically DMAing from the PPU memory on the cell. So two address spaces are disjoint. This is also true on other targets too. This is biggest reason why this was not added to the C++ front-end. If clang supports it, does it do overload/template mangling support. I think we don't want a partial support added which will just break under simple usage. Also note named address support is not exactly a GNU specific extension either; https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1275.pdf has the definition of it for C and GCC tries to follow that. Fixed types support in GCC also follows that draft. Thanks, Andrew Pinski > > Depending on the reception, I'll add further testcases and will update > the relevant part of the documentation. > > Cheers, > Paul > > Author: Paul Iannetta > 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. > > 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. */ > > > >