From: Tom Tromey Date: Thu, 20 Apr 2023 21:47:41 +0000 (-0600) Subject: Do not print when piece is optimized out X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=245f9db1fa8a355e9b18d0966fe20d6341e36813;p=binutils-gdb.git Do not print when piece is optimized out A user reported a bug where printing a certain array of integer types would result in the nonsensical: (gdb) p l_126 $1 = {6639779683436459270, , , } I tracked this down to some issues in the DWARF expression code. First, check_pieced_synthetic_pointer did not account for the situation where a location expression does not describe all the bits of a value -- in this case it returned true, meaning there is a synthetic pointer, but in fact these bits are optimized out. (It turns out this incorrect output had already been erroneously tested for as well.) Next, rw_pieced_value did not mark these bits as optimized-out, either. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30296 --- diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c index 4aa4542d947..f12abd9599d 100644 --- a/gdb/dwarf2/expr.c +++ b/gdb/dwarf2/expr.c @@ -411,11 +411,11 @@ rw_pieced_value (value *v, value *from, bool check_optimized) break; case DWARF_VALUE_IMPLICIT_POINTER: - if (from != nullptr) - { - v->mark_bits_optimized_out (offset, this_size_bits); - break; - } + if (from != nullptr) + { + v->mark_bits_optimized_out (offset, this_size_bits); + break; + } /* These bits show up as zeros -- but do not cause the value to be considered optimized-out. */ @@ -435,6 +435,13 @@ rw_pieced_value (value *v, value *from, bool check_optimized) bits_to_skip = 0; } + if (offset < max_offset) + { + if (check_optimized) + return true; + v->mark_bits_optimized_out (offset, max_offset - offset); + } + return false; } @@ -493,7 +500,7 @@ check_pieced_synthetic_pointer (const value *value, LONGEST bit_offset, return false; } - return true; + return bit_length == 0; } /* An implementation of an lval_funcs method to indirect through a diff --git a/gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp b/gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp new file mode 100644 index 00000000000..949bc23492a --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp @@ -0,0 +1,76 @@ +# Copyright 2023 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 . + +load_lib dwarf.exp + +require dwarf2_support + +standard_testfile main.c -dw.S + +set asm_file [standard_output_file $srcfile2] + +Dwarf::assemble $asm_file { + cu {} { + compile_unit {} { + declare_labels i64_type array + + i64_type: base_type { + {name "int64_t"} + {encoding @DW_ATE_signed} + {byte_size 8 DW_FORM_sdata} + } + + array: DW_TAG_array_type { + {DW_AT_name array_type} + {DW_AT_type :$i64_type} + } { + DW_TAG_subrange_type { + {DW_AT_type :$i64_type} + {DW_AT_lower_bound 0 DW_FORM_data1} + {DW_AT_upper_bound 3 DW_FORM_data1} + } + } + + DW_TAG_variable { + {name noptr} + {type :$array} + {location { + DW_OP_constu 6639779683436459270 + DW_OP_stack_value + DW_OP_piece 8 + } SPECIAL_expr} + } + } + } +} + +if {[build_executable ${testfile}.exp ${testfile} \ + [list $srcfile $asm_file] {nodebug}]} { + return -1 +} + +# We need --readnow because otherwise we never read in the CU we +# created above. +save_vars { GDBFLAGS } { + append set GDBFLAGS " -readnow" + clean_restart ${testfile} +} + +if {![runto_main]} { + return -1 +} + +gdb_test "print noptr" \ + " = \\{6639779683436459270, , , \\}" diff --git a/gdb/testsuite/gdb.dwarf2/shortpiece.exp b/gdb/testsuite/gdb.dwarf2/shortpiece.exp index dec219e95a8..82ea2c2eaa4 100644 --- a/gdb/testsuite/gdb.dwarf2/shortpiece.exp +++ b/gdb/testsuite/gdb.dwarf2/shortpiece.exp @@ -137,8 +137,8 @@ gdb_test "p s2" \ # value's content. # This test verifies that GDB can print a pieced value casted to a # different type. -gdb_test "p (int \[\]) s1" " = \\{1\\, 0\\}" -gdb_test "p (short \[\]) s1" " = \\{1\\, 0\\, 0\\, \\}" +gdb_test "p (int \[\]) s1" " = \\{1, \\}" +gdb_test "p (short \[\]) s1" " = \\{1, 0, 0, \\}" # Test for correct output if the size of the original object is not a # multiple of the array's element size.