From cbd24a9f11feea879c2f1857053854ef329efbd8 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Fri, 12 May 2023 11:43:41 +0200 Subject: [PATCH] [gdb/testsuite] Fix gdb.dwarf2/opt-out-not-implptr.exp for -m32 When running test-case gdb.dwarf2/opt-out-not-implptr.exp with target board unix/-m32 we have: ... (gdb) print noptr^M $1 = {0, , , }^M (gdb) FAIL: gdb.dwarf2/opt-out-not-implptr.exp: print noptr ... The problem happens when evaluating this dwarf expression: ... <45> DW_AT_location : 13 byte block: 10 86 ea d7 d0 96 8e cf 92 5c 9f 93 8 \ (DW_OP_constu: 6639779683436459270; DW_OP_stack_value; DW_OP_piece: 8) ... The DW_OP_constu pushes a value with "generic type" on to the DWARF stack, and the "generic type" has the size of an address on the target machine, which for target board unix/-m32 is 4 bytes. Consequently, the constant is abbreviated. Next, the DW_OP_piece declares that the resulting 4-byte value is 8 bytes large, and we hit this clause in rw_pieced_value: ... /* Use zeroes if piece reaches beyond stack value. */ if (p->offset + p->size > stack_value_size_bits) break; ... and consequently get a zero. We could just add require is_target_64 to the test-case, but instead, add a 32-bit case and require is_target_64 just for the 64-bit case. Tested on x86_64-linux. --- .../gdb.dwarf2/opt-out-not-implptr.exp | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp b/gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp index 949bc23492a..9b240c9a2af 100644 --- a/gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp +++ b/gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp @@ -21,10 +21,13 @@ standard_testfile main.c -dw.S set asm_file [standard_output_file $srcfile2] +set c64 6639779683436459270 +set c32 1779823878 + Dwarf::assemble $asm_file { cu {} { compile_unit {} { - declare_labels i64_type array + declare_labels i64_type i32_type i64_array i32_array i64_type: base_type { {name "int64_t"} @@ -32,7 +35,13 @@ Dwarf::assemble $asm_file { {byte_size 8 DW_FORM_sdata} } - array: DW_TAG_array_type { + i32_type: base_type { + {name "int32_t"} + {encoding @DW_ATE_signed} + {byte_size 4 DW_FORM_sdata} + } + + i64_array: DW_TAG_array_type { {DW_AT_name array_type} {DW_AT_type :$i64_type} } { @@ -43,15 +52,36 @@ Dwarf::assemble $asm_file { } } + i32_array: DW_TAG_array_type { + {DW_AT_name array_type} + {DW_AT_type :$i32_type} + } { + DW_TAG_subrange_type { + {DW_AT_type :$i32_type} + {DW_AT_lower_bound 0 DW_FORM_data1} + {DW_AT_upper_bound 3 DW_FORM_data1} + } + } + DW_TAG_variable { - {name noptr} - {type :$array} + {name i64_noptr} + {type :$i64_array} {location { - DW_OP_constu 6639779683436459270 + DW_OP_constu $::c64 DW_OP_stack_value DW_OP_piece 8 } SPECIAL_expr} } + + DW_TAG_variable { + {name i32_noptr} + {type :$i32_array} + {location { + DW_OP_constu $::c32 + DW_OP_stack_value + DW_OP_piece 4 + } SPECIAL_expr} + } } } } @@ -72,5 +102,13 @@ if {![runto_main]} { return -1 } -gdb_test "print noptr" \ - " = \\{6639779683436459270, , , \\}" +set cmd "print i64_noptr" +if { [is_64_target] } { + gdb_test $cmd \ + " = \\{$c64, , , \\}" +} else { + unsupported $cmd +} + +gdb_test "print i32_noptr" \ + " = \\{$c32, , , \\}" -- 2.30.2