Commit 7c800926 by Kai Tietz Committed by Kai Tietz

tm.texi (OVERRIDE_ABI_FORMAT): New.

2008-06-03  Kai Tietz  <kai.tietz@onevision.com>

	* doc/tm.texi (OVERRIDE_ABI_FORMAT): New.
	* doc/extend.texi (ms_abi,sysv_abi): New attribute description.
	* function.c (allocate_struct_function): Use of
	OVERRIDE_ABI_FORMAT.
	* config/i386/cygming.h (TARGET_64BIT_MS_ABI): Make use
	of cfun and DEFAULT_ABI to deceide abi mode.
	(DEFAULT_ABI): New.
	(REG_PARM_STACK_SPACE): Removed.
	(OUTGOING_REG_PARM_STACK_SPACE): Removed.
	(STACK_BOUNDARY): Use default target to deceide stack boundary.
	* config/i386/i386-protos.h (ix86_cfun_abi): New.
	(ix86_function_abi): Likewise.
	(ix86_function_type_abi): Likewise.
	(ix86_call_abi_override): Likewise.
	* confid/i386/i386.md (SSE_REGPARM_MAX): Replaced by abi
	specific define X86_64_SSE_REGPARM_MAX/X64_SSE_REGPARM_MAX.
	* config/i386/i386.c (override_options): Replace TARGET_64BIT_MS_ABI.
	(X86_64_VARARGS_SIZE): Replace REGPARM_MAX and SSE_REGPARM_MAX by abi
	specific defines.
	(X86_64_REGPARM_MAX): New.
	(X86_64_SSE_REGPARM_MAX): New.
	(X64_REGPARM_MAX): New.
	(X64_SSE_REGPARM_MAX): New.
	(X86_32_REGPARM_MAX): New.
	(X86_32_SSE_REGPARM_MAX): New.
	(ix86_handle_cconv_attribute): Replace TARGET_64BIT_MS_ABI.
	(ix86_function_regparm): Handle user calling abi.
	(ix86_function_arg_regno_p): Replace TARGET_64BIT_MS_ABI
	by DEFAULT_ABI versus SYSV_ABI check.
	(ix86_reg_parm_stack_space): New.
	(ix86_function_type_abi): New.
	(ix86_call_abi_override): New.
	(ix86_function_abi): New.
	(ix86_cfun_abi): New.
	(init_cumulative_args): Call abi specific initialization.
	(function_arg_advance): Remove TARGET_64BIT_MS_ABI.
	(function_arg_64): Extend SSE_REGPARM_MAX check.
	(function_arg (): Remove TARGET_64BIT_MS_ABI.
	(ix86_pass_by_reference): Likewise.
	(ix86_function_value_regno_p): Likewise.
	(function_value_64): Replace REGPARM_MAX, and SSE_REGPARM_MAX.
	(ix86_function_value_1): Replace TARGET_64BIT_MS_ABI.
	(return_in_memory_ms_64): Replace TARGET_64BIT_MS_ABI.
	(ix86_build_builtin_va_list): Replace TARGET_64BIT_MS_ABI.
	(setup_incoming_varargs_64): Adjust regparm for call abi.
	(ix86_setup_incoming_varargs): Replace TARGET_64BIT_MS_ABI.
	(ix86_va_start): Likewise.
	(ix86_gimplify_va_arg): Likewise.
	(ix86_expand_prologue): Likewise.
	(output_pic_addr_const): Likewise.
	(ix86_init_machine_status): Initialize call_abi by DEFAULT_ABI.
	(x86_this_parameter): Replace TARGET_64BIT_MS_ABI.
	(x86_output_mi_thunk): Likewise.
	(x86_function_profiler): Likewise.
	* config/i386/i386.h (TARGET_64BIT_MS_ABI): Use ix64_cfun_abi.
	(SYSV_ABI, MS_ABI): New constants.
	(DEFAULT_ABI): New.
	(init_regs): Add prototype of function in regclass.c file.
	(OVERRIDE_ABI_FORMAT): New.
	(CONDITIONAL_REGISTER_USAGE): Remove TARGET_64BIT_MS_ABI part.
	(REG_PARM_STACK_SPACE): Use ix86_reg_parm_stack_space.
	(OUTGOING_REG_PARM_STACK_SPACE): New.
	(ix86_reg_parm_stack_space): New prototype.
	(CUMULATIVE_ARGS): Add call_abi member.
	(machine_function): Add call_abi member.
	* config/i386/mingw32.h (EXTRA_OS_CPP_BUILTINS): Replace TARGET_64BIT_MS_ABI
	by DEFAULT_ABI compare to MS_ABI.

From-SVN: r136311
parent 19df69a0
2008-06-03 Kai Tietz <kai.tietz@onevision.com>
* doc/tm.texi (OVERRIDE_ABI_FORMAT): New.
* doc/extend.texi (ms_abi,sysv_abi): New attribute description.
* function.c (allocate_struct_function): Use of
OVERRIDE_ABI_FORMAT.
* config/i386/cygming.h (TARGET_64BIT_MS_ABI): Make use
of cfun and DEFAULT_ABI to deceide abi mode.
(DEFAULT_ABI): New.
(REG_PARM_STACK_SPACE): Removed.
(OUTGOING_REG_PARM_STACK_SPACE): Removed.
(STACK_BOUNDARY): Use default target to deceide stack boundary.
* config/i386/i386-protos.h (ix86_cfun_abi): New.
(ix86_function_abi): Likewise.
(ix86_function_type_abi): Likewise.
(ix86_call_abi_override): Likewise.
* confid/i386/i386.md (SSE_REGPARM_MAX): Replaced by abi
specific define X86_64_SSE_REGPARM_MAX/X64_SSE_REGPARM_MAX.
* config/i386/i386.c (override_options): Replace TARGET_64BIT_MS_ABI.
(X86_64_VARARGS_SIZE): Replace REGPARM_MAX and SSE_REGPARM_MAX by abi
specific defines.
(X86_64_REGPARM_MAX): New.
(X86_64_SSE_REGPARM_MAX): New.
(X64_REGPARM_MAX): New.
(X64_SSE_REGPARM_MAX): New.
(X86_32_REGPARM_MAX): New.
(X86_32_SSE_REGPARM_MAX): New.
(ix86_handle_cconv_attribute): Replace TARGET_64BIT_MS_ABI.
(ix86_function_regparm): Handle user calling abi.
(ix86_function_arg_regno_p): Replace TARGET_64BIT_MS_ABI
by DEFAULT_ABI versus SYSV_ABI check.
(ix86_reg_parm_stack_space): New.
(ix86_function_type_abi): New.
(ix86_call_abi_override): New.
(ix86_function_abi): New.
(ix86_cfun_abi): New.
(init_cumulative_args): Call abi specific initialization.
(function_arg_advance): Remove TARGET_64BIT_MS_ABI.
(function_arg_64): Extend SSE_REGPARM_MAX check.
(function_arg (): Remove TARGET_64BIT_MS_ABI.
(ix86_pass_by_reference): Likewise.
(ix86_function_value_regno_p): Likewise.
(function_value_64): Replace REGPARM_MAX, and SSE_REGPARM_MAX.
(ix86_function_value_1): Replace TARGET_64BIT_MS_ABI.
(return_in_memory_ms_64): Replace TARGET_64BIT_MS_ABI.
(ix86_build_builtin_va_list): Replace TARGET_64BIT_MS_ABI.
(setup_incoming_varargs_64): Adjust regparm for call abi.
(ix86_setup_incoming_varargs): Replace TARGET_64BIT_MS_ABI.
(ix86_va_start): Likewise.
(ix86_gimplify_va_arg): Likewise.
(ix86_expand_prologue): Likewise.
(output_pic_addr_const): Likewise.
(ix86_init_machine_status): Initialize call_abi by DEFAULT_ABI.
(x86_this_parameter): Replace TARGET_64BIT_MS_ABI.
(x86_output_mi_thunk): Likewise.
(x86_function_profiler): Likewise.
* config/i386/i386.h (TARGET_64BIT_MS_ABI): Use ix64_cfun_abi.
(SYSV_ABI, MS_ABI): New constants.
(DEFAULT_ABI): New.
(init_regs): Add prototype of function in regclass.c file.
(OVERRIDE_ABI_FORMAT): New.
(CONDITIONAL_REGISTER_USAGE): Remove TARGET_64BIT_MS_ABI part.
(REG_PARM_STACK_SPACE): Use ix86_reg_parm_stack_space.
(OUTGOING_REG_PARM_STACK_SPACE): New.
(ix86_reg_parm_stack_space): New prototype.
(CUMULATIVE_ARGS): Add call_abi member.
(machine_function): Add call_abi member.
* config/i386/mingw32.h (EXTRA_OS_CPP_BUILTINS): Replace TARGET_64BIT_MS_ABI
by DEFAULT_ABI compare to MS_ABI.
2008-06-02 Andy Hutchinson <hutchinsonandy@aim.com>
PR target/34879
......
......@@ -34,7 +34,10 @@ along with GCC; see the file COPYING3. If not see
#endif
#undef TARGET_64BIT_MS_ABI
#define TARGET_64BIT_MS_ABI TARGET_64BIT
#define TARGET_64BIT_MS_ABI (!cfun ? DEFAULT_ABI == MS_ABI : TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
#undef DEFAULT_ABI
#define DEFAULT_ABI (TARGET_64BIT ? MS_ABI : SYSV_ABI)
#undef DBX_REGISTER_NUMBER
#define DBX_REGISTER_NUMBER(n) \
......@@ -123,18 +126,6 @@ along with GCC; see the file COPYING3. If not see
#undef LONG_TYPE_SIZE
#define LONG_TYPE_SIZE 32
#undef REG_PARM_STACK_SPACE
#define REG_PARM_STACK_SPACE(FNDECL) (TARGET_64BIT_MS_ABI ? 32 : 0)
#undef OUTGOING_REG_PARM_STACK_SPACE
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) (TARGET_64BIT_MS_ABI ? 1 : 0)
#undef REGPARM_MAX
#define REGPARM_MAX (TARGET_64BIT_MS_ABI ? 4 : 3)
#undef SSE_REGPARM_MAX
#define SSE_REGPARM_MAX (TARGET_64BIT_MS_ABI ? 4 : TARGET_SSE ? 3 : 0)
/* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop). */
#define HANDLE_PRAGMA_PACK_PUSH_POP 1
/* Enable push_macro & pop_macro */
......@@ -214,7 +205,7 @@ do { \
#define CHECK_STACK_LIMIT 4000
#undef STACK_BOUNDARY
#define STACK_BOUNDARY (TARGET_64BIT_MS_ABI ? 128 : BITS_PER_WORD)
#define STACK_BOUNDARY (DEFAULT_ABI == MS_ABI ? 128 : BITS_PER_WORD)
/* By default, target has a 80387, uses IEEE compatible arithmetic,
returns float values in the 387 and needs stack probes.
......
......@@ -137,6 +137,11 @@ extern int ix86_function_arg_boundary (enum machine_mode, tree);
extern bool ix86_sol10_return_in_memory (const_tree,const_tree);
extern rtx ix86_force_to_memory (enum machine_mode, rtx);
extern void ix86_free_from_memory (enum machine_mode);
extern int ix86_cfun_abi (void);
extern int ix86_function_abi (const_tree);
extern int ix86_function_type_abi (const_tree);
extern void ix86_call_abi_override (const_tree);
extern void ix86_split_fp_branch (enum rtx_code code, rtx, rtx,
rtx, rtx, rtx, rtx);
extern bool ix86_hard_regno_mode_ok (int, enum machine_mode);
......
......@@ -446,7 +446,17 @@ extern tree x86_mfence;
#define TARGET_MACHO 0
/* Likewise, for the Windows 64-bit ABI. */
#define TARGET_64BIT_MS_ABI 0
#define TARGET_64BIT_MS_ABI (TARGET_64BIT && ix86_cfun_abi () == MS_ABI)
/* Available call abi. */
enum
{
SYSV_ABI = 0,
MS_ABI = 1
};
/* The default abi form used by target. */
#define DEFAULT_ABI SYSV_ABI
/* Subtargets may reset this to 1 in order to enable 96-bit long double
with the rounding mode forced to 53 bits. */
......@@ -804,7 +814,8 @@ enum target_cpu_default
#define PARM_BOUNDARY BITS_PER_WORD
/* Boundary (in *bits*) on which stack pointer should be aligned. */
#define STACK_BOUNDARY BITS_PER_WORD
#define STACK_BOUNDARY (TARGET_64BIT && DEFAULT_ABI == MS_ABI ? 128 \
: BITS_PER_WORD)
/* Boundary (in *bits*) on which the stack pointer prefers to be
aligned; the compiler cannot rely on having this alignment. */
......@@ -1044,6 +1055,8 @@ enum target_cpu_default
#define ORDER_REGS_FOR_LOCAL_ALLOC x86_order_regs_for_local_alloc ()
#define OVERRIDE_ABI_FORMAT(FNDECL) ix86_call_abi_override (FNDECL)
/* Macro to conditionally modify fixed_regs/call_used_regs. */
#define CONDITIONAL_REGISTER_USAGE \
do { \
......@@ -1094,7 +1107,7 @@ do { \
for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++) \
reg_names[i] = ""; \
} \
if (TARGET_64BIT_MS_ABI) \
if (TARGET_64BIT && DEFAULT_ABI == MS_ABI) \
{ \
call_used_regs[4 /*RSI*/] = 0; \
call_used_regs[5 /*RDI*/] = 0; \
......@@ -1624,7 +1637,11 @@ enum reg_class
This space can be allocated by the caller, or be a part of the
machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says
which. */
#define REG_PARM_STACK_SPACE(FNDECL) 0
#define REG_PARM_STACK_SPACE(FNDECL) ix86_reg_parm_stack_space (FNDECL)
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) (ix86_function_type_abi (FNTYPE) == MS_ABI ? 1 : 0)
extern unsigned int ix86_reg_parm_stack_space (const_tree);
/* Value is the number of bytes of arguments automatically
popped when returning from a subroutine call.
......@@ -1686,6 +1703,8 @@ typedef struct ix86_args {
int maybe_vaarg; /* true for calls to possibly vardic fncts. */
int float_in_sse; /* 1 if in 32-bit mode SFmode (2 for DFmode) should
be passed in SSE registers. Otherwise 0. */
int call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise
MS_ABI for ms abi. */
} CUMULATIVE_ARGS;
/* Initialize a variable CUM of type CUMULATIVE_ARGS
......@@ -1953,9 +1972,22 @@ do { \
is also used as the pic register in ELF. So for now, don't allow more than
3 registers to be passed in registers. */
#define REGPARM_MAX (TARGET_64BIT ? 6 : 3)
/* Abi specific values for REGPARM_MAX and SSE_REGPARM_MAX */
#define X86_64_REGPARM_MAX 6
#define X64_REGPARM_MAX 4
#define X86_32_REGPARM_MAX 3
#define X86_64_SSE_REGPARM_MAX 8
#define X64_SSE_REGPARM_MAX 4
#define X86_32_SSE_REGPARM_MAX (TARGET_SSE ? 3 : 0)
#define REGPARM_MAX (TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X64_REGPARM_MAX \
: X86_64_REGPARM_MAX) \
: X86_32_REGPARM_MAX)
#define SSE_REGPARM_MAX (TARGET_64BIT ? 8 : (TARGET_SSE ? 3 : 0))
#define SSE_REGPARM_MAX (TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X64_SSE_REGPARM_MAX \
: X86_64_SSE_REGPARM_MAX) \
: X86_32_SSE_REGPARM_MAX)
#define MMX_REGPARM_MAX (TARGET_64BIT ? 0 : (TARGET_MMX ? 3 : 0))
......@@ -2464,6 +2496,9 @@ struct machine_function GTY(())
ix86_current_function_calls_tls_descriptor macro for a better
approximation. */
int tls_descriptor_call_expanded_p;
/* This value is used for amd64 targets and specifies the current abi
to be used. MS_ABI means ms abi. Otherwise SYSV_ABI means sysv abi. */
int call_abi;
};
#define ix86_stack_locals (cfun->machine->stack_locals)
......
......@@ -14708,7 +14708,10 @@
ix86_expand_call ((TARGET_FLOAT_RETURNS_IN_80387
? gen_rtx_REG (XCmode, FIRST_FLOAT_REG) : NULL),
operands[0], const0_rtx, GEN_INT (SSE_REGPARM_MAX - 1),
operands[0], const0_rtx,
GEN_INT ((DEFAULT_ABI == SYSV_ABI ? X86_64_SSE_REGPARM_MAX
: X64_SSE_REGPARM_MAX)
- 1),
NULL, 0);
for (i = 0; i < XVECLEN (operands[2], 0); i++)
......@@ -20846,14 +20849,14 @@
(use (match_operand:DI 2 "const_int_operand" "i"))
(use (label_ref:DI (match_operand 3 "" "X")))]
"TARGET_64BIT
&& INTVAL (operands[4]) + SSE_REGPARM_MAX * 16 - 16 < 128
&& INTVAL (operands[4]) + X86_64_SSE_REGPARM_MAX * 16 - 16 < 128
&& INTVAL (operands[4]) + INTVAL (operands[2]) * 16 >= -128"
{
int i;
operands[0] = gen_rtx_MEM (Pmode,
gen_rtx_PLUS (Pmode, operands[0], operands[4]));
output_asm_insn ("jmp\t%A1", operands);
for (i = SSE_REGPARM_MAX - 1; i >= INTVAL (operands[2]); i--)
for (i = X86_64_SSE_REGPARM_MAX - 1; i >= INTVAL (operands[2]); i--)
{
operands[4] = adjust_address (operands[0], DImode, i*16);
operands[5] = gen_rtx_REG (TImode, SSE_REGNO (i));
......
......@@ -38,7 +38,7 @@ along with GCC; see the file COPYING3. If not see
builtin_define_std ("WINNT"); \
builtin_define_with_int_value ("_INTEGRAL_MAX_BITS", \
TYPE_PRECISION (intmax_type_node));\
if (TARGET_64BIT_MS_ABI) \
if (TARGET_64BIT && DEFAULT_ABI == MS_ABI) \
{ \
builtin_define ("__MINGW64__"); \
builtin_define_std ("WIN64"); \
......
......@@ -2508,6 +2508,19 @@ instruction). Caveat: such addressing is by definition not position
independent and hence this attribute must not be used for objects
defined by shared libraries.
@item ms_abi/sysv_abi
@cindex @code[ms_abi} attribute
@cindex @code{sysv_abi} attribute
On 64-bit x86_65-*-* targets, you can use an ABI attribute to indicate
which calling convention should be used for a function. The @code{ms_abi}
attribute tells the compiler to use the Microsoft ABI, while the
@code{sysv_abi} attribute tells the compiler to use the ABI used on
GNU/Linux and other systems. The default is to use the Microsoft ABI
when targeting Windows. On all other systems, the default is the AMD ABI.
Note, This feature is currently sorried out for Windows targets trying to
@item naked
@cindex function without a prologue/epilogue code
Use this attribute on the ARM, AVR, IP2K and SPU ports to indicate that
......
......@@ -4055,6 +4055,15 @@ arguments are passed on the stack, there is no need to store anything in
should not be empty, so use @code{int}.
@end defmac
@defmac OVERRIDE_ABI_FORMAT (@var{fndecl})
If defined, this macro is called before generating any code for a
function, but after the @var{cfun} descriptor for the function has been
created. The back end may use this macro to update @var{cfun} to
reflect an ABI other than that which would normally be used by default.
If the compiler is generating code for a compiler-generated function,
@var{fndecl} may be @code{NULL}.
@end defmac
@defmac INIT_CUMULATIVE_ARGS (@var{cum}, @var{fntype}, @var{libname}, @var{fndecl}, @var{n_named_args})
A C statement (sans semicolon) for initializing the variable
@var{cum} for the state at the beginning of the argument list. The
......
......@@ -3852,6 +3852,10 @@ allocate_struct_function (tree fndecl, bool abstract_p)
if (init_machine_status)
cfun->machine = (*init_machine_status) ();
#ifdef OVERRIDE_ABI_FORMAT
OVERRIDE_ABI_FORMAT (fndecl);
#endif
if (fndecl != NULL_TREE)
{
DECL_STRUCT_FUNCTION (fndecl) = cfun;
......
......@@ -545,9 +545,7 @@
#define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_false
#define TARGET_STRUCT_VALUE_RTX hook_rtx_tree_int_null
#ifndef TARGET_RETURN_IN_MEMORY
#define TARGET_RETURN_IN_MEMORY default_return_in_memory
#endif
#define TARGET_RETURN_IN_MSB hook_bool_const_tree_false
#define TARGET_EXPAND_BUILTIN_SAVEREGS default_expand_builtin_saveregs
......
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