re PR target/39472 (Add -mabi=[ms|sysv])

gcc/

2009-03-27  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/39472
	* config/i386/i386.c (ix86_abi): New.
	(override_options): Handle -mabi=.
	(ix86_function_arg_regno_p): Replace DEFAULT_ABI with
	ix86_abi.
	(ix86_call_abi_override): Likewise.
	(init_cumulative_args): Likewise.
	(function_arg_advance): Likewise.
	(function_arg_64): Likewise.
	(function_arg): Likewise.
	(ix86_pass_by_reference): Likewise.
	(ix86_function_value_regno_p): Likewise.
	(ix86_build_builtin_va_list_abi): Likewise.
	(setup_incoming_varargs_64): Likewise.
	(is_va_list_char_pointer): Likewise.
	(ix86_init_machine_status): Likewise.
	(ix86_reg_parm_stack_space): Use enum calling_abi on
	call_abi.
	(ix86_function_type_abi): Return enum calling_abi.  Rewrite
	for 64bit.  Replace DEFAULT_ABI with ix86_abi.
	(ix86_function_abi): Make it static and return enum
	calling_abi.
	(ix86_cfun_abi): Return enum calling_abi.  Replace DEFAULT_ABI
	with ix86_abi.
	(ix86_fn_abi_va_list): Updated.

	* config/i386/i386.h (ix86_abi): New.
	(STACK_BOUNDARY): Replace DEFAULT_ABI with ix86_abi.
	(CONDITIONAL_REGISTER_USAGE): Likewise.
	(CUMULATIVE_ARGS): Change call_abi type to enum calling_abi.
	(machine_function): Likewise.

	* config/i386/i386.md (untyped_call): Replace DEFAULT_ABI
	with ix86_abi.
	* config/i386/cygming.h (TARGET_64BIT_MS_ABI): Likewise.
	(STACK_BOUNDARY): Likewise.
	* config/i386/mingw32.h (EXTRA_OS_CPP_BUILTINS): Likewise.

	* config/i386/i386.opt (mabi=): New.

	* config/i386/i386-protos.h (ix86_cfun_abi): Changed to
	return enum calling_abi.
	(ix86_function_type_abi): Likewise.
	(ix86_function_abi): Removed.

	* doc/invoke.texi: Document -mabi= option for x86.

gcc/testsuite/

2009-03-27  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/39472
	* gcc.target/x86_64/abi/callabi/func-2a.c: New.
	* gcc.target/x86_64/abi/callabi/func-2b.c: Likewise.
	* gcc.target/x86_64/abi/callabi/func-indirect-2a.c: Likewise.
	* gcc.target/x86_64/abi/callabi/func-indirect-2b.c: Likewise.
	* gcc.target/x86_64/abi/callabi/vaarg-4a.c: Likewise.
	* gcc.target/x86_64/abi/callabi/vaarg-4b.c: Likewise.
	* gcc.target/x86_64/abi/callabi/vaarg-5a.c: Likewise.
	* gcc.target/x86_64/abi/callabi/vaarg-5b.c: Likewise.

From-SVN: r145133
This commit is contained in:
H.J. Lu 2009-03-27 22:22:30 +00:00 committed by H.J. Lu
parent 9027c95aba
commit 51212b321b
18 changed files with 334 additions and 51 deletions

View File

