This is the mail archive of the
gdb-cvs@sourceware.org
mailing list for the GDB project.
[binutils-gdb] fort_dyn_array: Support evaluation of dynamic elements inside arrays.
- From: Bernhard Heckel <bernhardheckel at sourceware dot org>
- To: gdb-cvs at sourceware dot org
- Date: 26 Apr 2016 14:39:28 -0000
- Subject: [binutils-gdb] fort_dyn_array: Support evaluation of dynamic elements inside arrays.
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8f07e298b16e6419a11f9e9d75b15658e42ea775
commit 8f07e298b16e6419a11f9e9d75b15658e42ea775
Author: Bernhard Heckel <bernhard.heckel@intel.com>
Date: Tue Apr 26 16:38:19 2016 +0200
fort_dyn_array: Support evaluation of dynamic elements inside arrays.
Resolve type of an array's element to be printed in case it is dynamic.
Otherwise we don't use the correct boundaries nor the right location.
Before:
ptype fivearr(1)
type = Type five
Type one
integer(kind=4) :: ivla(34196784:34196832,34197072:34197120,34197360:34197408)
End Type one :: tone
End Type five
After:
ptype fivearr(1)
type = Type five
Type one
integer(kind=4) :: ivla(2,4,6)
End Type one :: tone
End Type five
2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
gdb/Changelog:
* valarith.c (value_address): Resolve dynamic types.
gdb/testsuite/Changelog:
* gdb.fortran/vla-type.f90: Add test for static and dynamic arrays
of dynamic types.
* gdb.fortran/vla-type.exp: Add test for static and dynamic arrays
of dynamic types.
Diff:
---
gdb/ChangeLog | 4 +++
gdb/testsuite/ChangeLog | 7 +++++
gdb/testsuite/gdb.fortran/vla-type.exp | 52 ++++++++++++++++++++++++++++++++++
gdb/testsuite/gdb.fortran/vla-type.f90 | 20 +++++++++++--
gdb/valarith.c | 8 ++++++
5 files changed, 89 insertions(+), 2 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index be192e7..e512251 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,4 +1,8 @@
2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
+
+ * valarith.c (value_address): Resolve dynamic types.
+
+2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
Keven Boell <kevel.boell@intel.com>
* NEWS: Add new supported features for fortran.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index bb52582..7a8f922 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
+ * gdb.fortran/vla-type.f90: Add test for static and dynamic arrays
+ of dynamic types.
+ * gdb.fortran/vla-type.exp: Add test for static and dynamic arrays
+ of dynamic types.
+
+2016-04-26 Bernhard Heckel <bernhard.heckel@intel.com>
+
* gdb.fortran/vla-type.f90: New file.
* gdb.fortran/vla-type.exp: New file.
diff --git a/gdb/testsuite/gdb.fortran/vla-type.exp b/gdb/testsuite/gdb.fortran/vla-type.exp
index 24191fe..011e27e 100755
--- a/gdb/testsuite/gdb.fortran/vla-type.exp
+++ b/gdb/testsuite/gdb.fortran/vla-type.exp
@@ -100,3 +100,55 @@ gdb_test "ptype fivev" \
"\\s+$int :: ivla\\\(10,10,10\\\)" \
"\\s+End Type one :: tone" \
"End Type five" ]
+
+# Check array of types containing a VLA
+gdb_breakpoint [gdb_get_line_number "fivearr-filled"]
+gdb_continue_to_breakpoint "fivearr-filled"
+gdb_test "print fivearr(1)%tone%ivla(1, 2, 3)" " = 1"
+gdb_test "print fivearr(1)%tone%ivla(2, 2, 10)" "no such vector element"
+gdb_test "print fivearr(1)%tone%ivla(2, 2, 3)" " = 223"
+gdb_test "print fivearr(2)%tone%ivla(12, 14, 16)" " = 2"
+gdb_test "print fivearr(2)%tone%ivla(6, 7, 8)" " = 678"
+gdb_test "ptype fivearr(1)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(2,4,6\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+gdb_test "ptype fivearr(2)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(12,14,16\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+
+# Check allocation status of dynamic array and it's dynamic members
+gdb_test "ptype fivedynarr" "type = <not allocated>"
+gdb_test "next" ""
+gdb_test "ptype fivedynarr(2)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(<not allocated>\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+
+# Check dynamic array of types containing a VLA
+gdb_breakpoint [gdb_get_line_number "fivedynarr-filled"]
+gdb_continue_to_breakpoint "fivedynarr-filled"
+gdb_test "print fivedynarr(1)%tone%ivla(1, 2, 3)" " = 1"
+gdb_test "print fivedynarr(1)%tone%ivla(2, 2, 10)" "no such vector element"
+gdb_test "print fivedynarr(1)%tone%ivla(2, 2, 3)" " = 223"
+gdb_test "print fivedynarr(2)%tone%ivla(12, 14, 16)" " = 2"
+gdb_test "print fivedynarr(2)%tone%ivla(6, 7, 8)" " = 678"
+gdb_test "ptype fivedynarr(1)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(2,4,6\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
+gdb_test "ptype fivedynarr(2)" \
+ [multi_line "type = Type five" \
+ "\\s+Type one" \
+ "\\s+$int :: ivla\\\(12,14,16\\\)" \
+ "\\s+End Type one :: tone" \
+ "End Type five" ]
diff --git a/gdb/testsuite/gdb.fortran/vla-type.f90 b/gdb/testsuite/gdb.fortran/vla-type.f90
index a106617..5473124 100755
--- a/gdb/testsuite/gdb.fortran/vla-type.f90
+++ b/gdb/testsuite/gdb.fortran/vla-type.f90
@@ -38,6 +38,8 @@ program vla_struct
type(three) :: threev
type(four) :: fourv
type(five) :: fivev
+ type(five) :: fivearr (2)
+ type(five), allocatable :: fivedynarr (:)
logical :: l
integer :: i, j
@@ -83,6 +85,20 @@ program vla_struct
fivev%tone%ivla(1, 2, 3) = 123
fivev%tone%ivla(3, 2, 1) = 321
- ! dummy statement for bp
- l = allocated(fivev%tone%ivla) ! fivev-filled
+ allocate (fivearr(1)%tone%ivla (2, 4, 6)) ! fivev-filled
+ allocate (fivearr(2)%tone%ivla (12, 14, 16))
+ fivearr(1)%tone%ivla(:, :, :) = 1
+ fivearr(1)%tone%ivla(2, 2, 3) = 223
+ fivearr(2)%tone%ivla(:, :, :) = 2
+ fivearr(2)%tone%ivla(6, 7, 8) = 678
+
+ allocate (fivedynarr(2)) ! fivearr-filled
+ allocate (fivedynarr(1)%tone%ivla (2, 4, 6))
+ allocate (fivedynarr(2)%tone%ivla (12, 14, 16))
+ fivedynarr(1)%tone%ivla(:, :, :) = 1
+ fivedynarr(1)%tone%ivla(2, 2, 3) = 223
+ fivedynarr(2)%tone%ivla(:, :, :) = 2
+ fivedynarr(2)%tone%ivla(6, 7, 8) = 678
+
+ l = allocated(fivedynarr) ! fivedynarr-filled
end program vla_struct
diff --git a/gdb/valarith.c b/gdb/valarith.c
index 7959f3b..254d998 100644
--- a/gdb/valarith.c
+++ b/gdb/valarith.c
@@ -207,6 +207,14 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound)
error (_("no such vector element"));
}
+ if (is_dynamic_type (elt_type))
+ {
+ CORE_ADDR address;
+
+ address = value_address (array) + elt_offs;
+ elt_type = resolve_dynamic_type (elt_type, NULL, address);
+ }
+
if (VALUE_LVAL (array) == lval_memory && value_lazy (array))
v = allocate_value_lazy (elt_type);
else