diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b553ecaf9910..7f70e2b88284 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,18 @@ * tree-inline.c (tree_function_versioning): Check DF info existence before accessing it. +2014-06-05 Marcus Shawcroft + + * config/aarch64/aarch64.h (aarch64_frame): Add hard_fp_offset and + frame_size. + * config/aarch64/aarch64.c (aarch64_layout_frame): Initialize + aarch64_frame hard_fp_offset and frame_size. + (aarch64_expand_prologue): Use aarch64_frame hard_fp_offset and + frame_size; remove original_frame_size. + (aarch64_expand_epilogue, aarch64_final_eh_return_addr): Likewise. + (aarch64_initial_elimination_offset): Remove frame_size and + offset. Use aarch64_frame frame_size. + 2014-06-05 Marcus Shawcroft Jiong Wang diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 1aa951cddf89..621692e4f799 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -1868,6 +1868,18 @@ aarch64_layout_frame (void) offset = AARCH64_ROUND_UP (offset, STACK_BOUNDARY / BITS_PER_UNIT); cfun->machine->frame.saved_regs_size = offset; + + cfun->machine->frame.hard_fp_offset + = AARCH64_ROUND_UP (cfun->machine->frame.saved_varargs_size + + get_frame_size () + + cfun->machine->frame.saved_regs_size, + STACK_BOUNDARY / BITS_PER_UNIT); + + cfun->machine->frame.frame_size + = AARCH64_ROUND_UP (cfun->machine->frame.hard_fp_offset + + crtl->outgoing_args_size, + STACK_BOUNDARY / BITS_PER_UNIT); + cfun->machine->frame.laid_out = true; } @@ -2118,26 +2130,20 @@ aarch64_expand_prologue (void) sub sp, sp, */ - HOST_WIDE_INT original_frame_size; /* local variables + vararg save */ HOST_WIDE_INT frame_size, offset; - HOST_WIDE_INT fp_offset; /* FP offset from SP */ + HOST_WIDE_INT fp_offset; /* Offset from hard FP to SP. */ rtx insn; aarch64_layout_frame (); - original_frame_size = get_frame_size () + cfun->machine->frame.saved_varargs_size; - gcc_assert ((!cfun->machine->frame.saved_varargs_size || cfun->stdarg) - && (cfun->stdarg || !cfun->machine->frame.saved_varargs_size)); - frame_size = (original_frame_size + cfun->machine->frame.saved_regs_size - + crtl->outgoing_args_size); - offset = frame_size = AARCH64_ROUND_UP (frame_size, - STACK_BOUNDARY / BITS_PER_UNIT); if (flag_stack_usage_info) - current_function_static_stack_size = frame_size; + current_function_static_stack_size = cfun->machine->frame.frame_size; - fp_offset = (offset - - original_frame_size - - cfun->machine->frame.saved_regs_size); + frame_size = cfun->machine->frame.frame_size; + offset = cfun->machine->frame.frame_size; + + fp_offset = cfun->machine->frame.frame_size + - cfun->machine->frame.hard_fp_offset; /* Store pairs and load pairs have a range only -512 to 504. */ if (offset >= 512) @@ -2148,7 +2154,7 @@ aarch64_expand_prologue (void) register area. This will allow the pre-index write-back store pair instructions to be used for setting up the stack frame efficiently. */ - offset = original_frame_size + cfun->machine->frame.saved_regs_size; + offset = cfun->machine->frame.hard_fp_offset; if (offset >= 512) offset = cfun->machine->frame.saved_regs_size; @@ -2284,28 +2290,23 @@ aarch64_expand_prologue (void) void aarch64_expand_epilogue (bool for_sibcall) { - HOST_WIDE_INT original_frame_size, frame_size, offset; + HOST_WIDE_INT frame_size, offset; HOST_WIDE_INT fp_offset; rtx insn; rtx cfa_reg; aarch64_layout_frame (); - original_frame_size = get_frame_size () + cfun->machine->frame.saved_varargs_size; - frame_size = (original_frame_size + cfun->machine->frame.saved_regs_size - + crtl->outgoing_args_size); - offset = frame_size = AARCH64_ROUND_UP (frame_size, - STACK_BOUNDARY / BITS_PER_UNIT); - fp_offset = (offset - - original_frame_size - - cfun->machine->frame.saved_regs_size); + offset = frame_size = cfun->machine->frame.frame_size; + fp_offset = cfun->machine->frame.frame_size + - cfun->machine->frame.hard_fp_offset; cfa_reg = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx; /* Store pairs and load pairs have a range only -512 to 504. */ if (offset >= 512) { - offset = original_frame_size + cfun->machine->frame.saved_regs_size; + offset = cfun->machine->frame.hard_fp_offset; if (offset >= 512) offset = cfun->machine->frame.saved_regs_size; @@ -2487,16 +2488,12 @@ aarch64_expand_epilogue (bool for_sibcall) rtx aarch64_final_eh_return_addr (void) { - HOST_WIDE_INT original_frame_size, frame_size, offset, fp_offset; + HOST_WIDE_INT fp_offset; + aarch64_layout_frame (); - original_frame_size = get_frame_size () + cfun->machine->frame.saved_varargs_size; - frame_size = (original_frame_size + cfun->machine->frame.saved_regs_size - + crtl->outgoing_args_size); - offset = frame_size = AARCH64_ROUND_UP (frame_size, - STACK_BOUNDARY / BITS_PER_UNIT); - fp_offset = offset - - original_frame_size - - cfun->machine->frame.saved_regs_size; + + fp_offset = cfun->machine->frame.frame_size + - cfun->machine->frame.hard_fp_offset; if (cfun->machine->frame.reg_offset[LR_REGNUM] < 0) return gen_rtx_REG (DImode, LR_REGNUM); @@ -4246,42 +4243,28 @@ aarch64_can_eliminate (const int from, const int to) HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned from, unsigned to) { - HOST_WIDE_INT frame_size; - HOST_WIDE_INT offset; - aarch64_layout_frame (); - frame_size = (get_frame_size () + cfun->machine->frame.saved_regs_size - + crtl->outgoing_args_size - + cfun->machine->frame.saved_varargs_size); - - frame_size = AARCH64_ROUND_UP (frame_size, STACK_BOUNDARY / BITS_PER_UNIT); - offset = frame_size; if (to == HARD_FRAME_POINTER_REGNUM) { if (from == ARG_POINTER_REGNUM) - return offset - crtl->outgoing_args_size; + return cfun->machine->frame.frame_size - crtl->outgoing_args_size; if (from == FRAME_POINTER_REGNUM) - return cfun->machine->frame.saved_regs_size + get_frame_size (); + return (cfun->machine->frame.hard_fp_offset + - cfun->machine->frame.saved_varargs_size); } if (to == STACK_POINTER_REGNUM) { if (from == FRAME_POINTER_REGNUM) - { - HOST_WIDE_INT elim = crtl->outgoing_args_size - + cfun->machine->frame.saved_regs_size - + get_frame_size (); - elim = AARCH64_ROUND_UP (elim, STACK_BOUNDARY / BITS_PER_UNIT); - return elim; - } + return (cfun->machine->frame.frame_size + - cfun->machine->frame.saved_varargs_size); } - return offset; + return cfun->machine->frame.frame_size; } - /* Implement RETURN_ADDR_RTX. We do not support moving back to a previous frame. */ diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index 392d095cdfe9..ae94356f3aef 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -527,6 +527,17 @@ struct GTY (()) aarch64_frame HOST_WIDE_INT padding0; HOST_WIDE_INT hardfp_offset; /* HARD_FRAME_POINTER_REGNUM */ + /* Offset from the base of the frame (incomming SP) to the + hard_frame_pointer. This value is always a multiple of + STACK_BOUNDARY. */ + HOST_WIDE_INT hard_fp_offset; + + /* The size of the frame. This value is the offset from base of the + * frame (incomming SP) to the stack_pointer. This value is always + * a multiple of STACK_BOUNDARY. */ + + HOST_WIDE_INT frame_size; + bool laid_out; };