[PATCH v2] aarch64: Add split-stack initial support

Jiong Wang jiong.wang@foss.arm.com
Fri Oct 14 14:27:00 GMT 2016


Hi Adhemerval,

On 06/10/16 22:54, Adhemerval Zanella wrote:
> +  bool split_stack_arg_pointer_used = split_stack_arg_pointer_used_p ();
>   
>     if (flag_stack_usage_info)
>       current_function_static_stack_size = frame_size;
> @@ -3220,6 +3264,10 @@ aarch64_expand_prologue (void)
>   	aarch64_emit_probe_stack_range (STACK_CHECK_PROTECT, frame_size);
>       }
>   
> +  /* Save split-stack argument pointer before stack adjustment.  */
> +  if (split_stack_arg_pointer_used)
> +    emit_move_insn (gen_rtx_REG (Pmode, R10_REGNUM), stack_pointer_rtx);
> +
>     aarch64_add_constant (Pmode, SP_REGNUM, IP0_REGNUM, -initial_adjust, true);
>   
>     if (callee_adjust != 0)
> @@ -3243,6 +3291,30 @@ aarch64_expand_prologue (void)
>   			     callee_adjust != 0 || frame_pointer_needed);
>     aarch64_add_constant (Pmode, SP_REGNUM, IP1_REGNUM, -final_adjust,
>   			!frame_pointer_needed);
> +
> +  if (split_stack_arg_pointer_used_p ())

Redundant call? can use split_stack_arg_pointer_use"
> +
> +  /* Always emit two insns to calculate the requested stack, so the linker
> +     can edit them when adjusting size for calling non-split-stack code.  */
> +  ninsn = aarch64_internal_mov_immediate (temp, GEN_INT (-frame_size), true,
> +					  Pmode);
> +  gcc_assert (ninsn == 1 || ninsn == 2);
> +  if (ninsn == 1)
> +    emit_insn (gen_nop ());
If you expect the nop is kept together with the other
I am still seeing nop scheduled away from the addtition.

         mov     x10, -4144
         add     x10, sp, x10
         nop

> +
> +#define BACKOFF			0x2000

The BACKOFF value is 0x2000 here while in morestack-c.c it is 0x1000, is 
this deliberate?
> +
> +	# Calculate requested stack size.
> +	sub	x12, sp, x10
> +	# Save parameters
> +	stp	x29, x30, [sp, -MORESTACK_FRAMESIZE]!
> +	.cfi_def_cfa_offset MORESTACK_FRAMESIZE
> +	.cfi_offset 29, -MORESTACK_FRAMESIZE
> +	.cfi_offset 30, -MORESTACK_FRAMESIZE+8
> +	add	x29, sp, 0
> +	.cfi_def_cfa_register 29
> +	# Adjust the requested stack size for the frame pointer save.
> +	add	x12, x12, 16
> +	stp	x0, x1, [sp, 16]
> +	stp	x2, x3, [sp, 32]
> +	add	x12, x12, BACKOFF
> +	stp	x4, x5, [sp, 48]
> +	stp	x6, x7, [sp, 64]
> +	stp	x28, x12, [sp, 80]
> +
> +	# Setup on x28 the function initial frame pointer.  Its value will
> +	# copied to function argument pointer.
> +	add	x28, sp, MORESTACK_FRAMESIZE + 16
> +
> +	# void __morestack_block_signals (void)
> +	bl	__morestack_block_signals
> +
> +	# void *__generic_morestack (size_t *pframe_size,
> +	#			     void *old_stack,
> +	#			     size_t param_size)
> +	# pframe_size: is the size of the required stack frame (the function
> +	#	       amount of space remaining on the allocated stack).
s/pframe_size: is the size/pframe_size: points at the size/

> +
> +	# Set up for a call to the target function.
> +	ldr	x30, [x28, STACKFRAME_BASE + 8]
> +	ldp	x0, x1, [x28, STACKFRAME_BASE + 16]
> +	ldp	x2, x3, [x28, STACKFRAME_BASE + 32]
> +	ldp	x4, x5, [x28, STACKFRAME_BASE + 48]
> +	ldp	x6, x7, [x28, STACKFRAME_BASE + 64]
> +	add	x9, x30, 8
> +	cmp	x30, x9
We can remove this "cmp" by using "adds x9, x30, 8"?
I am thinkg "adds" will set "c" bit in conditional flag to zero, then 
the bcs
check in function prologue will fail, thus the argument pointer 
initialization
will always be executed if the execution flow is from __morestack.

         bcs     .L8
         mov     x10, x28

> +	blr	x9
> +
> +	stp	x0, x1, [x28, STACKFRAME_BASE + 16]
> +	stp	x2, x3, [x28, STACKFRAME_BASE + 32]
> +	stp	x4, x5, [x28, STACKFRAME_BASE + 48]
> +	stp	x6, x7, [x28, STACKFRAME_BASE + 64]
> +
>



More information about the Gcc-patches mailing list