From patchwork Thu Dec 23 20:55:01 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 76556 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]) by ozlabs.org (Postfix) with SMTP id C5CF0B70B8 for ; Fri, 24 Dec 2010 07:55:14 +1100 (EST) Received: (qmail 10689 invoked by alias); 23 Dec 2010 20:55:11 -0000 Received: (qmail 10678 invoked by uid 22791); 23 Dec 2010 20:55:10 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 23 Dec 2010 20:55:04 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oBNKt2dg010398 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 23 Dec 2010 15:55:03 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBNKt2Kx027331 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 23 Dec 2010 15:55:02 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (localhost.localdomain [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id oBNKt1lH009293 for ; Thu, 23 Dec 2010 21:55:01 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id oBNKt18I009291 for gcc-patches@gcc.gnu.org; Thu, 23 Dec 2010 21:55:01 +0100 Date: Thu, 23 Dec 2010 21:55:01 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [PATCH] Updated ENTRY_VALUE patch (PR debug/45882) Message-ID: <20101223205501.GL16156@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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 Hi! Here is the updated follow-up patch to DW_OP_GNU_entry_value support, bootstrapped/regtested on x86_64-linux and i686-linux. 2010-12-22 Jakub Jelinek PR debug/45882 * rtl.def (ENTRY_VALUE): Change format from "e" to "0". * rtl.h (ENTRY_VALUE_EXP): Define. * rtl.c (rtx_equal_p_cb, rtx_equal_p): Handle ENTRY_VALUE. * cselib.c (rtx_equal_for_cselib_p, cselib_hash_rtx): Likewise. * print-rtl.c (print_rtx): Likewise. * gengtype.c (adjust_field_rtx_def): Likewise. * var-tracking.c (vt_add_function_parameter): Adjust gen_rtx_ENTRY_VALUE uses, use ENTRY_VALUE_EXP macro. * dwarf2out.c (mem_loc_descriptor): Use ENTRY_VALUE_EXP macro. * cfgexpand.c (expand_debug_expr): If a SSA_NAME without partition is a default definition of a PARM_DECL, use ENTRY_VALUE of its DECL_INCOMING_RTL if possible, or its DECL_RTL if set. * gcc.dg/guality/pr45882.c: New test. Jakub --- gcc/rtl.def.jj 2010-10-29 02:42:25.417404879 +0200 +++ gcc/rtl.def 2010-10-29 04:35:06.418404652 +0200 @@ -718,9 +718,10 @@ DEF_RTL_EXPR(VAR_LOCATION, "var_location addressable. */ DEF_RTL_EXPR(DEBUG_IMPLICIT_PTR, "debug_implicit_ptr", "t", RTX_OBJ) -/* Represents value that argument had on function entry. Should - be only used in VAR_LOCATION location expression. */ -DEF_RTL_EXPR(ENTRY_VALUE, "entry_value", "e", RTX_OBJ) +/* Represents value that argument had on function entry. The + single argument is the DECL_INCOMING_RTL of the corresponding + parameter. */ +DEF_RTL_EXPR(ENTRY_VALUE, "entry_value", "0", RTX_OBJ) /* All expressions from this point forward appear only in machine descriptions. */ --- gcc/rtl.h.jj 2010-10-12 08:23:50.945247930 +0200 +++ gcc/rtl.h 2010-10-29 04:35:06.419406386 +0200 @@ -833,6 +833,10 @@ extern void rtl_check_failed_flag (const but a value from enum reg_note. */ #define REG_NOTES(INSN) XEXP(INSN, 7) +/* In an ENTRY_VALUE this is the DECL_INCOMING_RTL of the argument in + question. */ +#define ENTRY_VALUE_EXP(RTX) (RTL_CHECKC1 (RTX, 0, ENTRY_VALUE).rt_rtx) + enum reg_note { #define DEF_REG_NOTE(NAME) NAME, --- gcc/rtl.c.jj 2010-10-12 08:23:50.950407955 +0200 +++ gcc/rtl.c 2010-10-29 04:35:06.426412851 +0200 @@ -411,6 +411,9 @@ rtx_equal_p_cb (const_rtx x, const_rtx y return DEBUG_IMPLICIT_PTR_DECL (x) == DEBUG_IMPLICIT_PTR_DECL (y); + case ENTRY_VALUE: + return rtx_equal_p_cb (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y), cb); + default: break; } @@ -535,6 +538,9 @@ rtx_equal_p (const_rtx x, const_rtx y) return DEBUG_IMPLICIT_PTR_DECL (x) == DEBUG_IMPLICIT_PTR_DECL (y); + case ENTRY_VALUE: + return rtx_equal_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y)); + default: break; } --- gcc/cselib.c.jj 2010-09-09 08:42:55.222426928 +0200 +++ gcc/cselib.c 2010-10-29 04:35:06.427414735 +0200 @@ -704,6 +704,9 @@ rtx_equal_for_cselib_p (rtx x, rtx y) return DEBUG_IMPLICIT_PTR_DECL (x) == DEBUG_IMPLICIT_PTR_DECL (y); + case ENTRY_VALUE: + return rtx_equal_for_cselib_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y)); + case LABEL_REF: return XEXP (x, 0) == XEXP (y, 0); @@ -843,6 +846,10 @@ cselib_hash_rtx (rtx x, int create) + DECL_UID (DEBUG_IMPLICIT_PTR_DECL (x)); return hash ? hash : (unsigned int) DEBUG_IMPLICIT_PTR; + case ENTRY_VALUE: + hash += cselib_hash_rtx (ENTRY_VALUE_EXP (x), create); + return hash ? hash : (unsigned int) ENTRY_VALUE; + case CONST_INT: hash += ((unsigned) CONST_INT << 7) + INTVAL (x); return hash ? hash : (unsigned int) CONST_INT; --- gcc/print-rtl.c.jj 2010-10-29 02:42:25.415404492 +0200 +++ gcc/print-rtl.c 2010-10-30 17:52:22.511279808 +0200 @@ -334,6 +334,14 @@ print_rtx (const_rtx in_rtx) DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (in_rtx))); #endif } + else if (i == 0 && GET_CODE (in_rtx) == ENTRY_VALUE) + { + indent += 2; + if (!sawclose) + fprintf (outfile, " "); + print_rtx (ENTRY_VALUE_EXP (in_rtx)); + indent -= 2; + } break; case 'e': --- gcc/gengtype.c.jj 2010-12-22 10:17:25.000000000 +0100 +++ gcc/gengtype.c 2010-12-22 10:27:54.000000000 +0100 @@ -1101,6 +1101,8 @@ adjust_field_rtx_def (type_p t, options_ t = symbol_union_tp, subname = ""; else if (i == BARRIER && aindex >= 3) t = scalar_tp, subname = "rt_int"; + else if (i == ENTRY_VALUE && aindex == 0) + t = rtx_tp, subname = "rt_rtx"; else { error_at_line --- gcc/var-tracking.c.jj 2010-12-22 10:24:03.000000000 +0100 +++ gcc/var-tracking.c 2010-12-22 10:29:51.000000000 +0100 @@ -8358,7 +8358,8 @@ vt_add_function_parameter (tree parm) el = (struct elt_loc_list *) ggc_alloc_cleared_atomic (sizeof (*el)); el->next = val->locs; - el->loc = gen_rtx_ENTRY_VALUE (GET_MODE (incoming), incoming); + el->loc = gen_rtx_ENTRY_VALUE (GET_MODE (incoming)); + ENTRY_VALUE_EXP (el->loc) = incoming; el->setting_insn = get_insns (); val->locs = el; if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE @@ -8375,7 +8376,8 @@ vt_add_function_parameter (tree parm) el = (struct elt_loc_list *) ggc_alloc_cleared_atomic (sizeof (*el)); el->next = val->locs; - el->loc = gen_rtx_ENTRY_VALUE (indmode, mem); + el->loc = gen_rtx_ENTRY_VALUE (indmode); + ENTRY_VALUE_EXP (el->loc) = mem; el->setting_insn = get_insns (); val->locs = el; } --- gcc/dwarf2out.c.jj 2010-10-29 02:42:25.480405518 +0200 +++ gcc/dwarf2out.c 2010-10-29 21:02:36.961659396 +0200 @@ -13791,14 +13791,14 @@ mem_loc_descriptor (rtx rtl, enum machin case ENTRY_VALUE: mem_loc_result = new_loc_descr (DW_OP_GNU_entry_value, 0, 0); mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_loc; - if (REG_P (XEXP (rtl, 0))) + if (REG_P (ENTRY_VALUE_EXP (rtl))) mem_loc_result->dw_loc_oprnd1.v.val_loc - = one_reg_loc_descriptor (dbx_reg_number (XEXP (rtl, 0)), + = one_reg_loc_descriptor (dbx_reg_number (ENTRY_VALUE_EXP (rtl)), VAR_INIT_STATUS_INITIALIZED); - else if (MEM_P (XEXP (rtl, 0)) && REG_P (XEXP (XEXP (rtl, 0), 0))) + else if (MEM_P (ENTRY_VALUE_EXP (rtl)) && REG_P (XEXP (ENTRY_VALUE_EXP (rtl), 0))) { dw_loc_descr_ref ref - = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl), + = mem_loc_descriptor (ENTRY_VALUE_EXP (rtl), GET_MODE (rtl), VAR_INIT_STATUS_INITIALIZED); if (ref == NULL) return NULL; --- gcc/cfgexpand.c.jj 2010-10-12 19:26:47.925248505 +0200 +++ gcc/cfgexpand.c 2010-10-29 04:35:06.452404511 +0200 @@ -3105,7 +3105,31 @@ expand_debug_expr (tree exp) int part = var_to_partition (SA.map, exp); if (part == NO_PARTITION) - return NULL; + { + /* If this is a reference to a incoming value of parameter + that is never used in the code or where the incoming + value is never used in the code, use PARM_DECL's + DECL_RTL if set. */ + if (SSA_NAME_IS_DEFAULT_DEF (exp) + && TREE_CODE (SSA_NAME_VAR (exp)) == PARM_DECL) + { + rtx incoming = DECL_INCOMING_RTL (SSA_NAME_VAR (exp)); + if (incoming + && GET_MODE (incoming) != BLKmode + && (REG_P (incoming) + || (MEM_P (incoming) && REG_P (XEXP (incoming, 0))))) + { + op0 = gen_rtx_ENTRY_VALUE (GET_MODE (incoming)); + ENTRY_VALUE_EXP (op0) = incoming; + goto adjust_mode; + } + op0 = expand_debug_expr (SSA_NAME_VAR (exp)); + if (!op0) + return NULL; + goto adjust_mode; + } + return NULL; + } gcc_assert (part >= 0 && (unsigned)part < SA.map->num_partitions); --- gcc/testsuite/gcc.dg/guality/pr45882.c.jj 2010-10-29 04:35:06.453404765 +0200 +++ gcc/testsuite/gcc.dg/guality/pr45882.c 2010-10-29 04:35:06.453404765 +0200 @@ -0,0 +1,30 @@ +/* PR debug/45882 */ +/* { dg-do run } */ +/* { dg-options "-g" } */ + +extern void abort (void); +int a[1024]; +volatile short int v; + +__attribute__((noinline)) int +foo (int i, int j) +{ + int b = i; /* { dg-final { gdb-test 16 "b" "7" } } */ + int c = i + 4; /* { dg-final { gdb-test 16 "c" "11" } } */ + int d = a[i]; /* { dg-final { gdb-test 16 "d" "112" } } */ + int e = a[i + 6]; /* { dg-final { gdb-test 16 "e" "142" } } */ + ++v; + return ++j; +} + +int +main (void) +{ + int l; + asm ("" : "=r" (l) : "0" (7)); + a[7] = 112; + a[7 + 6] = 142; + if (foo (l, 7) != 8) + abort (); + return l - 7; +}