gdb: Ensure compiler doesn't optimise variable out in test
authorAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 29 Aug 2018 17:49:51 +0000 (18:49 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 30 Aug 2018 15:33:49 +0000 (16:33 +0100)
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.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/funcargs.c

index 0164558d07deb9c2aa9db805a70f50d03da6c1bc..23a41d4bd7c3ba2505938b7cc9a336c09f84172b 100644 (file)
@@ -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>
 
        * gdb.compile/compile-cplus-anonymous.cc: New file.
index 600792f0a7ef95a0a7d618293e63fc5334d87615..d5ff19218c6a682cb940237bfc9da3a167d70b29 100644 (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)
 {
   a.s = a.i = a.l = --depth;
@@ -431,6 +437,9 @@ void recurse (SVAL a, int depth)
     hitbottom ();
   else
     recurse (a, depth);
+
+  /* Ensure A is not discarded after the above calls.  */
+  use_a (a);
 }
 
 void test_struct_args ()