aboutsummaryrefslogtreecommitdiff
path: root/libgcc/config/sparc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2011-06-10 10:50:20 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-06-10 10:50:20 +0000
commitb11b09048dcd08782578c7c34456e51aa408b1a9 (patch)
tree137aaf52d3f6ac1954c79cc1adf4a87dac699295 /libgcc/config/sparc
parentf5c01f5bde72d697dc28a9d9e31e9dfa2209f081 (diff)
downloadgcc-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.h17
-rw-r--r--libgcc/config/sparc/sol2-ci.S24
-rw-r--r--libgcc/config/sparc/sol2-cn.S32
-rw-r--r--libgcc/config/sparc/sol2-unwind.h11
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