From: Yufeng Zhang Date: Tue, 24 Jun 2014 16:33:45 +0000 (+0000) Subject: Make the AAPCS64 function return tests more robust. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=84e0f57e35738500e44fd21753e31295d4700bfb;p=gcc.git Make the AAPCS64 function return tests more robust. 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 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d42af0ffaa7..913a9a6ae00 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2014-06-24 Yufeng Zhang + + * 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 PR c++/33972 diff --git a/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-2.h b/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-2.h index c56e7cc6785..57492197e5f 100644 --- a/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-2.h +++ b/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-2.h @@ -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() diff --git a/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest.S b/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest.S index 86ce7bed777..68845fbcdb5 100644 --- a/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest.S +++ b/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest.S @@ -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