From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10836 invoked by alias); 17 Sep 2007 14:00:46 -0000 Received: (qmail 10797 invoked by uid 22791); 17 Sep 2007 14:00:37 -0000 X-Spam-Check-By: sourceware.org Received: from igw3.br.ibm.com (HELO igw3.br.ibm.com) (32.104.18.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 17 Sep 2007 14:00:30 +0000 Received: from mailhub1.br.ibm.com (unknown [9.18.232.109]) by igw3.br.ibm.com (Postfix) with ESMTP id 9B61C3900FA for ; Mon, 17 Sep 2007 10:54:24 -0300 (BRT) Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.18.232.47]) by mailhub1.br.ibm.com (8.13.8/8.13.8/NCO v8.5) with ESMTP id l8HE0QIo2650336 for ; Mon, 17 Sep 2007 11:00:27 -0300 Received: from d24av02.br.ibm.com (loopback [127.0.0.1]) by d24av02.br.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l8HE0QGO023590 for ; Mon, 17 Sep 2007 11:00:26 -0300 Received: from [9.18.238.24] ([9.18.238.24]) by d24av02.br.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id l8HE0ObC023531; Mon, 17 Sep 2007 11:00:26 -0300 Subject: Re: [patch] Backtrace prints wrong argument value From: Luis Machado Reply-To: luisgpm@linux.vnet.ibm.com To: Daniel Jacobowitz Cc: gdb-patches@sources.redhat.com In-Reply-To: <20070917133700.GA14300@caradoc.them.org> References: <1177527233.12599.42.camel@localhost> <20070425191304.GA1283@caradoc.them.org> <1179293640.4323.16.camel@localhost> <20070516144250.GD24682@caradoc.them.org> <1189694765.4564.5.camel@localhost> <20070916194510.GC27177@caradoc.them.org> <1190034278.4651.10.camel@localhost> <20070917131542.GA12835@caradoc.them.org> <1190035779.4651.16.camel@localhost> <20070917133700.GA14300@caradoc.them.org> Content-Type: multipart/mixed; boundary="=-dYXdBHhCFyZ1OoObj2L/" Date: Mon, 17 Sep 2007 14:00:00 -0000 Message-Id: <1190037624.4651.24.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.6.1 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-09/txt/msg00223.txt.bz2 --=-dYXdBHhCFyZ1OoObj2L/ Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 242 Hopefully the last chapter in the "broken by mailer" series. :-) Tabs had to expand to spaces in order to appear correctly in the body of the message. Regards, -- Luis Machado IBM Linux Technology Center e-mail: luisgpm@linux.vnet.ibm.com --=-dYXdBHhCFyZ1OoObj2L/ Content-Disposition: attachment; filename=call-clobbered-registers.diff Content-Type: text/x-patch; name=call-clobbered-registers.diff; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 3480 2007-09-17 Luis Machado * rs6000-tdep.c (ppc_dwarf2_frame_init_reg): New function. (rs6000_gdbarch_init): Install ppc_dwarf2_frame_init_reg as default dwarf2_frame_set_init_reg function. Index: gdb/rs6000-tdep.c =================================================================== --- gdb.orig/rs6000-tdep.c 2007-09-17 06:41:23.000000000 -0700 +++ gdb/rs6000-tdep.c 2007-09-17 06:55:57.000000000 -0700 @@ -3468,6 +3468,68 @@ return &rs6000_frame_base; } +/* DWARF-2 frame support. Used to handle the detection of + clobbered registers during function calls. */ + +static void +ppc_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum, + struct dwarf2_frame_state_reg *reg, + struct frame_info *next_frame) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + /* PPC32 and PPC64 ABI's are the same regarding volatile and + non-volatile registers. We will use the same code for both. */ + + /* Call-saved GP registers. */ + if ((regnum >= tdep->ppc_gp0_regnum + 14 + && regnum <= tdep->ppc_gp0_regnum + 31) + || (regnum == tdep->ppc_gp0_regnum + 1)) + reg->how = DWARF2_FRAME_REG_SAME_VALUE; + + /* Call-clobbered GP registers. */ + if ((regnum >= tdep->ppc_gp0_regnum + 3 + && regnum <= tdep->ppc_gp0_regnum + 12) + || (regnum == tdep->ppc_gp0_regnum)) + reg->how = DWARF2_FRAME_REG_UNDEFINED; + + /* Deal with FP registers, if supported. */ + if (tdep->ppc_fp0_regnum >= 0) + { + /* Call-saved FP registers. */ + if ((regnum >= tdep->ppc_fp0_regnum + 14 + && regnum <= tdep->ppc_fp0_regnum + 31)) + reg->how = DWARF2_FRAME_REG_SAME_VALUE; + + /* Call-clobbered FP registers. */ + if ((regnum >= tdep->ppc_fp0_regnum + && regnum <= tdep->ppc_fp0_regnum + 13)) + reg->how = DWARF2_FRAME_REG_UNDEFINED; + } + + /* Deal with ALTIVEC registers, if supported. */ + if (tdep->ppc_vr0_regnum > 0 && tdep->ppc_vrsave_regnum > 0) + { + /* Call-saved Altivec registers. */ + if ((regnum >= tdep->ppc_vr0_regnum + 20 + && regnum <= tdep->ppc_vr0_regnum + 31) + || regnum == tdep->ppc_vrsave_regnum) + reg->how = DWARF2_FRAME_REG_SAME_VALUE; + + /* Call-clobbered Altivec registers. */ + if ((regnum >= tdep->ppc_vr0_regnum + && regnum <= tdep->ppc_vr0_regnum + 19)) + reg->how = DWARF2_FRAME_REG_UNDEFINED; + } + + /* Handle PC register and Stack Pointer correctly. */ + if (regnum == gdbarch_pc_regnum (current_gdbarch)) + reg->how = DWARF2_FRAME_REG_RA; + else if (regnum == gdbarch_sp_regnum (current_gdbarch)) + reg->how = DWARF2_FRAME_REG_CFA; +} + + /* Initialize the current architecture based on INFO. If possible, re-use an architecture from ARCHES, which is a list of architectures already created during this debugging session. @@ -3774,6 +3836,9 @@ frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer); dwarf2_frame_set_adjust_regnum (gdbarch, rs6000_adjust_frame_regnum); + /* Frame handling. */ + dwarf2_frame_set_init_reg (gdbarch, ppc_dwarf2_frame_init_reg); + /* Hook in ABI-specific overrides, if they have been registered. */ gdbarch_init_osabi (info, gdbarch); @@ -3790,6 +3855,7 @@ tdep->ppc_vr0_regnum = 71; tdep->ppc_vrsave_regnum = 104; } + /* Fall Thru */ case GDB_OSABI_NETBSD_AOUT: case GDB_OSABI_NETBSD_ELF: --=-dYXdBHhCFyZ1OoObj2L/--