diff options
author | Pedro Alves <palves@redhat.com> | 2011-02-16 18:07:58 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2011-02-16 18:07:58 +0000 |
commit | a0c78a733a3def605ce73c42e1610f676c7ac910 (patch) | |
tree | adc6f0f089338ff6650098112cb91082b1a17f69 | |
parent | 5ff2bd081f67d55a8a93f3945a8112336bae6d3c (diff) | |
download | fsf-binutils-gdb-a0c78a733a3def605ce73c42e1610f676c7ac910.zip fsf-binutils-gdb-a0c78a733a3def605ce73c42e1610f676c7ac910.tar.gz fsf-binutils-gdb-a0c78a733a3def605ce73c42e1610f676c7ac910.tar.bz2 |
2011-02-16 Tom Tromey <tromey@redhat.com>
gdb/
* ax-gdb.c.c (gen_expr) <UNOP_MEMVAL>: Handle value kinds other
than axs_rvalue.
2011-02-16 Pedro Alves <pedro@codesourcery.com>
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.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/ax-gdb.c | 15 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.trace/collection.c | 6 | ||||
-rw-r--r-- | 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 <tromey@redhat.com> + + * ax-gdb.c.c (gen_expr) <UNOP_MEMVAL>: Handle value kinds other + than axs_rvalue. + 2011-02-16 Yao Qi <yao@qiyaows> * 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 <pedro@codesourcery.com> + + * 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 <ken.werner@de.ibm.com> * 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" |