From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13265 invoked by alias); 26 Apr 2010 15:28:11 -0000 Received: (qmail 13250 invoked by uid 22791); 26 Apr 2010 15:28:08 -0000 X-SWARE-Spam-Status: No, hits=-0.4 required=5.0 tests=BAYES_00,KAM_STOCKGEN,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cam-admin0.cambridge.arm.com (HELO cam-admin0.cambridge.arm.com) (217.140.96.50) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 26 Apr 2010 15:27:58 +0000 Received: from cam-owa2.Emea.Arm.com (cam-owa2.emea.arm.com [10.1.105.18]) by cam-admin0.cambridge.arm.com (8.12.6/8.12.6) with ESMTP id o3QFRteI006578 for ; Mon, 26 Apr 2010 16:27:55 +0100 (BST) Received: from [10.1.79.63] ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 26 Apr 2010 16:27:55 +0100 Subject: [PATCH] Gracefully handle not being able to access a DWARF register number From: Matthew Gretton-Dann To: gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary="=-tjJMca6LDPsnr2LENvo0" Date: Mon, 26 Apr 2010 15:28:00 -0000 Message-Id: <1272295674.16160.23.camel@e102111-lin.cambridge.arm.com> Mime-Version: 1.0 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: 2010-04/txt/msg00876.txt.bz2 --=-tjJMca6LDPsnr2LENvo0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1119 Hi, There are cases when gcc outputs a valid DWARF register number in a DWARF expression, but gdb can't access that register. In theory this is a generic problem, but the specific case I'm interested in is debugging ARM VFP code on Linux with a kernel prior to 2.6.30. In this case ptrace does not expose the contents of a processes' VFP registers although gcc accurately describes the location of floating point values as being in the VFP registers. If you try to access such a DWARF register number gdb reports an internal error. The attached patch changes these internal errors into warnings, and tries to return something sensible to the user. Please could someone review and comment on the patch, and then if this is approved can they please commit it as I don't have commit rights. Suggested ChangeLog: 2010-04-26 Matthew Gretton-Dann * dwarf2loc.c (read_pieced_value, write_pieced_value, dwarf2_evaluate_loc_desc): Handle not being able to access DWARF registers gracefully. Thanks, Matt -- Matthew Gretton-Dann Principal Engineer - Tools, PD Software ARM Limited --=-tjJMca6LDPsnr2LENvo0 Content-Disposition: attachment; filename=1004-gdb-dwarf2loc.patch Content-Type: text/x-patch; name=1004-gdb-dwarf2loc.patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-length: 2259 Index: gdb/dwarf2loc.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2loc.c,v retrieving revision 1.75 diff -u -p -r1.75 dwarf2loc.c --- gdb/dwarf2loc.c 20 Apr 2010 18:52:59 -0000 1.75 +++ gdb/dwarf2loc.c 26 Apr 2010 14:51:25 -0000 @@ -284,8 +284,17 @@ read_pieced_value (struct value *v) /* Big-endian, and we want less than full size. */ reg_offset = register_size (arch, gdb_regnum) - p->size; - get_frame_register_bytes (frame, gdb_regnum, reg_offset, p->size, - contents + offset); + if (gdb_regnum != -1) + { + get_frame_register_bytes (frame, gdb_regnum, reg_offset, + p->size, contents + offset); + } + else + { + warning (_("Unable to access DWARF register number %" BFD_VMA_FMT "d"), + p->v.expr.value); + memset (contents + offset, '\0', p->size); + } } break; @@ -356,8 +365,16 @@ write_pieced_value (struct value *to, st /* Big-endian, and we want less than full size. */ reg_offset = register_size (arch, gdb_regnum) - p->size; - put_frame_register_bytes (frame, gdb_regnum, reg_offset, p->size, - contents + offset); + if (gdb_regnum != -1) + { + put_frame_register_bytes (frame, gdb_regnum, reg_offset, + p->size, contents + offset); + } + else + { + warning (_("Unable to write to DWARF Register %" BFD_VMA_FMT "d"), + p->v.expr.value); + } } break; case DWARF_VALUE_MEMORY: @@ -454,7 +471,20 @@ dwarf2_evaluate_loc_desc (struct symbol struct gdbarch *arch = get_frame_arch (frame); CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0); int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum); - retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame); + if (gdb_regnum != -1) + { + retval = value_from_register (SYMBOL_TYPE (var), + gdb_regnum, frame); + } + else + { + warning (_("Unable to access DWARF register number %" BFD_VMA_FMT "d"), + dwarf_regnum); + retval = allocate_value (SYMBOL_TYPE (var)); + VALUE_LVAL (retval) = not_lval; + set_value_optimized_out (retval, 1); + return retval; + } } break; --=-tjJMca6LDPsnr2LENvo0--