From a0c78a733a3def605ce73c42e1610f676c7ac910 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 16 Feb 2011 18:07:58 +0000 Subject: [PATCH] 2011-02-16 Tom Tromey gdb/ * ax-gdb.c.c (gen_expr) : Handle value kinds other than axs_rvalue. 2011-02-16 Pedro Alves gdb/testsuite/ * collection.c (globalarr3): New global. (main): Initialize it before collecting, and and clear it afterwards. * collection.exp (gdb_collect_globals_test): Test collecting with '{type} addr', where the addr expression is not an rvalue. --- gdb/ChangeLog | 5 +++++ gdb/ax-gdb.c | 15 +++++++-------- gdb/testsuite/ChangeLog | 8 ++++++++ gdb/testsuite/gdb.trace/collection.c | 6 ++++++ gdb/testsuite/gdb.trace/collection.exp | 11 ++++++++++- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b81c0ba..fe6fec7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-02-16 Tom Tromey + + * ax-gdb.c.c (gen_expr) : Handle value kinds other + than axs_rvalue. + 2011-02-16 Yao Qi * infrun.c (get_displaced_step_closure_by_addr): New. diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 2908431..d1736e1 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -2044,14 +2044,13 @@ gen_expr (struct expression *exp, union exp_element **pc, (*pc) += 3; gen_expr (exp, pc, ax, value); - /* I'm not sure I understand UNOP_MEMVAL entirely. I think - it's just a hack for dealing with minsyms; you take some - integer constant, pretend it's the address of an lvalue of - the given type, and dereference it. */ - if (value->kind != axs_rvalue) - /* This would be weird. */ - internal_error (__FILE__, __LINE__, - _("gen_expr: OP_MEMVAL operand isn't an rvalue???")); + + /* If we have an axs_rvalue or an axs_lvalue_memory, then we + already have the right value on the stack. For + axs_lvalue_register, we must convert. */ + if (value->kind == axs_lvalue_register) + require_rvalue (ax, value); + value->type = type; value->kind = axs_lvalue_memory; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f27dd22..5af639d 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-02-16 Pedro Alves + + * collection.c (globalarr3): New global. + (main): Initialize it before collecting, and and clear it + afterwards. + * collection.exp (gdb_collect_globals_test): Test collecting with + '{type} addr', where the addr expression is not an rvalue. + 2011-02-16 Ken Werner * gdb.opencl/datatypes.exp: Allow "false" when printing the content of diff --git a/gdb/testsuite/gdb.trace/collection.c b/gdb/testsuite/gdb.trace/collection.c index 422b737..6c66637 100644 --- a/gdb/testsuite/gdb.trace/collection.c +++ b/gdb/testsuite/gdb.trace/collection.c @@ -27,6 +27,7 @@ test_struct globalstruct; test_struct *globalp; int globalarr[16]; int globalarr2[4]; +int globalarr3[4]; struct global_pieces { unsigned int a; @@ -241,6 +242,9 @@ main (argc, argv, envp) for (i = 0; i < 4; i++) globalarr2[i] = i; + for (i = 0; i < 4; i++) + globalarr3[3 - i] = i; + mystruct.memberc = 101; mystruct.memberi = 102; mystruct.memberf = 103.3; @@ -289,6 +293,8 @@ main (argc, argv, envp) globalarr[i] = 0; for (i = 0; i < 4; i++) globalarr2[i] = 0; + for (i = 0; i < 4; i++) + globalarr3[i] = 0; end (); return 0; diff --git a/gdb/testsuite/gdb.trace/collection.exp b/gdb/testsuite/gdb.trace/collection.exp index c966f2f..c6f7fd1 100644 --- a/gdb/testsuite/gdb.trace/collection.exp +++ b/gdb/testsuite/gdb.trace/collection.exp @@ -479,7 +479,8 @@ proc gdb_collect_globals_test { } { "collect globalc, globali, globalf, globald" "^$" \ "collect globalstruct, globalp, globalarr" "^$" \ "collect \{int \[4\]\}$globalarr2_addr" "^$" \ - "collect \{int \[2\]\}$globalarr2_addr" "^$" + "collect \{int \[2\]\}$globalarr2_addr" "^$" \ + "collect \{int \[4\]\}globalarr3" "^$" # Begin the test. run_trace_experiment "globals" globals_test_func @@ -530,6 +531,14 @@ proc gdb_collect_globals_test { } { "\\$\[0-9\]+ = \\{0, 1, 2, 3\\}$cr" \ "collect globals: collected global array 2" + # GDB would internal error collecting UNOP_MEMVAL's whose address + # expression wasn't an rvalue (that's regtested in the + # corresponding 'collect' action above). This just double checks + # we actually did collect what we wanted. + gdb_test "print globalarr3" \ + "\\$\[0-9\]+ = \\{3, 2, 1, 0\\}$cr" \ + "collect globals: collected global array 3" + gdb_test "tfind none" \ "#0 end .*" \ "collect globals: cease trace debugging" -- 2.7.4