On 18/06/14 15:16, Yufeng Zhang wrote:
> Hi,
> 
> This improves the robustness of the aapcs64 test framework for testing 
> function return ABI rules.  It ensures the test facility functions now 
> able to see the exact content of return registers right at the moment 
> when a function returns.
> 
> OK for trunk?

OK once the issues with the comment are clarified.

R.

> 
> Thanks,
> Yufeng
> 
> gcc/testsuite
> 
>       Make the AAPCS64 function return tests more robust.
> 
>       * 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.
> 
> 
> patch
> 
> 
> diff --git a/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-2.h 
> b/gcc/testsuite/gcc.target/aarch64/aapcs64/abitest-2.h
> index c56e7cc..c87fe9b 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 returning of this function and the      
>   \
s/returning/return/

> +       continueous execution of its caller.  By doing this, myfunc ()        
>   \
Typo: continueous.  Do you mean continuing?

> +       can save and check the exact content of the registers that are        
>   \
> +       used for      the function return value.                              
>   \
stray tab.

> +       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,     
>   \
Similarly.

> +       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 86ce7be..68845fb 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
> 


Reply via email to