From patchwork Thu May 21 21:22:15 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aldy Hernandez X-Patchwork-Id: 475229 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id CA2A0140781 for ; Fri, 22 May 2015 07:22:31 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=j+w/z5JK; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; q=dns; s=default; b=aAFQ6uS02fyNF0pZa 1JGAGaLMjCfkYxaEVIlNZe1VAB+trDVqO+xvxs8UalbUg2I4fSB2upzHq3mh/Z4t agRIev7mazLvPLpa+fEKJxWypemlQlTVPu1LhExRi/T7WSGvnG6kkGI1JwbM509K +H4gdMauObQlYQuxqh8cx0uHqg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; s=default; bh=xQFn26kFBw5jFbdWGIpqJFU T/EU=; b=j+w/z5JKBnurptvnn+Uqc6wZFGchfiHCqv9CGnaTxSplMIrOvnmFLTh bThCrVO60fBzuqpiSCzZS3LyVHVZRsCCiKK2FJk+2Ml3jjsuBN2Gvw/MPa6cW/Dz XdRFfCYAlgQEFWsjLZxq6fIOYBrCnTZhjiseDNwWCh4A95ZyfYTc= Received: (qmail 58547 invoked by alias); 21 May 2015 21:22:22 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 58534 invoked by uid 89); 21 May 2015 21:22:21 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.1 required=5.0 tests=AWL, BAYES_50, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 21 May 2015 21:22:20 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t4LLMHN6029847 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 21 May 2015 17:22:17 -0400 Received: from reynosa.quesejoda.com (vpn-49-169.rdu2.redhat.com [10.10.49.169]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t4LLMFUB022147; Thu, 21 May 2015 17:22:16 -0400 Message-ID: <555E4C87.9040804@redhat.com> Date: Thu, 21 May 2015 17:22:15 -0400 From: Aldy Hernandez User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: Eric Botcazou CC: gcc-patches@gcc.gnu.org, jason merrill Subject: Re: [patch 1/10] debug-early merge: Ada front-end References: <554C0417.8020300@redhat.com> <6819186.gzK1HFtdtl@polaris> In-Reply-To: <6819186.gzK1HFtdtl@polaris> On 05/08/2015 06:26 AM, Eric Botcazou wrote: [Jason, question below.] > What's the replacement mechanism for the first pass on global_decls? The > comment explains that generating debug info must be delayed in this case. My apologies for the delay on Ada. I have reworked the patch to leave the first pass on the TYPE_DECLs which are definitely needed. I also optimized things a bit, since we don't need to save all the globals any more. There is one regression which I'd like you and Jason's input before proceeding: +FAIL: gnat.dg/specs/debug1.ads scan-assembler-times DW_AT_artificial 17 The problem is that the Ada front-end twiddles the DECL_ARTIFICIAL flag *after* it has called debug_hooks->early_global_decl(). The function gnat_to_gnu_entity() calls create_var_decl_1->rest_of_decl_compilation, but then much later twiddles DECL_ARTIFICIAL: if (!Comes_From_Source (gnat_entity)) DECL_ARTIFICIAL (gnu_decl) = 1; Twiddling DECL_ARTIFICIAL after we create early dwarf, means the DIE does not get the DW_AT_artificial. Would it be possible for you guys (ahem, Ada folk) to set DECL_ARTIFICIAL before calling rest_of_decl_compilation? If not, Jason I suppose we could tag the DW_AT_artificial in late_global_decl when we notice it now has DECL_ARTIFICIAL set. But I'd prefer not to hack things this way. Thoughts? Aldy gcc/ada/ * gcc-interface/gigi.h (note_types_used_by_globals): Rename from gnat_write_global_declarations. * gcc-interface/misc.c (gnat_parse_file): Call note_types_used_by_globals. Remove LANG_HOOKS_WRITE_GLOBALS. * gcc-interface/utils.c: Rename global_decls to type_decls. (gnat_write_global_declarations): Rename to note_types_used_by_globals. Remove call to finalize_compilation_unit. Remove debug_hooks->global_decl() call for globals. (gnat_pushdecls): Only insert into type_decls if TYPE_DECL. diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h index 6d65fc5..fead2be 100644 --- a/gcc/ada/gcc-interface/gigi.h +++ b/gcc/ada/gcc-interface/gigi.h @@ -535,8 +535,7 @@ extern tree gnat_type_for_size (unsigned precision, int unsignedp); an unsigned type; otherwise a signed type is returned. */ extern tree gnat_type_for_mode (machine_mode mode, int unsignedp); -/* Emit debug info for all global variable declarations. */ -extern void gnat_write_global_declarations (void); +extern void note_types_used_by_globals (void); /* Return the unsigned version of a TYPE_NODE, a scalar type. */ extern tree gnat_unsigned_type (tree type_node); diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index edaab97..2056a61 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -122,6 +122,8 @@ gnat_parse_file (void) /* Call the front end. */ _ada_gnat1drv (); + + note_types_used_by_globals (); } /* Return language mask for option processing. */ @@ -972,8 +974,6 @@ gnat_init_ts (void) #define LANG_HOOKS_GETDECLS lhd_return_null_tree_v #undef LANG_HOOKS_PUSHDECL #define LANG_HOOKS_PUSHDECL gnat_return_tree -#undef LANG_HOOKS_WRITE_GLOBALS -#define LANG_HOOKS_WRITE_GLOBALS gnat_write_global_declarations #undef LANG_HOOKS_GET_ALIAS_SET #define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set #undef LANG_HOOKS_PRINT_DECL diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 5968857..3ef3a3a 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -227,8 +227,8 @@ static GTY((deletable)) struct gnat_binding_level *free_binding_level; /* The context to be used for global declarations. */ static GTY(()) tree global_context; -/* An array of global declarations. */ -static GTY(()) vec *global_decls; +/* An array of global type declarations. */ +static GTY(()) vec *type_decls; /* An array of builtin function declarations. */ static GTY(()) vec *builtin_decls; @@ -765,7 +765,10 @@ gnat_pushdecl (tree decl, Node_Id gnat_node) vec_safe_push (builtin_decls, decl); } else if (global_bindings_p ()) - vec_safe_push (global_decls, decl); + { + if (TREE_CODE (decl) == TYPE_DECL) + vec_safe_push (type_decls, decl); + } else { DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block); @@ -5176,7 +5179,7 @@ smaller_form_type_p (tree type, tree orig_type) static GTY (()) tree dummy_global; void -gnat_write_global_declarations (void) +note_types_used_by_globals (void) { unsigned int i; tree iter; @@ -5209,23 +5212,9 @@ gnat_write_global_declarations (void) ensures that global types whose compilation hasn't been finalized yet, for example pointers to Taft amendment types, have their compilation finalized in the right context. */ - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter) - if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter)) + FOR_EACH_VEC_SAFE_ELT (type_decls, i, iter) + if (!DECL_IGNORED_P (iter)) debug_hooks->type_decl (iter, false); - - /* Proceed to optimize and emit assembly. */ - symtab->finalize_compilation_unit (); - - /* After cgraph has had a chance to emit everything that's going to - be emitted, output debug information for the rest of globals. */ - if (!seen_error ()) - { - timevar_push (TV_SYMOUT); - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter) - if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter)) - debug_hooks->global_decl (iter); - timevar_pop (TV_SYMOUT); - } } /* ************************************************************************