From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from fx301.security-mail.net (smtpout30.security-mail.net [85.31.212.37]) by sourceware.org (Postfix) with ESMTPS id A561C3858D37 for ; Thu, 6 Oct 2022 17:49:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A561C3858D37 Authentication-Results: sourceware.org; dmarc=fail (p=quarantine dis=none) header.from=kalrayinc.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kalray.eu Received: from localhost (localhost [127.0.0.1]) by fx301.security-mail.net (Postfix) with ESMTP id 3B64624BD087 for ; Thu, 6 Oct 2022 19:49:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kalrayinc.com; s=sec-sig-email; t=1665078563; bh=nCPQhb6TamFRzJkA16hyBIG2zcIeOOJaAX+TrXWuRSE=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=l8MPDNvT4w77ubGs4nBD4RdANX1bVkp/Vein2ZcKCZ1g6POBj8QJjcjTMD5injMKN YfnAKX7kBvqqcIVm1t0lFWbDFWHo1IzOEGZ6/i8OPSHpm42UiNcjh0pouAPBsDuR+z ufTuMCnqYpSuLRI41PMXP7OYCGSJi5am1ZeR4Jck= Received: from fx301 (localhost [127.0.0.1]) by fx301.security-mail.net (Postfix) with ESMTP id 1EE2824BD093; Thu, 6 Oct 2022 19:49:23 +0200 (CEST) Received: from zimbra2.kalray.eu (unknown [217.181.231.53]) by fx301.security-mail.net (Postfix) with ESMTPS id 5CF5124BD099; Thu, 6 Oct 2022 19:49:22 +0200 (CEST) Received: from zimbra2.kalray.eu (localhost [127.0.0.1]) by zimbra2.kalray.eu (Postfix) with ESMTPS id 3113627E032A; Thu, 6 Oct 2022 19:49:22 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by zimbra2.kalray.eu (Postfix) with ESMTP id 18B0A27E0444; Thu, 6 Oct 2022 19:49:22 +0200 (CEST) Received: from zimbra2.kalray.eu ([127.0.0.1]) by localhost (zimbra2.kalray.eu [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id JwsTNZr-d2mt; Thu, 6 Oct 2022 19:49:22 +0200 (CEST) Received: from localhost (unknown [192.168.37.51]) by zimbra2.kalray.eu (Postfix) with ESMTPSA id EA82427E032A; Thu, 6 Oct 2022 19:49:21 +0200 (CEST) X-Virus-Scanned: E-securemail, by Secumail Secumail-id: <138b4.633f1522.5c329.0> DKIM-Filter: OpenDKIM Filter v2.10.3 zimbra2.kalray.eu 18B0A27E0444 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kalrayinc.com; s=4F334102-7B72-11EB-A74E-42D0B9747555; t=1665078562; bh=hUN4mnyJvIBHXAXXG5UvO5ZAWETAxC0CtMVMie+U+r8=; h=Date:From:To:Message-ID:MIME-Version; b=ZkMsG4TyT8iU0OtLEHFpe/sWCp4wqpXIZOgF7l489aztp3CemP+md+WXomWS2O6N4 t7zEbdwpsowYe0dcd30rznOsRRL7GOUrzv5r5nlFCBidcDvY6lIa2wzQf0v6fkb+Mz uLWulFKS4lRFQe3RV+sGhBTu5HVMs152yujCMCdSVoTFBeTZ3JxZwwuerdm02ThfbP +hdnVI/a+xIr3KFa88us1cPkEUqWEGZoe3pfXCJJva/ELAuq624no/ndYCW5wEN7RY kd0vFPuIMn379fYe0danuXrzwoiqjlzoRbnqMq4nT7lISsfCzO0ZIBUOxHl7L9ZmJp GFWHN6P0QX+ig== Date: Thu, 6 Oct 2022 19:49:21 +0200 From: Paul Iannetta To: Andrew Pinski Cc: gcc@gcc.gnu.org Subject: Re: [RFC] c++: parser - Support for target address spaces in C++ Message-ID: <20221006174639.exqmhwylja4qjbps@ws2202.lin.mbt.kalray.eu> References: <20221006141326.n75ctqeushu47phs@ws2202.lin.mbt.kalray.eu> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20171215 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-ALTERMIMEV2_out: done X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_LOW,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 06, 2022 at 09:52:45AM -0700, Andrew Pinski wrote: > 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. > I don't know to what extent clang supports their usage in templates but it does support proper overloading/name mangling. I'll add the currently missing mangling support, and how it behaves with templates. > 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. > Good to know! Thank, Paul > 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. */ > > > > > > > > > > > >