From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 05EE93858D37 for ; Thu, 6 Oct 2022 17:34:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 05EE93858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1665077684; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=I/5fSGRBw0RQ+GZRaUhUolf8IFAJEqP67IMjDNrHcXw=; b=H7ckyaTBwaFy/W7oSdJSSsx/q4yWivKtfWmxdVuzORBjoFm0iPlgCwh2n3xybMdOcQn5f5 ATQ/8giWzstWRc3yusldeCie+dXbWBHuMtm2AgoQhJyGA1AOZX5Ggh1k4qMyZbJ2xY9UTV u+m19aUpYLuUPubQwFs9h18EfuyLepU= Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-465-aeKbDldBOAKK0iSRqSg_rQ-1; Thu, 06 Oct 2022 13:34:43 -0400 X-MC-Unique: aeKbDldBOAKK0iSRqSg_rQ-1 Received: by mail-qk1-f199.google.com with SMTP id j13-20020a05620a288d00b006be7b2a758fso1994285qkp.1 for ; Thu, 06 Oct 2022 10:34:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date; bh=I/5fSGRBw0RQ+GZRaUhUolf8IFAJEqP67IMjDNrHcXw=; b=8AwpSY8VFywbjckjWmOXpn4q6yjTXrjbZq32LSy9xAUt3txaXrTgdGyuAX9AEFINd3 h0yZrdM7xqj+hlLAqUAJp3knBOL+dxByIJ0c5gUkNNLzhJD7npo7az8SQHXPBFEUxHzg Z0VvW9gZhAKggddyp3qqaYygweuodlKPNgNJcGQKosqSEn+sQKlwHHRZea/dVLMCGmoM SThkHWnZ8jJZGQnhc5hwN+8gqsFsvOqdWaoo6oYzAnmpPGJ4Z7EmYAGolCcdbQ/nst06 lNnLMYdf8U3XEtxYVsf/25UI+Y6fVoc7agl9gGDBD/PgWwFU+V8xYuRZZ6mVU1+h/k7L OI9w== X-Gm-Message-State: ACrzQf2dcJ9K4P+ZPlxH2ruO6sdW238crZPAkb552tvDvu4uWEJpUwfE GDqDyQ6emr6LNQQ4ohK43sOYjv2hViO0o+qRq4b0y9Fdd3KRJbRl6DKLaXnhS0bro26zPx1FtXY dhyqSrLG1P0B/8/wiAQ== X-Received: by 2002:a0c:8d09:0:b0:4ac:6f1b:3a13 with SMTP id r9-20020a0c8d09000000b004ac6f1b3a13mr772517qvb.98.1665077682704; Thu, 06 Oct 2022 10:34:42 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6hDsS2qSP8Xg6u5Qwkxg7S8R36cJXvU0dCHamUB9+teTlnfsSYG7KQV4ECbfa622ofo4iYRQ== X-Received: by 2002:a0c:8d09:0:b0:4ac:6f1b:3a13 with SMTP id r9-20020a0c8d09000000b004ac6f1b3a13mr772495qvb.98.1665077682353; Thu, 06 Oct 2022 10:34:42 -0700 (PDT) Received: from [192.168.1.101] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id h7-20020a05620a400700b006b945519488sm7559552qko.88.2022.10.06.10.34.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Oct 2022 10:34:41 -0700 (PDT) Message-ID: <697f23be-7318-1c87-5625-2411b1ab18a3@redhat.com> Date: Thu, 6 Oct 2022 13:34:40 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.13.1 Subject: Re: [RFC] c++: parser - Support for target address spaces in C++ To: Paul Iannetta , gcc-patches@gcc.gnu.org References: <20221006143400.es3u6ebqt3xkw6jp@ws2202.lin.mbt.kalray.eu> From: Jason Merrill In-Reply-To: <20221006143400.es3u6ebqt3xkw6jp@ws2202.lin.mbt.kalray.eu> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_NONE,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 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 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 > 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 > > 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. */ > > > >