diff options
author | Tom de Vries <tdevries@suse.de> | 2023-05-12 11:43:41 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2023-05-12 11:43:41 +0200 |
commit | cbd24a9f11feea879c2f1857053854ef329efbd8 (patch) | |
tree | 8316c0ec1a4dcbd7b62e4e7dc4abdb2aef0c1110 | |
parent | 388f63c18f523ca32199adef33dbacbeeed3b62a (diff) | |
download | binutils-gdb-cbd24a9f11feea879c2f1857053854ef329efbd8.tar.gz |
[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, <optimized out>, <optimized out>, <optimized out>}^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.
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp | 52 |
1 files 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, <optimized out>, <optimized out>, <optimized out>\\}" +set cmd "print i64_noptr" +if { [is_64_target] } { + gdb_test $cmd \ + " = \\{$c64, <optimized out>, <optimized out>, <optimized out>\\}" +} else { + unsupported $cmd +} + +gdb_test "print i32_noptr" \ + " = \\{$c32, <optimized out>, <optimized out>, <optimized out>\\}" |