@ -1,3 +1,52 @@
2009-03-27 H.J. Lu <hongjiu.lu@intel.com>
PR target/39472
* config/i386/i386.c (ix86_abi): New.
(override_options): Handle -mabi=.
(ix86_function_arg_regno_p): Replace DEFAULT_ABI with
ix86_abi.
(ix86_call_abi_override): Likewise.
(init_cumulative_args): Likewise.
(function_arg_advance): Likewise.
(function_arg_64): Likewise.
(function_arg): Likewise.
(ix86_pass_by_reference): Likewise.
(ix86_function_value_regno_p): Likewise.
(ix86_build_builtin_va_list_abi): Likewise.
(setup_incoming_varargs_64): Likewise.
(is_va_list_char_pointer): Likewise.
(ix86_init_machine_status): Likewise.
(ix86_reg_parm_stack_space): Use enum calling_abi on
call_abi.
(ix86_function_type_abi): Return enum calling_abi. Rewrite
for 64bit. Replace DEFAULT_ABI with ix86_abi.
(ix86_function_abi): Make it static and return enum
calling_abi.
(ix86_cfun_abi): Return enum calling_abi. Replace DEFAULT_ABI
with ix86_abi.
(ix86_fn_abi_va_list): Updated.
* config/i386/i386.h (ix86_abi): New.
(STACK_BOUNDARY): Replace DEFAULT_ABI with ix86_abi.
(CONDITIONAL_REGISTER_USAGE): Likewise.
(CUMULATIVE_ARGS): Change call_abi type to enum calling_abi.
(machine_function): Likewise.
* config/i386/i386.md (untyped_call): Replace DEFAULT_ABI
with ix86_abi.
* config/i386/cygming.h (TARGET_64BIT_MS_ABI): Likewise.
(STACK_BOUNDARY): Likewise.
* config/i386/mingw32.h (EXTRA_OS_CPP_BUILTINS): Likewise.
* config/i386/i386.opt (mabi=): New.
* config/i386/i386-protos.h (ix86_cfun_abi): Changed to
return enum calling_abi.
(ix86_function_type_abi): Likewise.
(ix86_function_abi): Removed.
* doc/invoke.texi: Document -mabi= option for x86.
2009-03-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.c (real_dconstp): Delete.

View File

