From 0d4e84ed37c404eb7e691ee9d68ae2ec758d8f66 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Fri, 1 Mar 2019 11:06:23 +0000 Subject: [PATCH] gdb: Better support for dynamic properties with negative values When the type of a property is smaller than the CORE_ADDR in which the property value has been placed, and if the property is signed, then sign extend the property value from its actual type up to the size of CORE_ADDR. gdb/ChangeLog: * dwarf2loc.c (dwarf2_evaluate_property): Sign extend property value if its desired type is smaller than a CORE_ADDR and signed. gdb/testsuite/ChangeLog: * gdb.fortran/vla-ptype.exp: Print array with negative bounds. * gdb.fortran/vla-sizeof.exp: Print the size of an array with negative bounds. * gdb.fortran/vla-value.exp: Print elements of an array with negative bounds. * gdb.fortran/vla.f90: Setup an array with negative bounds for testing. --- gdb/ChangeLog | 5 +++++ gdb/dwarf2loc.c | 23 ++++++++++++++++++++ gdb/testsuite/ChangeLog | 11 ++++++++++ gdb/testsuite/gdb.fortran/vla-ptype.exp | 12 +++++++++++ gdb/testsuite/gdb.fortran/vla-sizeof.exp | 10 +++++++++ gdb/testsuite/gdb.fortran/vla-value.exp | 27 ++++++++++++++++++++++++ gdb/testsuite/gdb.fortran/vla.f90 | 15 +++++++++++++ 7 files changed, 103 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d2dec796a80..d79d89f9389 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-07-12 Andrew Burgess + + * dwarf2loc.c (dwarf2_evaluate_property): Sign extend property + value if its desired type is smaller than a CORE_ADDR and signed. + 2019-07-12 Andrew Burgess * dwarf2loc.c (dwarf2_evaluate_property): Update to take account diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 00f3d76bdbe..63643cb45d5 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -2454,6 +2454,29 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, struct value *val = value_at (baton->property_type, *value); *value = value_as_address (val); } + else + { + gdb_assert (baton->property_type != NULL); + + struct type *type = check_typedef (baton->property_type); + if (TYPE_LENGTH (type) < sizeof (CORE_ADDR) + && !TYPE_UNSIGNED (type)) + { + /* If we have a valid return candidate and it's value + is signed, we have to sign-extend the value because + CORE_ADDR on 64bit machine has 8 bytes but address + size of an 32bit application is bytes. */ + const int addr_size + = (dwarf2_per_cu_addr_size (baton->locexpr.per_cu) + * TARGET_CHAR_BIT); + const CORE_ADDR neg_mask + = (~((CORE_ADDR) 0) << (addr_size - 1)); + + /* Check if signed bit is set and sign-extend values. */ + if (*value & neg_mask) + *value |= neg_mask; + } + } return true; } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 238fcfc8925..91b90d88e3a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2019-07-12 Bernhard Heckel + Andrew Burgess + + * gdb.fortran/vla-ptype.exp: Print array with negative bounds. + * gdb.fortran/vla-sizeof.exp: Print the size of an array with + negative bounds. + * gdb.fortran/vla-value.exp: Print elements of an array with + negative bounds. + * gdb.fortran/vla.f90: Setup an array with negative bounds for + testing. + 2019-07-11 Andrew Burgess * gdb.base/options.exp (expect_string): Dequote strings in diff --git a/gdb/testsuite/gdb.fortran/vla-ptype.exp b/gdb/testsuite/gdb.fortran/vla-ptype.exp index a4c3c9c7030..7f8268bd335 100644 --- a/gdb/testsuite/gdb.fortran/vla-ptype.exp +++ b/gdb/testsuite/gdb.fortran/vla-ptype.exp @@ -98,3 +98,15 @@ gdb_test "ptype vla2" "type = $real, allocatable \\(:,:,:\\)" "ptype vla2 not al gdb_test "ptype vla2(5, 45, 20)" \ "no such vector element \\\(vector not allocated\\\)" \ "ptype vla2(5, 45, 20) not allocated" + +gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v1"] +gdb_continue_to_breakpoint "vla1-neg-bounds-v1" +gdb_test "ptype vla1" \ + "type = $real, allocatable \\(-2:-1,-5:-2,-3:-1\\)" \ + "ptype vla1 negative bounds" + +gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v2"] +gdb_continue_to_breakpoint "vla1-neg-bounds-v2" +gdb_test "ptype vla1" \ + "type = $real, allocatable \\(-2:1,-5:2,-3:1\\)" \ + "ptype vla1 negative lower bounds, positive upper bounds" diff --git a/gdb/testsuite/gdb.fortran/vla-sizeof.exp b/gdb/testsuite/gdb.fortran/vla-sizeof.exp index 4fe6938445c..4aece0b61d0 100644 --- a/gdb/testsuite/gdb.fortran/vla-sizeof.exp +++ b/gdb/testsuite/gdb.fortran/vla-sizeof.exp @@ -59,3 +59,13 @@ gdb_test "print sizeof(pvla)" " = 4000" "print sizeof associated pvla" gdb_test "print sizeof(pvla(3,2,1))" "4" \ "print sizeof element from associated pvla" gdb_test "print sizeof(pvla(3:4,2,1))" "800" "print sizeof sliced pvla" + +gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v1"] +gdb_continue_to_breakpoint "vla1-neg-bounds-v1" +gdb_test "print sizeof(vla1)" " = 96" \ + "print sizeof vla1 negative bounds" + +gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v2"] +gdb_continue_to_breakpoint "vla1-neg-bounds-v2" +gdb_test "print sizeof(vla1)" " = 640" \ + "print sizeof vla1 negative lower bounds, positive upper bounds" diff --git a/gdb/testsuite/gdb.fortran/vla-value.exp b/gdb/testsuite/gdb.fortran/vla-value.exp index 3cf5d675005..ed0cace9f48 100644 --- a/gdb/testsuite/gdb.fortran/vla-value.exp +++ b/gdb/testsuite/gdb.fortran/vla-value.exp @@ -161,3 +161,30 @@ gdb_breakpoint [gdb_get_line_number "pvla-deassociated"] gdb_continue_to_breakpoint "pvla-deassociated, second time" gdb_test "print \$mypvar(1,3,8)" " = 1001" \ "print \$mypvar(1,3,8) after deallocated" + +gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v1"] +gdb_continue_to_breakpoint "vla1-neg-bounds-v1" +with_test_prefix "negative bounds" { + gdb_test "print vla1(-2,-5,-3)" " = 1" + gdb_test "print vla1(-2,-3,-1)" " = -231" + gdb_test "print vla1(-3,-5,-3)" "no such vector element" + gdb_test "print vla1(-2,-6,-3)" "no such vector element" + gdb_test "print vla1(-2,-5,-4)" "no such vector element" + gdb_test "print vla1(0,-2,-1)" "no such vector element" + gdb_test "print vla1(-1,-1,-1)" "no such vector element" + gdb_test "print vla1(-1,-2,0)" "no such vector element" +} + +gdb_breakpoint [gdb_get_line_number "vla1-neg-bounds-v2"] +gdb_continue_to_breakpoint "vla1-neg-bounds-v2" +with_test_prefix "negative lower bounds, positive upper bounds" { + gdb_test "print vla1(-2,-5,-3)" " = 2" + gdb_test "print vla1(-2,-3,-1)" " = 2" + gdb_test "print vla1(-2,-4,-2)" " = -242" + gdb_test "print vla1(-3,-5,-3)" "no such vector element" + gdb_test "print vla1(-2,-6,-3)" "no such vector element" + gdb_test "print vla1(-2,-5,-4)" "no such vector element" + gdb_test "print vla1(2,2,1)" "no such vector element" + gdb_test "print vla1(1,3,1)" "no such vector element" + gdb_test "print vla1(1,2,2)" "no such vector element" +} diff --git a/gdb/testsuite/gdb.fortran/vla.f90 b/gdb/testsuite/gdb.fortran/vla.f90 index 5bc608744b3..0ccb5c90d93 100644 --- a/gdb/testsuite/gdb.fortran/vla.f90 +++ b/gdb/testsuite/gdb.fortran/vla.f90 @@ -54,4 +54,19 @@ program vla allocate (vla3 (2,2)) ! vla2-deallocated vla3(:,:) = 13 + + allocate (vla1 (-2:-1, -5:-2, -3:-1)) + vla1(:, :, :) = 1 + vla1(-2, -3, -1) = -231 + + deallocate (vla1) ! vla1-neg-bounds-v1 + l = allocated(vla1) + + allocate (vla1 (-2:1, -5:2, -3:1)) + vla1(:, :, :) = 2 + vla1(-2, -4, -2) = -242 + + deallocate (vla1) ! vla1-neg-bounds-v2 + l = allocated(vla1) + end program vla -- 2.30.2