Avoid crash in Ada value printing with optimized-out array
authorTom Tromey <tromey@adacore.com>
Thu, 15 Apr 2021 16:14:11 +0000 (10:14 -0600)
committerTom Tromey <tromey@adacore.com>
Thu, 15 Apr 2021 16:14:11 +0000 (10:14 -0600)
The Ada value-printing code could crash when printing an array which
had been optimized out.

The crash is difficult to reproduce, but I did manage to write a test
that at least shows that the previous behavior was incorrect -- before
the patch, the array is printed as if it is valid and every value is 0.

gdb/ChangeLog
2021-04-15  Tom Tromey  <tromey@adacore.com>

* ada-valprint.c (ada_value_print_array): Handle optimized-out
arrays.

gdb/testsuite/ChangeLog
2021-04-15  Tom Tromey  <tromey@adacore.com>

* gdb.dwarf2/arr-stride.exp: Add test.

gdb/ChangeLog
gdb/ada-valprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/arr-stride.exp

index 54a035c51bbf92095fe896d6ca6b3390c081606a..5b2f6c9d7c951921437adc0fc56e394e3225a9fa 100644 (file)
@@ -1,3 +1,8 @@
+2021-04-15  Tom Tromey  <tromey@adacore.com>
+
+       * ada-valprint.c (ada_value_print_array): Handle optimized-out
+       arrays.
+
 2021-04-15  Tom Tromey  <tromey@adacore.com>
 
        * printcmd.c (print_variable_and_value): Use
index 0d5b6d73076b154131c59428857a73b34ed29b1d..61c903bbed544bc951875118da59891d5e3e156c 100644 (file)
@@ -897,7 +897,10 @@ ada_value_print_array (struct value *val, struct ui_file *stream, int recurse,
 
   fprintf_filtered (stream, "(");
   print_optional_low_bound (stream, type, options);
-  if (TYPE_FIELD_BITSIZE (type, 0) > 0)
+
+  if (value_entirely_optimized_out (val))
+    val_print_optimized_out (val, stream);
+  else if (TYPE_FIELD_BITSIZE (type, 0) > 0)
     {
       const gdb_byte *valaddr = value_contents_for_printing (val);
       int offset_aligned = ada_aligned_value_addr (type, valaddr) - valaddr;
index f58d771f3ec2bd2424da69bd57e0c4625e3db781..d1b6f5c650fb39d88eace7ff5ddfcedd5edb2ccc 100644 (file)
@@ -1,3 +1,7 @@
+2021-04-15  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.dwarf2/arr-stride.exp: Add test.
+
 2021-04-15  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gdb.base/startup-file.exp: Add more tests.
index bf30f10c5c85d051008832569fc5ebf0e32bb7b5..f25518f4558211db7c1ace2a7743647464d39f84 100644 (file)
@@ -31,7 +31,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_comp_dir /tmp}
         } {
            declare_labels integer_label array_elt_label array_label \
-                big_array_label
+                big_array_label struct_label
 
             integer_label: DW_TAG_base_type {
                 {DW_AT_byte_size 4 DW_FORM_sdata}
@@ -79,6 +79,34 @@ Dwarf::assemble $asm_file {
                    {DW_AT_upper_bound 4 DW_FORM_data1}
                }
            }
+
+           struct_label: DW_TAG_structure_type {
+               {name struct_type}
+               {byte_size 16 DW_FORM_sdata}
+           } {
+               member {
+                   {name intfield}
+                   {type :$integer_label}
+                   {data_member_location 0 DW_FORM_sdata}
+               }
+               member {
+                   {name arrayfield}
+                   {type :$array_label}
+                   {data_member_location 4 DW_FORM_sdata}
+               }
+           }
+
+           DW_TAG_variable {
+               {name the_struct}
+               {external 1 DW_FORM_flag}
+               {location {
+                   DW_OP_const1u 1
+                   DW_OP_stack_value
+                   DW_OP_piece 4
+                   DW_OP_piece 12
+               } SPECIAL_expr}
+               {type :$struct_label}
+           }
        }
     }
 }
@@ -95,3 +123,6 @@ gdb_test "ptype pck.table" \
 
 gdb_test "ptype pck.big_table" \
          "type = array \\(0 \\.\\. 4\\) of pck\\.item <packed: 8-bit elements>"
+
+gdb_test "print the_struct" \
+    "\\(intfield => 1, arrayfield => \\(0 => <optimized out>\\)\\)"