From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 68292 invoked by alias); 25 Jul 2018 12:08:51 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 68277 invoked by uid 89); 25 Jul 2018 12:08:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-16.4 required=5.0 tests=BAYES_00,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_NUMSUBJECT,SPF_PASS autolearn=ham version=3.3.2 spammy=fulfilling X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 25 Jul 2018 12:08:49 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 0DC09AF54; Wed, 25 Jul 2018 12:08:47 +0000 (UTC) Date: Wed, 25 Jul 2018 12:08:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org cc: jason@redhat.com Subject: Re: [PATCH] Fix PR86654 In-Reply-To: Message-ID: References: User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-SW-Source: 2018-07/txt/msg01524.txt.bz2 On Tue, 24 Jul 2018, Richard Biener wrote: > > I am testing the following patch to avoid forcing DIEs for a type context > for method clones late via limbo processing. Instead hang them off > comp_unit_die if there is no early DIE for the function. > > One question is whether the comment "If we're a nested function" > matches up with the decl_function_context (decl) check or whether > we really wanted to check DECL_CONTEXT (decl) == FUNCTION_DECL > which would have made this particular case not match (DECL_CONTEXT > is a RECORD_TYPE which context is a FUNCTION_DECL). > > Another option is of course to make clones not inherit > DECL_CONTEXT from the cloned function (for an artificial > instance the "context" is somewhat arbitrary since it isn't > going to be found by lookup). In fact I long wanted to > represent clones as artificial containers for an > inline instance of the cloned function... > > LTO bootstrap and regtest running on x86_64-unknown-linux-gnu. > > If that succeeds I'm going to apply it as a stop-gap measure to > make Firefox build again with LTO but I'm open to revising it. So there was fallout, namely FAIL: g++.dg/debug/dwarf2/lambda1.C -std=gnu++11 scan-assembler-times DW_TAG_variable[^.]*.ascii "this.0" 2 FAIL: g++.dg/debug/dwarf2/lambda1.C -std=gnu++14 scan-assembler-times DW_TAG_variable[^.]*.ascii "this.0" 2 see the PR for analysis. The following revised patch mitigates this by relying not on !context_die but on an explicit local_scope_p for fulfilling the last part of the overall comment of this section: to have the same parent. For local class methods, this doesn't apply; we just use the old DIE. */ LTO bootstrapped and tested on x86_64-unknown-linux-gnu, bootstrapped and tested on x86_64-unknown-linux-gnu. I have applied the patch for now, as said, I'm happy to revise later. Richard. 2018-07-24 Richard Biener PR debug/86654 * dwarf2out.c (dwarf2out_decl): Do not handle nested functions special wrt context_die late. (gen_subprogram_die): Re-use DIEs in local scope. Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 262940) +++ gcc/dwarf2out.c (working copy) @@ -22766,6 +22766,7 @@ gen_subprogram_die (tree decl, dw_die_re */ || (old_die->die_parent && old_die->die_parent->die_tag == DW_TAG_module) + || local_scope_p (old_die->die_parent) || context_die == NULL) && (DECL_ARTIFICIAL (decl) || (get_AT_file (old_die, DW_AT_decl_file) == file_index @@ -26702,8 +26703,11 @@ dwarf2out_decl (tree decl) case FUNCTION_DECL: /* If we're a nested function, initially use a parent of NULL; if we're a plain function, this will be fixed up in decls_for_scope. If - we're a method, it will be ignored, since we already have a DIE. */ - if (decl_function_context (decl) + we're a method, it will be ignored, since we already have a DIE. + Avoid doing this late though since clones of class methods may + otherwise end up in limbo and create type DIEs late. */ + if (early_dwarf + && decl_function_context (decl) /* But if we're in terse mode, we don't care about scope. */ && debug_info_level > DINFO_LEVEL_TERSE) context_die = NULL;