From patchwork Fri Feb 8 16:54:19 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Law X-Patchwork-Id: 219222 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 5EB6C2C007E for ; Sat, 9 Feb 2013 03:54:32 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1360947273; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=LZXOV7K 9H/PetA4lsFKHSUBUy8g=; b=Hou/vPNGAWGVSQ+BYMxAKTN2YIVVDX0FNDOA6Xs pQlVDmxe1khiIFmN8TZbgFa0piFjykvPWa/tZGyX5kM0aiDXRBRy1cHjeUC2UK0w fWxEJspASVlAoPQ4SF6PF5myriX+0K4g0q3Ce8ZbwVrTYs51eZ8ZAReLfEQRhWGz 2MPM= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=JH0r6Svkvh48oESystZxuJE5ScrpLjbj2kLRvC19oXmxFCJbM5LrsprCtKV/0N gT3Jg29CtJJaJbi372EDTRoa9d32xw/a6hcsYII6pxmIvno/ceYwOTTIB7fWR7b8 PBmRxZQ5TYKoV9o2tirUXcbUadmbC5qmgVQuJYdYAgTJI=; Received: (qmail 27757 invoked by alias); 8 Feb 2013 16:54:29 -0000 Received: (qmail 27740 invoked by uid 22791); 8 Feb 2013 16:54:28 -0000 X-SWARE-Spam-Status: No, hits=-6.6 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_SPAMHAUS_DROP, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS 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; Fri, 08 Feb 2013 16:54:20 +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.14.4/8.14.4) with ESMTP id r18GsKIR010625 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 8 Feb 2013 11:54:20 -0500 Received: from stumpy.slc.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r18GsKaH010746 for ; Fri, 8 Feb 2013 11:54:20 -0500 Message-ID: <51152DBB.2090007@redhat.com> Date: Fri, 08 Feb 2013 09:54:19 -0700 From: Jeff Law User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: gcc-patches Subject: [PATCH] Improve debugging info (PR debug/53948 P1 regression) 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 The basic problem here is parameters are marked with REG_USERVAR_P and IRA creates conflicts for the parameters with the callee clobbered registers. This results in the copy from the parameter registers into callee clobbered registers being removed. The move instructions happen to be associated with the first line of code in the function. So when a breakpoint is placed on the function, the breakpoint triggers a statement later than expected. This patch restores IRA's behaviour WRT regs associated with PARM_DECLs that was inadvertently removed by Steven when he changed this code back in July to eliminate the inclusion of tree.h in ira-conflicts.c. We could have used a bit in the base rtl structure to represent PARMs independently from user variables, but given we don't have any real separation of rtl from trees and the scarcity of flag bits in that structure, I just created a trivial function that lives in emit-rtl.c which has access to both tree and rtl headers. Steven has a patch which takes the other approach (using a flag bit in the base rtl structure) if folks would prefer that approach. Bootstrapped and regression tested x86_64-linux-gnu. OK for trunk? PR debug/53948 * emit-rtl.c (reg_is_parm_p): New function. * regs.h (reg_is_parm_p): New prototype. * ira-conflicts.c (ira_build_conflicts): Allow parameters in callee-clobbered registers. * gcc.dg/debug/dwarf2/pr53948.c: New test. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index f997e5d..2c70fb1 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -919,6 +919,18 @@ gen_reg_rtx (enum machine_mode mode) return val; } +/* Return TRUE if REG is a PARM_DECL, FALSE otherwise. */ + +bool +reg_is_parm_p (rtx reg) +{ + tree decl; + + gcc_assert (REG_P (reg)); + decl = REG_EXPR (reg); + return (decl && TREE_CODE (decl) == PARM_DECL); +} + /* Update NEW with the same attributes as REG, but with OFFSET added to the REG_OFFSET. */ diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c index 711db0f..710986b 100644 --- a/gcc/ira-conflicts.c +++ b/gcc/ira-conflicts.c @@ -895,8 +895,12 @@ ira_build_conflicts (void) if ((! flag_caller_saves && ALLOCNO_CALLS_CROSSED_NUM (a) != 0) /* For debugging purposes don't put user defined variables in - callee-clobbered registers. */ - || (optimize == 0 && REG_USERVAR_P (allocno_reg))) + callee-clobbered registers. However, do allow parameters + in callee-clobbered registers to improve debugging. This + is a bit of a fragile hack. */ + || (optimize == 0 + && REG_USERVAR_P (allocno_reg) + && ! reg_is_parm_p (allocno_reg))) { IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), call_used_reg_set); diff --git a/gcc/regs.h b/gcc/regs.h index 0532d08..090d6b6 100644 --- a/gcc/regs.h +++ b/gcc/regs.h @@ -89,6 +89,8 @@ REG_N_SETS (int regno) #define SET_REG_N_SETS(N,V) (regstat_n_sets_and_refs[N].sets = V) #define INC_REG_N_SETS(N,V) (regstat_n_sets_and_refs[N].sets += V) +/* Given a REG, return TRUE if the reg is a PARM_DECL, FALSE otherwise. */ +extern bool reg_is_parm_p (rtx); /* Functions defined in regstat.c. */ extern void regstat_init_n_sets_and_refs (void); diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c new file mode 100644 index 0000000..8bc8ed4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c @@ -0,0 +1,10 @@ +/* Test that we emit a .line directive for the line + with local variable initializations. */ +/* { dg-options "-O0 -g" } */ +/* { dg-final { scan-assembler ".loc 1 8 0" } } */ + + +int f (register int a, register int b) { + register int x = b, y = a; + return x + y; } +