@ -34,7 +34,7 @@ along with GCC; see the file COPYING3. If not see
#endif
#undef TARGET_64BIT_MS_ABI
#define TARGET_64BIT_MS_ABI (!cfun ? DEFAULT_ABI == MS_ABI : TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
#define TARGET_64BIT_MS_ABI (!cfun ? ix86_abi == MS_ABI : TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
#undef DEFAULT_ABI
#define DEFAULT_ABI (TARGET_64BIT ? MS_ABI : SYSV_ABI)
@ -202,7 +202,7 @@ do { \
#define CHECK_STACK_LIMIT 4000
#undef STACK_BOUNDARY
#define STACK_BOUNDARY (DEFAULT_ABI == MS_ABI ? 128 : BITS_PER_WORD)
#define STACK_BOUNDARY (ix86_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.

View File

@ -139,9 +139,8 @@ 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 enum calling_abi ix86_cfun_abi (void);
extern enum calling_abi ix86_function_type_abi (const_tree);
extern void ix86_call_abi_override (const_tree);
extern tree ix86_fn_abi_va_list (tree);
extern tree ix86_canonical_va_list_type (tree);

View File

@ -1743,6 +1743,9 @@ static unsigned int ix86_default_incoming_stack_boundary;
/* Alignment for incoming stack boundary in bits. */
unsigned int ix86_incoming_stack_boundary;
/* The abi used by target. */
enum calling_abi ix86_abi = DEFAULT_ABI;
/* Values 1-5: see jump.c */
int ix86_branch_cost;
@ -1819,6 +1822,8 @@ static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
static bool ix86_can_inline_p (tree, tree);
static void ix86_set_current_function (tree);
static enum calling_abi ix86_function_abi (const_tree);
/* The svr4 ABI for the i386 says that records and unions are returned
in memory. */
@ -2716,6 +2721,18 @@ override_options (bool main_args_p)
error ("bad value (%s) for %sarch=%s %s",
ix86_arch_string, prefix, suffix, sw);
/* Validate -mabi= value. */
if (ix86_abi_string)
{
if (strcmp (ix86_abi_string, "sysv") == 0)
ix86_abi = SYSV_ABI;
else if (strcmp (ix86_abi_string, "ms") == 0)
ix86_abi = MS_ABI;
else
error ("unknown ABI (%s) for %sabi=%s %s",
ix86_abi_string, prefix, suffix, sw);
}
if (ix86_cmodel_string != 0)
{
if (!strcmp (ix86_cmodel_string, "small"))
@ -4515,14 +4532,14 @@ ix86_function_arg_regno_p (int regno)
default ABI. */
/* RAX is used as hidden argument to va_arg functions. */
if (DEFAULT_ABI == SYSV_ABI && regno == AX_REG)
if (ix86_abi == SYSV_ABI && regno == AX_REG)
return true;
if (DEFAULT_ABI == MS_ABI)
if (ix86_abi == MS_ABI)
parm_regs = x86_64_ms_abi_int_parameter_registers;
else
parm_regs = x86_64_int_parameter_registers;
for (i = 0; i < (DEFAULT_ABI == MS_ABI ? X64_REGPARM_MAX
for (i = 0; i < (ix86_abi == MS_ABI ? X64_REGPARM_MAX
: X86_64_REGPARM_MAX); i++)
if (regno == parm_regs[i])
return true;
@ -4550,7 +4567,7 @@ ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
int
ix86_reg_parm_stack_space (const_tree fndecl)
{
int call_abi = SYSV_ABI;
enum calling_abi call_abi = SYSV_ABI;
if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
call_abi = ix86_function_abi (fndecl);
else
@ -4562,37 +4579,39 @@ ix86_reg_parm_stack_space (const_tree fndecl)
/* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
call abi used. */
int
enum calling_abi
ix86_function_type_abi (const_tree fntype)
{
if (TARGET_64BIT && fntype != NULL)
{
int abi;
if (DEFAULT_ABI == SYSV_ABI)
abi = lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)) ? MS_ABI : SYSV_ABI;
else
abi = lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)) ? SYSV_ABI : MS_ABI;
enum calling_abi abi = ix86_abi;
if (abi == SYSV_ABI)
{
if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
abi = MS_ABI;
}
else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
abi = SYSV_ABI;
return abi;
}
return DEFAULT_ABI;
return ix86_abi;
}
int
static enum calling_abi
ix86_function_abi (const_tree fndecl)
{
if (! fndecl)
return DEFAULT_ABI;
return ix86_abi;
return ix86_function_type_abi (TREE_TYPE (fndecl));
}
/* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
call abi used. */
int
enum calling_abi
ix86_cfun_abi (void)
{
if (! cfun || ! TARGET_64BIT)
return DEFAULT_ABI;
return ix86_abi;
return cfun->machine->call_abi;
}
@ -4606,7 +4625,7 @@ void
ix86_call_abi_override (const_tree fndecl)
{
if (fndecl == NULL_TREE)
cfun->machine->call_abi = DEFAULT_ABI;
cfun->machine->call_abi = ix86_abi;
else
cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
}
@ -4646,8 +4665,8 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, /* Argument info to initialize */
cum->nregs = ix86_regparm;
if (TARGET_64BIT)
{
if (cum->call_abi != DEFAULT_ABI)
cum->nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX
if (cum->call_abi != ix86_abi)
cum->nregs = ix86_abi != SYSV_ABI ? X86_64_REGPARM_MAX
: X64_REGPARM_MAX;
}
if (TARGET_SSE)
@ -4655,8 +4674,8 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, /* Argument info to initialize */
cum->sse_nregs = SSE_REGPARM_MAX;
if (TARGET_64BIT)
{
if (cum->call_abi != DEFAULT_ABI)
cum->sse_nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
if (cum->call_abi != ix86_abi)
cum->sse_nregs = ix86_abi != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
: X64_SSE_REGPARM_MAX;
}
}
@ -5582,7 +5601,7 @@ function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
if (type)
mode = type_natural_mode (type, NULL);
if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
function_arg_advance_ms_64 (cum, bytes, words);
else if (TARGET_64BIT)
function_arg_advance_64 (cum, mode, type, words, named);
@ -5728,9 +5747,9 @@ function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
if (mode == VOIDmode)
return GEN_INT (cum->maybe_vaarg
? (cum->sse_nregs < 0
? (cum->call_abi == DEFAULT_ABI
? (cum->call_abi == ix86_abi
? SSE_REGPARM_MAX
: (DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
: (ix86_abi != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
: X64_SSE_REGPARM_MAX))
: cum->sse_regno)
: -1);
@ -5824,7 +5843,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
if (type && TREE_CODE (type) == VECTOR_TYPE)
mode = type_natural_mode (type, cum);
if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
return function_arg_ms_64 (cum, mode, omode, named, bytes);
else if (TARGET_64BIT)
return function_arg_64 (cum, mode, omode, type, named);
@ -5844,7 +5863,7 @@ ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
const_tree type, bool named ATTRIBUTE_UNUSED)
{
/* See Windows x64 Software Convention. */
if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
{
int msize = (int) GET_MODE_SIZE (mode);
if (type)
@ -5984,7 +6003,7 @@ ix86_function_value_regno_p (int regno)
/* TODO: The function should depend on current function ABI but
builtins.c would need updating then. Therefore we use the
default ABI. */
if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
if (TARGET_64BIT && ix86_abi == MS_ABI)
return false;
return TARGET_FLOAT_RETURNS_IN_80387;
@ -6380,13 +6399,13 @@ ix86_build_builtin_va_list_abi (enum calling_abi abi)
static tree
ix86_build_builtin_va_list (void)
{
tree ret = ix86_build_builtin_va_list_abi (DEFAULT_ABI);
tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
/* Initialize abi specific va_list builtin types. */
if (TARGET_64BIT)
{
tree t;
if (DEFAULT_ABI == MS_ABI)
if (ix86_abi == MS_ABI)
{
t = ix86_build_builtin_va_list_abi (SYSV_ABI);
if (TREE_CODE (t) != RECORD_TYPE)
@ -6400,7 +6419,7 @@ ix86_build_builtin_va_list (void)
t = build_variant_type_copy (t);
sysv_va_list_type_node = t;
}
if (DEFAULT_ABI != MS_ABI)
if (ix86_abi != MS_ABI)
{
t = ix86_build_builtin_va_list_abi (MS_ABI);
if (TREE_CODE (t) != RECORD_TYPE)
@ -6433,8 +6452,8 @@ setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
int i;
int regparm = ix86_regparm;
if (cum->call_abi != DEFAULT_ABI)
regparm = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
if (cum->call_abi != ix86_abi)
regparm = ix86_abi != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
/* GPR size of varargs save area. */
if (cfun->va_list_gpr_size)
@ -6587,7 +6606,7 @@ is_va_list_char_pointer (tree type)
return true;
canonic = ix86_canonical_va_list_type (type);
return (canonic == ms_va_list_type_node
|| (DEFAULT_ABI == MS_ABI && canonic == va_list_type_node));
|| (ix86_abi == MS_ABI && canonic == va_list_type_node));
}
/* Implement va_start. */
@ -18724,7 +18743,7 @@ ix86_init_machine_status (void)
f = GGC_CNEW (struct machine_function);
f->use_fast_prologue_epilogue_nregs = -1;
f->tls_descriptor_call_expanded_p = 0;
f->call_abi = DEFAULT_ABI;
f->call_abi = ix86_abi;
return f;
}
@ -29443,14 +29462,11 @@ x86_builtin_vectorization_cost (bool runtime_test)
tree
ix86_fn_abi_va_list (tree fndecl)
{
int abi;
if (!TARGET_64BIT)
return va_list_type_node;
gcc_assert (fndecl != NULL_TREE);
abi = ix86_function_abi ((const_tree) fndecl);
if (abi == MS_ABI)
if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
return ms_va_list_type_node;
else
return sysv_va_list_type_node;

View File

@ -465,7 +465,10 @@ enum calling_abi
MS_ABI = 1
};
/* The default abi form used by target. */
/* The abi used by target. */
extern enum calling_abi ix86_abi;
/* The default abi used by target. */
#define DEFAULT_ABI SYSV_ABI
/* Subtargets may reset this to 1 in order to enable 96-bit long double
@ -653,7 +656,7 @@ enum target_cpu_default
/* Boundary (in *bits*) on which stack pointer should be aligned. */
#define STACK_BOUNDARY \
(TARGET_64BIT && DEFAULT_ABI == MS_ABI ? 128 : BITS_PER_WORD)
(TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD)
/* Stack boundary of the main function guaranteed by OS. */
#define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
@ -949,7 +952,7 @@ do { \
fixed_regs[j] = call_used_regs[j] = 1; \
if (TARGET_64BIT \
&& ((cfun && cfun->machine->call_abi == MS_ABI) \
|| (!cfun && DEFAULT_ABI == MS_ABI))) \
|| (!cfun && ix86_abi == MS_ABI))) \
{ \
call_used_regs[SI_REG] = 0; \
call_used_regs[DI_REG] = 0; \
@ -1609,7 +1612,7 @@ 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
enum calling_abi call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise
MS_ABI for ms abi. */
} CUMULATIVE_ARGS;
@ -2428,7 +2431,7 @@ struct machine_function GTY(())
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;
enum calling_abi call_abi;
};
#define ix86_stack_locals (cfun->machine->stack_locals)

View File

@ -15164,7 +15164,7 @@
? gen_rtx_REG (XCmode, FIRST_FLOAT_REG) : NULL),
operands[0], const0_rtx,
GEN_INT ((TARGET_64BIT
? (DEFAULT_ABI == SYSV_ABI
? (ix86_abi == SYSV_ABI
? X86_64_SSE_REGPARM_MAX
: X64_SSE_REGPARM_MAX)
: X86_32_SSE_REGPARM_MAX)

View File

@ -228,6 +228,10 @@ mtune=
Target RejectNegative Joined Var(ix86_tune_string)
Schedule code for given CPU
mabi=
Target RejectNegative Joined Var(ix86_abi_string)
Generate code that conforms to the given ABI
mveclibabi=
Target RejectNegative Joined Var(ix86_veclibabi_string)
Vector library ABI to use

View File

@ -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 && DEFAULT_ABI == MS_ABI) \
if (TARGET_64BIT && ix86_abi == MS_ABI) \
{ \
builtin_define ("__MINGW64__"); \
builtin_define_std ("WIN64"); \

View File

@ -585,7 +585,7 @@ Objective-C and Objective-C++ Dialects}.
-m96bit-long-double -mregparm=@var{num} -msseregparm @gol
-mveclibabi=@var{type} -mpc32 -mpc64 -mpc80 -mstackrealign @gol
-momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs @gol
-mcmodel=@var{code-model} @gol
-mcmodel=@var{code-model} -mabi=@var{name} @gol
-m32 -m64 -mlarge-data-threshold=@var{num} @gol
-mfused-madd -mno-fused-madd -msse2avx}
@ -11393,6 +11393,16 @@ when @option{-mveclibabi=acml} is used. Both @option{-ftree-vectorize} and
@option{-funsafe-math-optimizations} have to be enabled. A SVML or ACML ABI
compatible library will have to be specified at link time.
@item -mabi=@var{name}
@opindex mabi
Generate code for the specified calling convention. Permissible values
are: @samp{sysv} for the ABI used on GNU/Linux and other systems and
@samp{ms} for the Microsoft ABI. The default is to use the Microsoft
ABI when targeting Windows. On all other systems, the default is the
SYSV ABI. You can control this behavior for a specific function by
using the function attribute @samp{ms_abi}/@samp{sysv_abi}.
@xref{Function Attributes}.
@item -mpush-args
@itemx -mno-push-args
@opindex mpush-args

