mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-04 22:15:12 +08:00
gdb: Ensure compiler doesn't optimise variable out in test
In the test gdb.base/funcargs.exp, there's this function: void recurse (SVAL a, int depth) { a.s = a.i = a.l = --depth; if (depth == 0) hitbottom (); else recurse (a, depth); } The test script places a breakpoint in hitbottom, and runs the executable which calls recurse with an initial depth of 4. When GDB hits the breakpoint in hitbottom the testscript performs a backtrace, and examines 'a' at each level. The problem is that 'a' is not live after either the call to 'hitbottom' or the call to 'recurse', and as a result the test fails. In the particular case I was looking at GCC for RISC-V 32-bit, the variable 'a' is on the stack and GCC selects the register $ra (the return address register) to hold the pointer to 'a'. This is fine, because, by the time the $ra register is needed to hold a return address (calling hitbottom or recurse) then 'a' is dead. In this patch I propose that a use of 'a' is added after the calls to hitbottom and recurse, this should cause the compiler to keep 'a' around, which should ensure GDB can find it. gdb/testsuite/ChangeLog: * gdb.base/funcargs.c (use_a): New function. (recurse): Call use_a.
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
2018-08-30 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* gdb.base/funcargs.c (use_a): New function.
|
||||||
|
(recurse): Call use_a.
|
||||||
|
|
||||||
2018-08-29 Keith Seitz <keiths@redhat.com>
|
2018-08-29 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
* gdb.compile/compile-cplus-anonymous.cc: New file.
|
* gdb.compile/compile-cplus-anonymous.cc: New file.
|
||||||
|
@ -424,6 +424,12 @@ void hitbottom ()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void use_a (SVAL a)
|
||||||
|
{
|
||||||
|
/* Trick the compiler into thinking A is important. */
|
||||||
|
volatile SVAL dummy = a;
|
||||||
|
}
|
||||||
|
|
||||||
void recurse (SVAL a, int depth)
|
void recurse (SVAL a, int depth)
|
||||||
{
|
{
|
||||||
a.s = a.i = a.l = --depth;
|
a.s = a.i = a.l = --depth;
|
||||||
@ -431,6 +437,9 @@ void recurse (SVAL a, int depth)
|
|||||||
hitbottom ();
|
hitbottom ();
|
||||||
else
|
else
|
||||||
recurse (a, depth);
|
recurse (a, depth);
|
||||||
|
|
||||||
|
/* Ensure A is not discarded after the above calls. */
|
||||||
|
use_a (a);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_struct_args ()
|
void test_struct_args ()
|
||||||
|
Reference in New Issue
Block a user