Commit 84e0f57e by Yufeng Zhang Committed by Yufeng Zhang

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
parent 3fa591d4
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
......
......@@ -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()
......
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment