Commit 0f0fd745 by Alan Modra Committed by Alan Modra

rs6000-common.c (TARGET_SUPPORTS_SPLIT_STACK): Define.

gcc/
	* common/config/rs6000/rs6000-common.c (TARGET_SUPPORTS_SPLIT_STACK):
	Define.
	(rs6000_supports_split_stack): New function.
	* gcc/config/rs6000/rs6000.c (machine_function): Add
	split_stack_arg_pointer.
	(TARGET_EXTRA_LIVE_ON_ENTRY, TARGET_INTERNAL_ARG_POINTER): Define.
	(setup_incoming_varargs): Use crtl->args.internal_arg_pointer
	rather than virtual_incoming_args_rtx.
	(rs6000_va_start): Likewise.
	(split_stack_arg_pointer_used_p): New function.
	(rs6000_emit_prologue): Set up arg pointer for -fsplit-stack.
	(morestack_ref): New var.
	(gen_add3_const, rs6000_expand_split_stack_prologue,
	rs6000_internal_arg_pointer, rs6000_live_on_entry,
	rs6000_split_stack_space_check): New functions.
	(rs6000_elf_file_end): Call file_end_indicate_split_stack.
	* gcc/config/rs6000/rs6000.md (UNSPEC_STACK_CHECK): Define.
	(UNSPECV_SPLIT_STACK_RETURN): Define.
	(split_stack_prologue, load_split_stack_limit,
	load_split_stack_limit_di, load_split_stack_limit_si,
	split_stack_return, split_stack_space_check): New expands and insns.
	* gcc/config/rs6000/rs6000-protos.h
	(rs6000_expand_split_stack_prologue): Declare.
	(rs6000_split_stack_space_check): Declare.
libgcc/
	* config/rs6000/morestack.S: New.
	* config/rs6000/t-stack-rs6000: New.
	* config.host (powerpc*-*-linux*): Add t-stack and t-stack-rs6000
	to tmake_file.
	* generic-morestack.c: Don't build for powerpc 32-bit.

From-SVN: r223426
parent 8a03f869
2015-05-20 Alan Modra <amodra@gmail.com>
* common/config/rs6000/rs6000-common.c (TARGET_SUPPORTS_SPLIT_STACK):
Define.
(rs6000_supports_split_stack): New function.
* gcc/config/rs6000/rs6000.c (machine_function): Add
split_stack_arg_pointer.
(TARGET_EXTRA_LIVE_ON_ENTRY, TARGET_INTERNAL_ARG_POINTER): Define.
(setup_incoming_varargs): Use crtl->args.internal_arg_pointer
rather than virtual_incoming_args_rtx.
(rs6000_va_start): Likewise.
(split_stack_arg_pointer_used_p): New function.
(rs6000_emit_prologue): Set up arg pointer for -fsplit-stack.
(morestack_ref): New var.
(gen_add3_const, rs6000_expand_split_stack_prologue,
rs6000_internal_arg_pointer, rs6000_live_on_entry,
rs6000_split_stack_space_check): New functions.
(rs6000_elf_file_end): Call file_end_indicate_split_stack.
* gcc/config/rs6000/rs6000.md (UNSPEC_STACK_CHECK): Define.
(UNSPECV_SPLIT_STACK_RETURN): Define.
(split_stack_prologue, load_split_stack_limit,
load_split_stack_limit_di, load_split_stack_limit_si,
split_stack_return, split_stack_space_check): New expands and insns.
* gcc/config/rs6000/rs6000-protos.h
(rs6000_expand_split_stack_prologue): Declare.
(rs6000_split_stack_space_check): Declare.
2015-05-20 Alan Modra <amodra@gmail.com>
* config/rs6000/rs6000.c (struct rs6000_stack): Correct comments.
(rs6000_stack_info): Don't zero offsets when not saving registers.
(debug_stack_info): Adjust to omit printing unused offsets,
......
......@@ -288,6 +288,31 @@ rs6000_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
return true;
}
/* -fsplit-stack uses a field in the TCB, available with glibc-2.19.
We also allow 2.18 because alignment padding guarantees that the
space is available there too. */
static bool
rs6000_supports_split_stack (bool report,
struct gcc_options *opts ATTRIBUTE_UNUSED)
{
#ifndef TARGET_GLIBC_MAJOR
#define TARGET_GLIBC_MAJOR 0
#endif
#ifndef TARGET_GLIBC_MINOR
#define TARGET_GLIBC_MINOR 0
#endif
/* Note: Can't test DEFAULT_ABI here, it isn't set until later. */
if (TARGET_GLIBC_MAJOR * 1000 + TARGET_GLIBC_MINOR >= 2018
&& TARGET_64BIT
&& TARGET_ELF)
return true;
if (report)
error ("%<-fsplit-stack%> currently only supported on PowerPC64 GNU/Linux with glibc-2.18 or later");
return false;
}
#undef TARGET_HANDLE_OPTION
#define TARGET_HANDLE_OPTION rs6000_handle_option
......@@ -300,4 +325,7 @@ rs6000_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
#undef TARGET_OPTION_OPTIMIZATION_TABLE
#define TARGET_OPTION_OPTIMIZATION_TABLE rs6000_option_optimization_table
#undef TARGET_SUPPORTS_SPLIT_STACK
#define TARGET_SUPPORTS_SPLIT_STACK rs6000_supports_split_stack
struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
......@@ -191,6 +191,8 @@ extern void rs6000_emit_prologue (void);
extern void rs6000_emit_load_toc_table (int);
extern unsigned int rs6000_dbx_register_number (unsigned int, unsigned int);
extern void rs6000_emit_epilogue (int);
extern void rs6000_expand_split_stack_prologue (void);
extern void rs6000_split_stack_space_check (rtx, rtx);
extern void rs6000_emit_eh_reg_restore (rtx, rtx);
extern const char * output_isel (rtx *);
extern void rs6000_call_aix (rtx, rtx, rtx, rtx);
......
......@@ -140,6 +140,7 @@
UNSPEC_PACK_128BIT
UNSPEC_LSQ
UNSPEC_FUSION_GPR
UNSPEC_STACK_CHECK
])
;;
......@@ -157,6 +158,7 @@
UNSPECV_NLGR ; non-local goto receiver
UNSPECV_MFFS ; Move from FPSCR
UNSPECV_MTFSF ; Move to FPSCR Fields
UNSPECV_SPLIT_STACK_RETURN ; A camouflaged return
])
......@@ -12345,6 +12347,72 @@
}"
[(set_attr "type" "load")])
;; Handle -fsplit-stack.
(define_expand "split_stack_prologue"
[(const_int 0)]
""
{
rs6000_expand_split_stack_prologue ();
DONE;
})
(define_expand "load_split_stack_limit"
[(set (match_operand 0)
(unspec [(const_int 0)] UNSPEC_STACK_CHECK))]
""
{
emit_insn (gen_rtx_SET (operands[0],
gen_rtx_UNSPEC (Pmode,
gen_rtvec (1, const0_rtx),
UNSPEC_STACK_CHECK)));
DONE;
})
(define_insn "load_split_stack_limit_di"
[(set (match_operand:DI 0 "gpc_reg_operand" "=r")
(unspec:DI [(const_int 0)] UNSPEC_STACK_CHECK))]
"TARGET_64BIT"
"ld %0,-0x7040(13)"
[(set_attr "type" "load")
(set_attr "update" "no")
(set_attr "indexed" "no")])
(define_insn "load_split_stack_limit_si"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r")
(unspec:SI [(const_int 0)] UNSPEC_STACK_CHECK))]
"!TARGET_64BIT"
"lwz %0,-0x7020(2)"
[(set_attr "type" "load")
(set_attr "update" "no")
(set_attr "indexed" "no")])
;; A return instruction which the middle-end doesn't see.
(define_insn "split_stack_return"
[(unspec_volatile [(const_int 0)] UNSPECV_SPLIT_STACK_RETURN)]
""
"blr"
[(set_attr "type" "jmpreg")])
;; If there are operand 0 bytes available on the stack, jump to
;; operand 1.
(define_expand "split_stack_space_check"
[(set (match_dup 2)
(unspec [(const_int 0)] UNSPEC_STACK_CHECK))
(set (match_dup 3)
(minus (reg STACK_POINTER_REGNUM)
(match_operand 0)))
(set (match_dup 4) (compare:CCUNS (match_dup 3) (match_dup 2)))
(set (pc) (if_then_else
(geu (match_dup 4) (const_int 0))
(label_ref (match_operand 1))
(pc)))]
""
{
rs6000_split_stack_space_check (operands[0], operands[1]);
DONE;
})
(define_insn "bpermd_<mode>"
[(set (match_operand:P 0 "gpc_reg_operand" "=r")
(unspec:P [(match_operand:P 1 "gpc_reg_operand" "r")
......
2015-05-20 Alan Modra <amodra@gmail.com>
* config/rs6000/morestack.S: New.
* config/rs6000/t-stack-rs6000: New.
* config.host (powerpc*-*-linux*): Add t-stack and t-stack-rs6000
to tmake_file.
* generic-morestack.c: Don't build for powerpc 32-bit.
2015-05-19 Eric Botcazou <ebotcazou@adacore.com>
* Makefile.in (LIBUNWIND): Move dependency for shared libgcc.
......
......@@ -1027,6 +1027,7 @@ powerpc-*-rtems*)
;;
powerpc*-*-linux*)
tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-savresfgpr rs6000/t-crtstuff rs6000/t-linux t-dfprules rs6000/t-ppc64-fp t-slibgcc-libgcc"
tmake_file="${tmake_file} t-stack rs6000/t-stack-rs6000"
case $ppc_fp_type in
64)
;;
......
# Makefile fragment to support -fsplit-stack for powerpc.
LIB2ADD_ST += $(srcdir)/config/rs6000/morestack.S
......@@ -23,6 +23,9 @@ a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* powerpc 32-bit not supported. */
#if !defined __powerpc__ || defined __powerpc64__
#include "tconfig.h"
#include "tsystem.h"
#include "coretypes.h"
......@@ -935,6 +938,7 @@ __splitstack_find (void *segment_arg, void *sp, size_t *len,
nsp -= 12 * sizeof (void *);
#elif defined (__i386__)
nsp -= 6 * sizeof (void *);
#elif defined __powerpc64__
#else
#error "unrecognized target"
#endif
......@@ -1170,3 +1174,4 @@ __splitstack_find_context (void *context[NUMBER_OFFSETS], size_t *stack_size,
}
#endif /* !defined (inhibit_libc) */
#endif /* not powerpc 32-bit */
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