[gdb/testsuite] Fix gdb.opt/clobbered-registers-O2.exp with clang
authorTom de Vries <tdevries@suse.de>
Tue, 24 May 2022 20:41:45 +0000 (22:41 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 24 May 2022 20:41:45 +0000 (22:41 +0200)
commit9e9f0d02b43676c4873567bafd822d77006cb360
tree8519b3af4acd11a3540dc19cb5b134d6853b459f
parenta0ae328a266d2b01ff640be9277e01592b08971a
[gdb/testsuite] Fix gdb.opt/clobbered-registers-O2.exp with clang

When running test-case gdb.opt/clobbered-registers-O2.exp with clang 12.0.1, I
get:
...
(gdb) run ^M
Starting program: clobbered-registers-O2 ^M
^M
Program received signal SIGSEGV, Segmentation fault.^M
gen_movsd (operand0=<optimized out>, operand1=<optimized out>) at \
  clobbered-registers-O2.c:31^M
31              return *start_sequence(operand0, operand1);^M
(gdb) FAIL: gdb.opt/clobbered-registers-O2.exp: runto: run to start_sequence
...

The problem is that the breakpoint in start_sequence doesn't trigger, because:
- the call to start_sequence in gen_movsd is optimized away, despite the
  __attribute__((noinline)), so the actual function start_sequence doesn't get
  called, and
- the debug info doesn't contain inlined function info, so there's only one
  breakpoint location.

Adding noclone and noipa alongside the noinline attribute doesn't fix this.

Adding the clang-specific attribute optnone in start_sequence does, but since
it inhibits all optimization, that's not a preferred solution in a gdb.opt
test-case, and it would work only for clang and not other compilers that
possibly have the same issue.

Fix this by moving functions start_sequence and gen_movsd into their own
files, as a way of trying harder to enforce noinline/noipa/noclone.

Tested on x86_64-linux.
gdb/testsuite/gdb.opt/clobbered-registers-O2-2.c [new file with mode: 0644]
gdb/testsuite/gdb.opt/clobbered-registers-O2-3.c [new file with mode: 0644]
gdb/testsuite/gdb.opt/clobbered-registers-O2.c
gdb/testsuite/gdb.opt/clobbered-registers-O2.exp