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 [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 4D4D5382E836 for ; Thu, 4 Mar 2021 15:45:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 4D4D5382E836 Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-263-UGFNZo53N6axbdaDC6nkBQ-1; Thu, 04 Mar 2021 10:45:39 -0500 X-MC-Unique: UGFNZo53N6axbdaDC6nkBQ-1 Received: by mail-qt1-f199.google.com with SMTP id 4so15736729qtc.13 for ; Thu, 04 Mar 2021 07:45:39 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=HDonRx7c5UNtoN7DC9PMDQEO2BfxYXGAcY69IU9LBFc=; b=JXAigSd7Xs0FjEMR3+Cdsl/HaLppEd6Kt1A3BdHUugxNLs8MB3+auLPG79Su9bc+wX 8+RemyQa+1DUgYu6iZgrDYfJADWV63nEbo5wD8BrHr7MCij7rkOWTW0MoSz7R4YU8tec 9wJp8vF1BaCdTWjCbFaH0tmE9nj87elg5esSTPjQTbUjNQnS/1CJt2mrz3XCAgj0VK7T /TLFTaV66WEU+Zhxz6GLJ8YWNUiYb5mGmfNAa7akhTln0MPniSUr2AjKRe0RoCioK8Ot /JO8yFpKuItBAArWtKKJfDzGUOMKpHW7S8+GDpIvDN33BNGLreBCGVsMOk9rFOuycziZ xc3w== X-Gm-Message-State: AOAM532MIqyn8osuAZ1NXNM7Vc/A+UVcUIUTySeKF+nPXHK6NGKy3g2H /kpfOqR+AN+DyCIf5GcnML+D+HZreQqd5gYLz2T2RglEPDm4s/N/+g0W/uS3TVp1aNDf9HUT8il ssqnCkOmK659ee0APo6roYNbHR5WMi+tBkWK/iDB8jnxHDTfL//kmQvdRlRciiUzHuQ== X-Received: by 2002:a05:6214:d66:: with SMTP id 6mr4747128qvs.0.1614872738351; Thu, 04 Mar 2021 07:45:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJwcrhkKUkg5ZAMIg/XaXsnm+Y+Lxbh7/uohL3ac1eh/gUou/vOTpS993nHhSkk3JjuNvIzn2A== X-Received: by 2002:a05:6214:d66:: with SMTP id 6mr4747085qvs.0.1614872737907; Thu, 04 Mar 2021 07:45:37 -0800 (PST) Received: from [192.168.1.148] (209-6-216-142.s141.c3-0.smr-cbr1.sbo-smr.ma.cable.rcncustomer.com. [209.6.216.142]) by smtp.gmail.com with ESMTPSA id w59sm3759151qtd.29.2021.03.04.07.45.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 04 Mar 2021 07:45:37 -0800 (PST) Subject: Re: [PATCH] C++: target attribute - local decl To: =?UTF-8?Q?Martin_Li=c5=a1ka?= , gcc-patches@gcc.gnu.org References: <15035626-d39b-cb2a-f9b6-272503b16ba5@suse.cz> <43c9c10d-077a-633d-92d4-d769c5838e6f@redhat.com> <41c44de0-9d88-4a03-079e-a1af4502268b@suse.cz> <34cad5cc-7d96-a348-4e4a-c17673475407@redhat.com> <41174163-b47c-f105-a5f1-8bb2177feefe@suse.cz> <752a6974-2069-eba1-faf0-03aa9689288d@suse.cz> <301ab0a4-59ee-454a-cfff-45594c49adb2@redhat.com> From: Jason Merrill Message-ID: Date: Thu, 4 Mar 2021 10:45:36 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 MIME-Version: 1.0 In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=windows-1252; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-14.3 required=5.0 tests=BAYES_00, BODY_8BITS, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Mar 2021 15:45:42 -0000 On 3/4/21 10:39 AM, Martin Liška wrote: > On 3/4/21 4:03 PM, Jason Merrill wrote: >> Do you really need to register all these pairs?  I was expecting that >> you'd just look through DECL_LOCAL_DECL_ALIAS and then register the >> pair you end up with.  Local decls shouldn't need a cgraph node. > > Well, doing that: > > > commit 662c486edafa467ec41091e84857d594eaf280a2 > Author: Martin Liska > Date:   Wed Mar 3 09:38:55 2021 +0100 > >     c++: support target attr for DECL_LOCAL_DECL_P fns >     gcc/cp/ChangeLog: >             PR c++/99108 >             * call.c (get_function_version_dispatcher): Understand >             DECL_LOCAL_DECL_ALIAS. >             * decl.c (record_function_versions): New. >             (maybe_version_functions): Call record_function_versions >             for both declarations and DECL_LOCAL_DECL_ALIAS aliases. >     gcc/testsuite/ChangeLog: >             PR c++/99108 >             * g++.target/i386/pr99108.C: New test. > > diff --git a/gcc/cp/call.c b/gcc/cp/call.c > index 123f06b1f2b..117f1755191 100644 > --- a/gcc/cp/call.c > +++ b/gcc/cp/call.c > @@ -8467,6 +8467,10 @@ get_function_version_dispatcher (tree fn) >  { >    tree dispatcher_decl = NULL; > > +  if (DECL_LOCAL_DECL_P (fn) > +      && DECL_LOCAL_DECL_ALIAS (fn) != NULL_TREE) > +    fn = DECL_LOCAL_DECL_ALIAS (fn); > + >    gcc_assert (TREE_CODE (fn) == FUNCTION_DECL >            && DECL_FUNCTION_VERSIONED (fn)); > > diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c > index 1742e286d9f..a092539bfa0 100644 > --- a/gcc/cp/decl.c > +++ b/gcc/cp/decl.c > @@ -1115,6 +1115,14 @@ decls_match (tree newdecl, tree olddecl, bool > record_versions /* = true */) >  bool >  maybe_version_functions (tree newdecl, tree olddecl, bool record) >  { > +  if (DECL_LOCAL_DECL_P (olddecl) > +      && DECL_LOCAL_DECL_ALIAS (olddecl) != NULL_TREE) > +    olddecl = DECL_LOCAL_DECL_ALIAS (olddecl); > + > +  if (DECL_LOCAL_DECL_P (newdecl) > +      && DECL_LOCAL_DECL_ALIAS (newdecl) != NULL_TREE) > +    newdecl = DECL_LOCAL_DECL_ALIAS (newdecl); > + >    if (!targetm.target_option.function_versions (newdecl, olddecl)) >      return false; > > The compilation then fails: > /home/marxin/Programming/gcc/gcc/testsuite/g++.target/i386/pr99108.C: In > member function ‘void A::foo(auto:2)’: > /home/marxin/Programming/gcc/gcc/testsuite/g++.target/i386/pr99108.C:12:13: > error: call of overloaded ‘f()’ is ambiguous >    12 |   int b = f(); >       |             ^ > /home/marxin/Programming/gcc/gcc/testsuite/g++.target/i386/pr99108.C:10:7: > note: candidate: ‘int f()’ >    10 |   int f(void) __attribute__((target("default"))); >       |       ^ > /home/marxin/Programming/gcc/gcc/testsuite/g++.target/i386/pr99108.C:11:7: > note: candidate: ‘int f()’ >    11 |   int f(void) __attribute__((target("arch=atom"))); >       |       ^ > > likely because DECL_FUNCTION_VERSIONED is missing for the local decls. Sure, I guess you do need to set that flag for the local decls, but that should be all. Jason