[gdb/exp] Interpret size of vla with unknown size as <optimized out>
authorTom de Vries <tdevries@suse.de>
Wed, 18 Jul 2018 11:38:35 +0000 (13:38 +0200)
committerTom de Vries <tdevries@suse.de>
Sat, 28 Jul 2018 08:16:30 +0000 (10:16 +0200)
At -O3 -g -gstrict-dwarf, gcc generates for an optimized out vla 'a' a
DW_TAG_variable with type DW_TAG_array_type containing one
DW_TAG_subrange_type, but without DW_AT_upper_bound or DW_AT_count, which
makes the upper bound value 'unknown':
...
.uleb128 0x15   # (DIE (0x161) DW_TAG_variable)
        .long   0xec    # DW_AT_abstract_origin
        .long   0x170   # DW_AT_type
...
        .uleb128 0xa    # (DIE (0x170) DW_TAG_array_type)
        .long   0x110   # DW_AT_type
        .long   0x17f   # DW_AT_sibling
        .uleb128 0x17   # (DIE (0x179) DW_TAG_subrange_type)
        .long   0xc6    # DW_AT_type
        .byte   0       # end of children of DIE 0x170
...

But gdb prints '0' for the size of 'a':
...
/gdb ./vla-1.exe -batch -ex "b f1" -ex "run" -ex "p sizeof(a)"
Breakpoint 1 at 0x4004c0: f1. (2 locations)

Breakpoint 1, f1 (i=<optimized out>) at vla-1.c:18
18      }
$1 = 0
...
while <optimized out> would be more appropriate.

This patch fixes that in evaluate_subexp_for_sizeof.

Build and reg-tested on x86_64-linux.

2018-07-28  Tom de Vries  <tdevries@suse.de>

* eval.c (evaluate_subexp_for_sizeof): Interpret size of dynamic type
with undefined upper bound as <optimized out>.

* gdb.base/vla-optimized-out-o3-strict.exp: New file.

gdb/ChangeLog
gdb/eval.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/vla-optimized-out-o3-strict.exp [new file with mode: 0644]

index bee8bffb6ef9705df69bd7030c62264a3d2da9ca..2c2763d03c1916be7aa8d849514e4db1500fbd72 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-28  Tom de Vries  <tdevries@suse.de>
+
+       * eval.c (evaluate_subexp_for_sizeof): Interpret size of dynamic type
+       with undefined upper bound as <optimized out>.
+
 2018-07-27  Sergio Durigan Junior  <sergiodj@redhat.com>
 
        * gcore.in: Rename variable "name" to "prefix".  Expand
index 9db6e7c69dad9e674f66991e2aee7dd8d66d80c7..0495a11bfd785f5279e9933db8b6060582a6b304 100644 (file)
@@ -3145,6 +3145,8 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos,
        {
          val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_NORMAL);
          type = value_type (val);
+         if (TYPE_HIGH_BOUND_UNDEFINED (TYPE_INDEX_TYPE (type)))
+           return allocate_optimized_out_value (size_type);
        }
       else
        (*pos) += 4;
index f51e255e31615df210284130ee283cf7175d6819..f3d212c3ddacafb9342b17231f0b55a81976d6a5 100644 (file)
@@ -1,3 +1,7 @@
+2018-07-28  Tom de Vries  <tdevries@suse.de>
+
+       * gdb.base/vla-optimized-out-o3-strict.exp: New file.
+
 2018-07-26  Tom de Vries  <tdevries@suse.de>
 
        * gdb.base/vla-optimized-out.c: Add comment about origin of test-case.
diff --git a/gdb/testsuite/gdb.base/vla-optimized-out-o3-strict.exp b/gdb/testsuite/gdb.base/vla-optimized-out-o3-strict.exp
new file mode 100644 (file)
index 0000000..81ada87
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright 2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Check whether we can determine the size of an optimized-out vla.
+
+standard_testfile
+
+if { [prepare_for_testing "failed to prepare" $testfile vla-optimized-out.c \
+         {debug optimize=-O3 additional_flags=-gstrict-dwarf}] } {
+    return -1
+}
+
+proc vla_optimized_out { } {
+    if ![runto f1] {
+       fail "can't run to f1"
+       return
+    }
+
+    gdb_test "p a" \
+       { = <optimized out>} \
+       "printed optimized out vla"
+
+    gdb_test "p sizeof (a)" \
+       { = <optimized out>} \
+       "printed optimized out size of optimized out vla"
+}
+
+vla_optimized_out