From: Bernhard Heckel Date: Tue, 26 Apr 2016 14:38:19 +0000 (+0200) Subject: fort_dyn_array: Support evaluation of dynamic elements inside arrays. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8f07e298b16e6419a11f9e9d75b15658e42ea775;p=binutils-gdb.git 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 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 --git a/gdb/ChangeLog b/gdb/ChangeLog index be192e798a7..e512251d494 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2016-04-26 Bernhard Heckel + + * valarith.c (value_address): Resolve dynamic types. + 2016-04-26 Bernhard Heckel Keven Boell diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bb5258283c7..7a8f9223c88 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-04-26 Bernhard Heckel + + * 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 * gdb.fortran/vla-type.f90: New file. diff --git a/gdb/testsuite/gdb.fortran/vla-type.exp b/gdb/testsuite/gdb.fortran/vla-type.exp index 24191fe0829..011e27ea152 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 = " +gdb_test "next" "" +gdb_test "ptype fivedynarr(2)" \ + [multi_line "type = Type five" \ + "\\s+Type one" \ + "\\s+$int :: ivla\\\(\\\)" \ + "\\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 a1066177e30..547312424e1 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 7959f3b2215..254d99838a9 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