View File

@ -1,3 +1,15 @@
2009-03-27 H.J. Lu <hongjiu.lu@intel.com>
PR target/39472
* gcc.target/x86_64/abi/callabi/func-2a.c: New.
* gcc.target/x86_64/abi/callabi/func-2b.c: Likewise.
* gcc.target/x86_64/abi/callabi/func-indirect-2a.c: Likewise.
* gcc.target/x86_64/abi/callabi/func-indirect-2b.c: Likewise.
* gcc.target/x86_64/abi/callabi/vaarg-4a.c: Likewise.
* gcc.target/x86_64/abi/callabi/vaarg-4b.c: Likewise.
* gcc.target/x86_64/abi/callabi/vaarg-5a.c: Likewise.
* gcc.target/x86_64/abi/callabi/vaarg-5b.c: Likewise.
2009-03-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/torture/builtin-explog-1.c: Remove tests that aren't true

View File

@ -0,0 +1,27 @@
/* Test for cross x86_64<->w64 abi standard calls. */
/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
/* { dg-additional-sources "func-2b.c" } */
extern void __attribute__ ((sysv_abi)) abort (void);
long double func_cross (long double, double, float, long, int, char);
long double __attribute__ ((sysv_abi))
func_native (long double a, double b, float c, long d, int e, char f)
{
long double ret;
ret = a + (long double) b + (long double) c;
ret *= (long double) (d + (long) e);
if (f>0)
ret += func_native (a,b,c,d,e,-f);
return ret;
}
int __attribute__ ((sysv_abi))
main ()
{
if (func_cross (1.0,2.0,3.0,1,2,3)
!= func_native (1.0,2.0,3.0,1,2,3))
abort ();
return 0;
}

