Make the AAPCS64 function return tests more robust.
authorYufeng Zhang <yufeng.zhang@arm.com>
Tue, 24 Jun 2014 16:33:45 +0000 (16:33 +0000)
committerYufeng Zhang <yufeng@gcc.gnu.org>
Tue, 24 Jun 2014 16:33:45 +0000 (16:33 +0000)
gcc/testsuite

* gcc.target/aarch64/aapcs64/abitest-2.h (saved_return_address): New
global variable.
(FUNC_VAL_CHECK): Update to call myfunc via the 'ret' instruction,
instead of calling sequentially in the C code.
* gcc.target/aarch64/aapcs64/abitest.S (LABEL_TEST_FUNC_RETURN): Store
saved_return_address to the stack frame where LR register was stored.
(saved_return_address): Declare weak.

From-SVN: r211954

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-2.h
gcc/testsuite/gcc.target/aarch64/aapcs64/abitest.S

index d42af0ffaa7466dd149a2ca40d43807eaf6f9e98..913a9a6ae004780c9e0601cc390ce37a86ec3524 100644 (file)
@@ -1,3 +1,13 @@
+2014-06-24  Yufeng Zhang  <yufeng.zhang@arm.com>
+
+       * gcc.target/aarch64/aapcs64/abitest-2.h (saved_return_address): New
+       global variable.
+       (FUNC_VAL_CHECK): Update to call myfunc via the 'ret' instruction,
+       instead of calling sequentially in the C code.
+       * gcc.target/aarch64/aapcs64/abitest.S (LABEL_TEST_FUNC_RETURN): Store
+       saved_return_address to the stack frame where LR register was stored.
+       (saved_return_address): Declare weak.
+
 2014-06-24  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/33972
index c56e7cc678577a1da0a3fa115352d71f9c523b88..57492197e5fca961ae2c3ace80dff1c31bf93acf 100644 (file)
@@ -5,6 +5,7 @@
 #include "validate_memory.h"
 
 void (*testfunc_ptr)(char* stack);
+unsigned long long saved_return_address;
 
 /* Helper macros to generate function name.  Example of the function name:
    func_return_val_1.  */
@@ -71,6 +72,17 @@ __attribute__ ((noinline)) type FUNC_NAME (id) (int i, double d, type t)  \
                                  optimized away.  Using i and d prevents \
                                  warnings about unused parameters.       \
                               */                                         \
+    /* We save and set up the LR register in a way that essentially      \
+       inserts myfunc () between the return of this function and the     \
+       continuing execution of its caller.  By doing this, myfunc ()     \
+       can save and check the exact content of the registers that are    \
+       used for the function return value.                               \
+       The previous approach of sequentially calling myfunc right after          \
+       this function does not guarantee myfunc see the exact register    \
+       content, as compiler may emit code in between the two calls,      \
+       especially during the -O0 codegen.  */                            \
+    asm volatile ("mov %0, x30" : "=r" (saved_return_address));                  \
+    asm volatile ("mov x30, %0" : : "r" ((unsigned long long) myfunc));   \
     return t;                                                            \
   }
 #include TESTFILE
@@ -84,7 +96,8 @@ __attribute__ ((noinline)) type FUNC_NAME (id) (int i, double d, type t)  \
   {                                                                    \
     testfunc_ptr = TEST_FUNC_NAME(id);                                 \
     FUNC_NAME(id) (0, 0.0, var);                                       \
-    myfunc ();                                                         \
+    /* The above function implicitly calls myfunc () on its return,    \
+       and the execution resumes from here after myfunc () finishes.  */\
   }
 
 int main()
index 86ce7bed77720ef2f3b86054ec722bbeff2bcd40..68845fbcdb5e6984d6154b3a8bcd2b04b7ce1f8f 100644 (file)
@@ -50,6 +50,10 @@ LABEL_TEST_FUNC_RETURN:
       add      x9, x9, :lo12:testfunc_ptr
       ldr      x9, [x9, #0]
       blr      x9                              // function return value test
+      adrp     x9, saved_return_address
+      add      x9, x9, :lo12:saved_return_address
+      ldr      x9, [x9, #0]
+      str      x9, [sp, #8]                    // Update the copy of LR reg saved on stack
 LABEL_RET:
       ldp      x0, x30, [sp]
       mov      sp, x0
@@ -57,3 +61,4 @@ LABEL_RET:
 
 .weak  testfunc
 .weak  testfunc_ptr
+.weak  saved_return_address