diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2011-06-10 10:50:20 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2011-06-10 10:50:20 +0000 |
commit | b11b09048dcd08782578c7c34456e51aa408b1a9 (patch) | |
tree | 137aaf52d3f6ac1954c79cc1adf4a87dac699295 /libgcc/config/sparc | |
parent | f5c01f5bde72d697dc28a9d9e31e9dfa2209f081 (diff) | |
download | gcc-b11b09048dcd08782578c7c34456e51aa408b1a9.zip gcc-b11b09048dcd08782578c7c34456e51aa408b1a9.tar.gz gcc-b11b09048dcd08782578c7c34456e51aa408b1a9.tar.bz2 |
invoke.texi (SPARC options): Add -mflat.
gcc/
* doc/invoke.texi (SPARC options): Add -mflat.
* config/sparc/sparc.opt: Likewise.
* config/sparc/sparc-protos.h (sparc_expand_epilogue): Add parameter.
(sparc_flat_expand_prologue): Declare.
(sparc_flat_expand_epilogue): Likewise.
* config/sparc/sparc.h (CPP_CPU_SPEC): Do not handle -msoft-float.
(CPP_ENDIAN_SPEC): Replace with...
(CPP_OTHER_SPEC): ...this. Also handle -mflat and -msoft-float.
(CPP_SPEC): Adjust to above change.
(EXTRA_SPECS): Likewise.
(SPARC_INCOMING_INT_ARG_FIRST): Add TARGET_FLAT handling.
(INCOMING_REGNO): Likewise.
(OUTGOING_REGNO): Likewise.
(LOCAL_REGNO): Likewise.
(SETUP_FRAME_ADDRESSES): Likewise.
(FIXED_REGISTERS): Set 0 for %fp.
(CALL_USED_REGISTERS): Likewise.
(INITIAL_ELIMINATION_OFFSET): Pass current_function_is_leaf.
(EXIT_IGNORE_STACK): Define to 1 unconditionally.
(RETURN_ADDR_REGNUM): Define.
(RETURN_ADDR_RTX): Use it.
(INCOMING_RETURN_ADDR_REGNUM): Define.
(INCOMING_RETURN_ADDR_RTX): Use it.
(DWARF_FRAME_RETURN_COLUMN): Likewise.
(EH_RETURN_REGNUM): Define.
(EH_RETURN_STACKADJ_RTX): Use it.
(EH_RETURN_HANDLER_RTX): Delete.
(EPILOGUE_USES): Use them and add TARGET_FLAT handling.
* config/sparc/sparc.c (apparent_fsize, actual_fsize, num_gfregs):
Delete.
(struct machine_function): Add frame_size, apparent_frame_size,
frame_base_reg, frame_base_offset, n_global_fp_regs and
save_local_in_regs_p fields.
(sparc_frame_size, sparc_apparent_frame_size, sparc_frame_base_reg,
sparc_frame_base_offset, sparc_n_global_fp_regs,
sparc_save_local_in_regs_p): New macros.
(sparc_option_override): Error out if -fcall-saved-REG is specified
for Out registers.
(eligible_for_restore_insn): Fix formatting.
(eligible_for_return_delay): Likewise. Add TARGET_FLAT handling.
(eligible_for_sibcall_delay): Likewise.
(RTX_OK_FOR_OFFSET_P, RTX_OK_FOR_OLO10_P): Add MODE parameter.
(sparc_legitimate_address_p): Adjust to above change.
(save_global_or_fp_reg_p): New predicate.
(return_addr_reg_needed_p): Likewise.
(save_local_or_in_reg_p): Likewise.
(sparc_compute_frame_size): Use them. Add TARGET_FLAT handling.
(SORR_SAVE, SORR_RESTORE): Delete.
(sorr_pred_t): New typedef.
(sorr_act_t): New enum.
(save_or_restore_regs): Rename to...
(emit_save_or_restore_regs): ...this. Change type of LOW and HIGH
parameters, remove ACTION parameter, add LEAF_FUNCTION_P, SAVE_P,
ACTION_TRUE and ACTION_FALSE parameters. Implement more general
mechanism. Add CFI information for double-word saves in 32-bit mode.
(emit_adjust_base_to_offset): New function extracted from...
(emit_save_or_restore_regs): ...this. Rename the rest to...
(emit_save_or_restore_regs_global_fp_regs): ...this.
(emit_save_or_restore_regs_local_in_regs): New function.
(gen_create_flat_frame_[123]): New functions.
(sparc_expand_prologue): Use SIZE local variable. Adjust.
(sparc_flat_expand_prologue): New function.
(sparc_asm_function_prologue): Add TARGET_FLAT handling.
(sparc_expand_epilogue): Use SIZE local variable. Adjust.
(sparc_flat_expand_epilogue): New function.
(sparc_can_use_return_insn_p): Add TARGET_FLAT handling.
(output_return): Likewise.
(output_sibcall): Likewise.
(sparc_output_mi_thunk): Likewise.
(sparc_frame_pointer_required): Likewise.
(sparc_conditional_register_usage): If TARGET_FLAT, disable the leaf
function optimization.
* config/sparc/sparc.md (flat): New attribute.
(prologue): Add TARGET_FLAT handling.
(save_register_window): Disable if TARGET_FLAT.
(create_flat_frame_[123]): New patterns.
(epilogue): Add TARGET_FLAT handling.
(sibcall_epilogue): Likewise.
(eh_return): New expander.
(eh_return_internal): New insn and splitter.
(return_internal): Add TARGET_FLAT handling.
(untyped_return): Remove bogus test and use RETURN_ADDR_REGNUM.
(save_stack_nonlocal): Use RETURN_ADDR_REGNUM.
(nonlocal_goto): Add TARGET_FLAT handling.
* config/sparc/t-elf: Add -mflat multilib.
* config/sparc/t-leon: Likewise.
libgcc/
* config/sparc/linux-unwind.h (STACK_BIAS): Define.
(sparc64_fallback_frame_state): Use it.
(sparc64_frob_update_context): Further adjust context.
* config/sparc/sol2-unwind.h (sparc64_frob_update_context): Likewise.
* config/sparc/sol2-ci.S: Add TARGET_FLAT handling.
* config/sparc/sol2-cn.S: Likewise.
Co-Authored-By: Laurent Rougé <laurent.rouge@menta.fr>
From-SVN: r174897
Diffstat (limited to 'libgcc/config/sparc')
-rw-r--r-- | libgcc/config/sparc/linux-unwind.h | 17 | ||||
-rw-r--r-- | libgcc/config/sparc/sol2-ci.S | 24 | ||||
-rw-r--r-- | libgcc/config/sparc/sol2-cn.S | 32 | ||||
-rw-r--r-- | libgcc/config/sparc/sol2-unwind.h | 11 |
4 files changed, 75 insertions, 9 deletions
diff --git a/libgcc/config/sparc/linux-unwind.h b/libgcc/config/sparc/linux-unwind.h index adfef6e..c5e7f8d 100644 --- a/libgcc/config/sparc/linux-unwind.h +++ b/libgcc/config/sparc/linux-unwind.h @@ -27,6 +27,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #if defined(__arch64__) +#undef STACK_BIAS +#define STACK_BIAS 2047 + /* 64-bit SPARC version */ #define MD_FALLBACK_FRAME_STATE_FOR sparc64_fallback_frame_state @@ -49,7 +52,8 @@ sparc64_fallback_frame_state (struct _Unwind_Context *context, fpu_save_off = regs_off + (16 * 8) + (3 * 8) + (2 * 4); new_cfa = *(long *)(this_cfa + regs_off + (14 * 8)); - new_cfa += 2047; /* Stack bias */ + /* The frame address is %sp + STACK_BIAS in 64-bit mode. */ + new_cfa += STACK_BIAS; fpu_save = *(long *)(this_cfa + fpu_save_off); fs->regs.cfa_how = CFA_REG_OFFSET; fs->regs.cfa_reg = __builtin_dwarf_sp_column (); @@ -112,7 +116,16 @@ sparc64_frob_update_context (struct _Unwind_Context *context, && fs->regs.cfa_how == CFA_REG_OFFSET && fs->regs.cfa_offset != 0 && !fs->signal_frame) - context->cfa -= 2047; + { + long i; + + context->cfa -= STACK_BIAS; + + for (i = 0; i < DWARF_FRAME_REGISTERS + 1; ++i) + if (fs->regs.reg[i].how == REG_SAVED_OFFSET) + _Unwind_SetGRPtr (context, i, + _Unwind_GetGRPtr (context, i) - STACK_BIAS); + } } #else diff --git a/libgcc/config/sparc/sol2-ci.S b/libgcc/config/sparc/sol2-ci.S index 8825f79..a89cc20 100644 --- a/libgcc/config/sparc/sol2-ci.S +++ b/libgcc/config/sparc/sol2-ci.S @@ -1,6 +1,6 @@ ! crti.s for solaris 2.0. -! Copyright (C) 1992, 2008, 2009 Free Software Foundation, Inc. +! Copyright (C) 1992, 2008, 2009, 2011 Free Software Foundation, Inc. ! Written By David Vinayak Henkel-Wallace, June 1992 ! ! This file is free software; you can redistribute it and/or modify it @@ -35,11 +35,22 @@ .type _init,#function .align 4 _init: +#ifdef _FLAT +#ifdef __sparcv9 + stx %i7, [%sp+2167] + add %sp, -176, %sp +#else + st %i7, [%sp+60] + add %sp, -96, %sp +#endif + mov %o7, %i7 +#else #ifdef __sparcv9 save %sp, -176, %sp #else save %sp, -96, %sp #endif +#endif .section ".fini" @@ -48,8 +59,19 @@ _init: .type _fini,#function .align 4 _fini: +#ifdef _FLAT +#ifdef __sparcv9 + stx %i7, [%sp+2167] + add %sp, -176, %sp +#else + st %i7, [%sp+60] + add %sp, -96, %sp +#endif + mov %o7, %i7 +#else #ifdef __sparcv9 save %sp, -176, %sp #else save %sp, -96, %sp #endif +#endif diff --git a/libgcc/config/sparc/sol2-cn.S b/libgcc/config/sparc/sol2-cn.S index b92f3cf..08862a7 100644 --- a/libgcc/config/sparc/sol2-cn.S +++ b/libgcc/config/sparc/sol2-cn.S @@ -1,6 +1,6 @@ ! crtn.s for solaris 2.0. -! Copyright (C) 1992, 2008, 2009 Free Software Foundation, Inc. +! Copyright (C) 1992, 2008, 2009, 2011 Free Software Foundation, Inc. ! Written By David Vinayak Henkel-Wallace, June 1992 ! ! This file is free software; you can redistribute it and/or modify it @@ -28,14 +28,36 @@ .section ".init" .align 4 - - ret +#ifdef _FLAT + mov %i7, %o7 +#ifdef __sparcv9 + ldx [%sp+2343], %i7 + sub %sp, -176, %sp +#else + ld [%sp+156], %i7 + sub %sp, -96, %sp +#endif +#else restore +#endif + jmp %o7+8 + nop .section ".fini" .align 4 - - ret +#ifdef _FLAT + mov %i7, %o7 +#ifdef __sparcv9 + ldx [%sp+2343], %i7 + sub %sp, -176, %sp +#else + ld [%sp+156], %i7 + sub %sp, -96, %sp +#endif +#else restore +#endif + jmp %o7+8 + nop ! Th-th-th-that is all folks! diff --git a/libgcc/config/sparc/sol2-unwind.h b/libgcc/config/sparc/sol2-unwind.h index f8b9902..129405e 100644 --- a/libgcc/config/sparc/sol2-unwind.h +++ b/libgcc/config/sparc/sol2-unwind.h @@ -164,7 +164,16 @@ sparc64_frob_update_context (struct _Unwind_Context *context, && fs->regs.cfa_how == CFA_REG_OFFSET && fs->regs.cfa_offset != 0 && !fs->signal_frame) - context->cfa -= STACK_BIAS; + { + long i; + + context->cfa -= STACK_BIAS; + + for (i = 0; i < DWARF_FRAME_REGISTERS + 1; ++i) + if (fs->regs.reg[i].how == REG_SAVED_OFFSET) + _Unwind_SetGRPtr (context, i, + _Unwind_GetGRPtr (context, i) - STACK_BIAS); + } } #else |