View File

@ -0,0 +1,13 @@
/* Test for cross x86_64<->w64 abi standard calls. */
/* { dg-options "-mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
long double func_cross (long double a, double b, float c, long d, int e,
char f)
{
long double ret;
ret = a + (long double) b + (long double) c;
ret *= (long double) (d + (long) e);
if (f>0)
ret += func_cross (a,b,c,d,e,-f);
return ret;
}

View File

@ -0,0 +1,17 @@
/* Test for cross x86_64<->w64 abi standard calls via variable. */
/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
/* { dg-additional-sources "func-indirect-2b.c" } */
extern void __attribute__ ((sysv_abi)) abort (void);
typedef int (*func)(void *, char *, char *, short, long long);
extern func get_callback (void);
int __attribute__ ((sysv_abi))
main ()
{
func callme = get_callback ();
if (callme (0, 0, 0, 0x1234, 0x1234567890abcdefLL))
abort ();
return 0;
}

View File

@ -0,0 +1,24 @@
/* Test for cross x86_64<->w64 abi standard calls via variable. */
/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
typedef int (*func)(void *, char *, char *, short, long long);
static int
callback (void *ptr, char *string1, char *string2, short number,
long long rand)
{
if (ptr != 0
|| string1 != 0
|| string2 != 0
|| number != 0x1234
|| rand != 0x1234567890abcdefLL)
return 1;
else
return 0;
}
func
get_callback (void)
{
return callback;
}

