[gdb/testsuite] Fix gdb.dwarf2/opt-out-not-implptr.exp for -m32
authorTom de Vries <tdevries@suse.de>
Fri, 12 May 2023 09:43:41 +0000 (11:43 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 12 May 2023 09:43:41 +0000 (11:43 +0200)
commitcbd24a9f11feea879c2f1857053854ef329efbd8
tree8316c0ec1a4dcbd7b62e4e7dc4abdb2aef0c1110
parent388f63c18f523ca32199adef33dbacbeeed3b62a
[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.
gdb/testsuite/gdb.dwarf2/opt-out-not-implptr.exp