From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 86466 invoked by alias); 26 Nov 2015 14:21:24 -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 86452 invoked by uid 89); 26 Nov 2015 14:21:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.4 required=5.0 tests=AWL,BAYES_50,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 X-HELO: smtp.eu.adacore.com Received: from mel.act-europe.fr (HELO smtp.eu.adacore.com) (194.98.77.210) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 26 Nov 2015 14:21:21 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id CCC79352D4BE; Thu, 26 Nov 2015 15:21:18 +0100 (CET) Received: from smtp.eu.adacore.com ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 05aDiOAtk725; Thu, 26 Nov 2015 15:21:18 +0100 (CET) Received: from [10.10.1.112] (cacatoes.act-europe.fr [10.10.1.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.eu.adacore.com (Postfix) with ESMTPSA id 5BB15352D4B6; Thu, 26 Nov 2015 15:21:18 +0100 (CET) Subject: Re: [PATCH, PING*4] PR debug/53927: fix value for DW_AT_static_link To: Eric Botcazou , Jason Merrill References: <55ACA5C9.4090608@adacore.com> <5654916D.5070309@adacore.com> <5655F5E5.1090300@redhat.com> <11778470.G44ae9R4Oo@polaris> Cc: gcc-patches@gcc.gnu.org From: Pierre-Marie de Rodat Message-ID: <5657155E.2080505@adacore.com> Date: Thu, 26 Nov 2015 14:23:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <11778470.G44ae9R4Oo@polaris> Content-Type: multipart/mixed; boundary="------------060906010708020001040401" X-IsSubscribed: yes X-SW-Source: 2015-11/txt/msg03239.txt.bz2 This is a multi-part message in MIME format. --------------060906010708020001040401 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-length: 1096 Thank you Jason! On 11/25/2015 09:35 PM, Eric Botcazou wrote: > We try to declare variables only at the first use point now I think. Fixed, thanks! > + /* Debugging information needs to compute the frame base address of the > + nestee frame out of the static chain from the nested frame. > > "parent frame" Just to make sure: instead of “nestee”: fixed. > No useless period: "debug info" Fixed. > "(through the debugging information)" sounds superfluous. "in order not to..." Done. > + fb_decl = make_node (FIELD_DECL); > + name = concat ("FRAME_BASE.", > + IDENTIFIER_POINTER (DECL_NAME (root->context)), > + NULL); > + DECL_NAME (fb_decl) = get_identifier (name); > + free (name); > > Let's avoid this concat/free business and use a simpler name. Right, I put instead: DECL_NAME (fb_decl) = get_identifier ("FRAME_BASE.PARENT"); > TYPE_FIELDS (root->frame_type) > = chainon (TYPE_FIELDS (root->frame_type), fb_decl); Much better, thanks. :-) Here’s the updated patch. Regtested again on x86_64-linux. -- Pierre-Marie de Rodat --------------060906010708020001040401 Content-Type: text/x-diff; name="0001-DWARF-fix-loc.-descr.-generation-for-DW_AT_static_li.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-DWARF-fix-loc.-descr.-generation-for-DW_AT_static_li.pa"; filename*1="tch" Content-length: 5785 >From 3f067709d86fea108ef4debcc7f9b39cde91e644 Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat Date: Wed, 25 Feb 2015 14:48:24 +0100 Subject: [PATCH] DWARF: fix loc. descr. generation for DW_AT_static_link gcc/ChangeLog: PR debug/53927 * tree-nested.c (finalize_nesting_tree_1): Append a field to hold the frame base address. * dwarf2out.c (gen_subprogram_die): Generate for DW_AT_static_link a location description that computes the value of this field. --- gcc/dwarf2out.c | 20 +++++++++++++++--- gcc/tree-nested.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index f184750..5249fca 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -19113,9 +19113,23 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) compute_frame_pointer_to_fb_displacement (cfa_fb_offset); if (fun->static_chain_decl) - add_AT_location_description - (subr_die, DW_AT_static_link, - loc_list_from_tree (fun->static_chain_decl, 2, NULL)); + { + /* DWARF requires here a location expression that computes the + address of the enclosing subprogram's frame base. The machinery + in tree-nested.c is supposed to store this specific address in the + last field of the FRAME record. */ + const tree frame_type + = TREE_TYPE (TREE_TYPE (fun->static_chain_decl)); + const tree fb_decl = tree_last (TYPE_FIELDS (frame_type)); + + tree fb_expr + = build1 (INDIRECT_REF, frame_type, fun->static_chain_decl); + fb_expr = build3 (COMPONENT_REF, TREE_TYPE (fb_decl), + fb_expr, fb_decl, NULL_TREE); + + add_AT_location_description (subr_die, DW_AT_static_link, + loc_list_from_tree (fb_expr, 0, NULL)); + } } /* Generate child dies for template paramaters. */ diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index 1f6311c..cf6b0d8 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -2718,10 +2718,10 @@ fold_mem_refs (tree *const &e, void *data ATTRIBUTE_UNUSED) return true; } -/* Do "everything else" to clean up or complete state collected by the - various walking passes -- lay out the types and decls, generate code - to initialize the frame decl, store critical expressions in the - struct function for rtl to find. */ +/* Do "everything else" to clean up or complete state collected by the various + walking passes -- create a field to hold the frame base address, lay out the + types and decls, generate code to initialize the frame decl, store critical + expressions in the struct function for rtl to find. */ static void finalize_nesting_tree_1 (struct nesting_info *root) @@ -2737,20 +2737,70 @@ finalize_nesting_tree_1 (struct nesting_info *root) out at this time. */ if (root->frame_type) { + /* Debugging information needs to compute the frame base address of the + parent frame out of the static chain from the nested frame. + + The static chain is the address of the FRAME record, so one could + imagine it would be possible to compute the frame base address just + adding a constant offset to this address. Unfortunately, this is not + possible: if the FRAME object has alignment constraints that are + stronger than the stack, then the offset between the frame base and + the FRAME object will be dynamic. + + What we do instead is to append a field to the FRAME object that holds + the frame base address: then debug info just has to fetch this + field. */ + + /* Debugging information will refer to the CFA as the frame base + address: we will do the same here. */ + const tree frame_addr_fndecl + = builtin_decl_explicit (BUILT_IN_DWARF_CFA); + + /* Create a field in the FRAME record to hold the frame base address for + this stack frame. Since it will be used only by the debugger, put it + at the end of the record not to shift all other offsets. */ + tree fb_decl = make_node (FIELD_DECL); + + DECL_NAME (fb_decl) = get_identifier ("FRAME_BASE.PARENT"); + TREE_TYPE (fb_decl) = ptr_type_node; + TREE_ADDRESSABLE (fb_decl) = 1; + DECL_CONTEXT (fb_decl) = root->frame_type; + TYPE_FIELDS (root->frame_type) = chainon (TYPE_FIELDS (root->frame_type), + fb_decl); + /* In some cases the frame type will trigger the -Wpadded warning. This is not helpful; suppress it. */ int save_warn_padded = warn_padded; - tree *adjust; - warn_padded = 0; layout_type (root->frame_type); warn_padded = save_warn_padded; layout_decl (root->frame_decl, 0); + /* Initialize the frame base address field. If the builtin we need is + not available, set it to NULL so that debugging information does not + reference junk. */ + tree fb_ref = build3 (COMPONENT_REF, TREE_TYPE (fb_decl), + root->frame_decl, fb_decl, NULL_TREE); + tree fb_tmp; + + if (frame_addr_fndecl != NULL_TREE) + { + gcall *fb_gimple = gimple_build_call (frame_addr_fndecl, 1, + integer_zero_node); + gimple_stmt_iterator gsi = gsi_last (stmt_list); + + fb_tmp = init_tmp_var_with_call (root, &gsi, fb_gimple); + } + else + fb_tmp = build_int_cst (TREE_TYPE (fb_ref), 0); + gimple_seq_add_stmt (&stmt_list, + gimple_build_assign (fb_ref, fb_tmp)); + /* Remove root->frame_decl from root->new_local_var_chain, so that we can declare it also in the lexical blocks, which helps ensure virtual regs that end up appearing in its RTL expression get substituted in instantiate_virtual_regs(). */ + tree *adjust; for (adjust = &root->new_local_var_chain; *adjust != root->frame_decl; adjust = &DECL_CHAIN (*adjust)) -- 2.3.3.199.g52cae64 --------------060906010708020001040401--