View File

@ -0,0 +1,24 @@
/* Test for cross x86_64<->w64 abi va_list calls. */
/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
/* { dg-additional-sources "vaarg-4b.c" } */
extern __SIZE_TYPE__ __attribute__ ((sysv_abi)) strlen (const char *);
extern int __attribute__ ((sysv_abi)) sprintf (char *,const char *, ...);
extern void __attribute__ ((sysv_abi)) abort (void);
extern void do_cpy (char *, ...);
int __attribute__ ((sysv_abi))
main ()
{
char s[256];
do_cpy (s, "1","2","3","4", "5", "6", "7", "");
if (s[0] != '1' || s[1] !='2' || s[2] != '3' || s[3] != '4'
|| s[4] != '5' || s[5] != '6' || s[6] != '7' || s[7] != 0)
abort ();
return 0;
}

View File

@ -0,0 +1,31 @@
/* Test for cross x86_64<->w64 abi va_list calls. */
/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
#include <stdarg.h>
extern __SIZE_TYPE__ __attribute__ ((sysv_abi)) strlen (const char *);
extern int __attribute__ ((sysv_abi)) sprintf (char *, const char *, ...);
static void
vdo_cpy (char *s, va_list argp)
{
__SIZE_TYPE__ len;
char *r = s;
char *e;
*r = 0;
for (;;) {
e = va_arg (argp, char *);
if (*e == 0) break;
sprintf (r,"%s", e);
r += strlen (r);
}
}
void
do_cpy (char *s, ...)
{
va_list argp;
va_start (argp, s);
vdo_cpy (s, argp);
va_end (argp);
}

View File

@ -0,0 +1,17 @@
/* Test for cross x86_64<->w64 abi va_list calls. */
/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
/* { dg-additional-sources "vaarg-5b.c" } */
extern void __attribute__ ((sysv_abi)) abort (void);
extern int fct2 (int, ...);
#define SZ_ARGS 1ll,2ll,3ll,4ll,5ll,6ll,7ll,0ll
int __attribute__ ((sysv_abi))
main()
{
if (fct2 (-1, SZ_ARGS) != 0)
abort ();
return 0;
}

View File

@ -0,0 +1,37 @@
/* Test for cross x86_64<->w64 abi va_list calls. */
/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
#include <stdarg.h>
#define SZ_ARGS 1ll,2ll,3ll,4ll,5ll,6ll,7ll,0ll
static int __attribute__ ((sysv_abi))
fct1 (va_list argp, ...)
{
long long p1,p2;
int ret = 1;
__builtin_sysv_va_list argp_2;
__builtin_sysv_va_start (argp_2, argp);
do {
p1 = va_arg (argp_2, long long);
p2 = va_arg (argp, long long);
if (p1 != p2)
ret = 0;
} while (ret && p1 != 0);
__builtin_sysv_va_end (argp_2);
return ret;
}
int
fct2 (int dummy, ...)
{
va_list argp;
int ret = dummy;
va_start (argp, dummy);
ret += fct1 (argp, SZ_ARGS);
va_end (argp);
return ret;
}