aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-valprint.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2010-04-20 22:26:57 +0000
committerJoel Brobecker <brobecker@gnat.com>2010-04-20 22:26:57 +0000
commit0c3acc092379d8b0c9d74a47c9cc03375dbad5fc (patch)
tree9e2defc0cfb6cf3c456579c6659ed110fda94792 /gdb/ada-valprint.c
parent418205099be3d614ad92c8c78486b1a60b498916 (diff)
downloadgdb-0c3acc092379d8b0c9d74a47c9cc03375dbad5fc.zip
gdb-0c3acc092379d8b0c9d74a47c9cc03375dbad5fc.tar.gz
gdb-0c3acc092379d8b0c9d74a47c9cc03375dbad5fc.tar.bz2
Wrong value printed by info locals for dynamic object.
The problem is printing the wrong value for dynamic local variables when using the "info locals" command. Consider the following code: procedure Print (I1 : Positive; I2 : Positive) is type My_String is array (I1 .. I2) of Character; I : My_String := (others => 'A'); S : String (1 .. I2 + 3) := (others => ' '); begin S (I1 .. I2) := String (I); -- BREAK Put_Line (S); end Print; After the debugger stopped at BREAK, we try printing all local variables. Here is what we get: (gdb) info locals i = "["00"]["00"]" s = "["00"]["00"]["00"]["00"]["00"]["00"]["00"]["00"]" Curiously, printing their value using the "print" command works: (gdb) print i $1 = "AA" (gdb) print s $2 = " " We traced the problem to trying to get the contents of a variable (call to value_contents) before "fix'ing" it. For those not familiar with the Ada language support, "fixing" a value consists of swapping the value's dynamic type with a static version that is appropriate for our actual value. As a result, the dynamic type was used to determine the value size, which is zero, and thus the value contents was empty. gdb/ChangeLog: * valprint.c (common_val_print): Fix the value before extracting its contents. * ada-lang.c (ada_to_fixed_value): Make this function extern. * ada-lang.h (ada_to_fixed_value): New function declaration. * ada-valprint.c (ada_value_print): Use ada_to_fixed_value to avoid code duplication and fix a bug in the handling of fixed types contents. gdb/testsuite/ChangeLog: * gdb.ada/dyn_loc: New testcase.
Diffstat (limited to 'gdb/ada-valprint.c')
-rw-r--r--gdb/ada-valprint.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c
index 5590100..a1090dc 100644
--- a/gdb/ada-valprint.c
+++ b/gdb/ada-valprint.c
@@ -924,12 +924,9 @@ int
ada_value_print (struct value *val0, struct ui_file *stream,
const struct value_print_options *options)
{
- const gdb_byte *valaddr = value_contents (val0);
- CORE_ADDR address = value_address (val0);
- struct type *type =
- ada_to_fixed_type (value_type (val0), valaddr, address, NULL, 1);
- struct value *val =
- value_from_contents_and_address (type, valaddr, address);
+ struct value *val = ada_to_fixed_value (val0);
+ CORE_ADDR address = value_address (val);
+ struct type *type = value_type (val);
struct value_print_options opts;
/* If it is a pointer, indicate what it points to. */