From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1896 invoked by alias); 19 Jan 2013 15:54:57 -0000 Received: (qmail 1872 invoked by uid 22791); 19 Jan 2013 15:54:53 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_NO X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 19 Jan 2013 15:54:47 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id D00FF2E35F; Sat, 19 Jan 2013 10:54:46 -0500 (EST) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id kO284bkiAUpw; Sat, 19 Jan 2013 10:54:46 -0500 (EST) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 5D6242E0BE; Sat, 19 Jan 2013 10:54:46 -0500 (EST) Received: by joel.gnat.com (Postfix, from userid 1000) id 45D69CC137; Sat, 19 Jan 2013 19:54:35 +0400 (RET) Date: Sat, 19 Jan 2013 15:54:00 -0000 From: Joel Brobecker To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: Re: RFC: fix PR c++/14999 Message-ID: <20130119155435.GA5215@adacore.com> References: <87mwwj38hm.fsf@fleche.redhat.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="OXfL5xGRrasGEqWY" Content-Disposition: inline In-Reply-To: <87mwwj38hm.fsf@fleche.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 2013-01/txt/msg00466.txt.bz2 --OXfL5xGRrasGEqWY Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1936 Hi Tom, > The problem here is that setting a tracepoint and collecting a certain > local variable will cause a crash, if the source code was compiled with > clang. > > The bug is just a missing call to require_rvalue when handling > DW_OP_fbreg in the DWARF->AX translator. [...] > PR c++/14999: > * dwarf2loc.c (dwarf2_compile_expr_to_ax) : > Call require_rvalue. > > * gdb.dwarf2/trace-crash.s: New file. > * gdb.dwarf2/trace-crash.exp: New file. Unfortunately, this patch causes a number of regressions which do appear with the testsuite if you run it with gdbserver. At the heart of the regression is the fact that the dwarf-to-ax compiler, for a variable whose location looks like this: (gdb) info address i Symbol "i" is a variable at frame base reg $rbp offset 16+-44. will now generate: (gdb) maintenance agent-eval i Scope: 0x404953 Reg mask: 40 0 reg 6 3 const8 16 5 add 6 ref32 <<<<<----- Unwanted dereference 7 ext 32 <<<<<----- 9 const8 212 11 ext 8 13 add 14 ref32 15 ext 32 17 end This affects conditional breakpoints when running with a gdbserver, because gdbserver now evaluates incorrectly the condition on the gdbserver side. I looked at the PR, and it seems to me that the problem comes from the fact that the ax stack was missing the "reg 7" operation. I don't really understand the code well enough to be sure about my fix, in particular what the "loc" parameter is about, but the attached patch seems to restore the origin behavior while still keeping your new testcase happy. gdb/ChangeLog: PR c++/14999: * dwarf2_compile_expr_to_ax (dwarf2_compile_expr_to_ax): Add a call to ax_reg for DW_OP_reg* opcodes. : Remove call to require_rvalue. Tested on x86_64-linux with gdbserver, fixes about 125 failures. -- Joel --OXfL5xGRrasGEqWY Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-Rework-GDB-PR-c-14999.patch" Content-length: 1611 >From 6ec232c4c61e5840042109ac119b8f284ff3f7b4 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Sat, 19 Jan 2013 19:13:14 +0400 Subject: [PATCH] Rework GDB PR c++/14999 gdb/ChangeLog: PR c++/14999: * dwarf2_compile_expr_to_ax (dwarf2_compile_expr_to_ax): Add a call to ax_reg for DW_OP_reg* opcodes. : Remove call to require_rvalue. --- gdb/dwarf2loc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 2282feb..b540ef5 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -2765,6 +2765,7 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc, dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx"); loc->u.reg = translate_register (arch, op - DW_OP_reg0); loc->kind = axs_lvalue_register; + ax_reg (expr, loc->u.reg); break; case DW_OP_regx: @@ -2772,6 +2773,7 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc, dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx"); loc->u.reg = translate_register (arch, reg); loc->kind = axs_lvalue_register; + ax_reg (expr, loc->u.reg); break; case DW_OP_implicit_value: @@ -2878,7 +2880,6 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc, op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset); dwarf2_compile_expr_to_ax (expr, loc, arch, addr_size, datastart, datastart + datalen, per_cu); - require_rvalue (expr, loc); if (offset != 0) { -- 1.7.10.4 --OXfL5xGRrasGEqWY--