This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFC: fix PR c++/14999


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) <DW_OP_fbreg>:
>     	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.
        <DW_OP_fbreg>: Remove call to require_rvalue.

Tested on x86_64-linux with gdbserver, fixes about 125 failures.

-- 
Joel
>From 6ec232c4c61e5840042109ac119b8f284ff3f7b4 Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
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.
        <DW_OP_fbreg>: 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]