diff options
author | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-03-27 22:22:30 +0000 |
---|---|---|
committer | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-03-27 22:22:30 +0000 |
commit | 0e4d11dfc8b6d80624a799ab2f2f6c5ada1f457e (patch) | |
tree | fec28a074b7f4d51805408c4567ef1b4dfc755dc /gcc/config | |
parent | dbea18313dfdbd99ed6b78f2b2e943f2abe45c65 (diff) | |
download | gcc-0e4d11dfc8b6d80624a799ab2f2f6c5ada1f457e.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145133 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/i386/cygming.h | 4 | ||||
-rw-r--r-- | gcc/config/i386/i386-protos.h | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 92 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 13 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 2 | ||||
-rw-r--r-- | gcc/config/i386/i386.opt | 4 | ||||
-rw-r--r-- | gcc/config/i386/mingw32.h | 2 |
7 files changed, 72 insertions, 50 deletions
diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index db43ffda08b..431e926818a 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -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. diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 23936a8d1e1..d6f5e5ae862 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -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); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 18063e6b388..5f36ec3b794 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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; diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 8035e84a2f8..e4d4463bcdc 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -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) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 39e62fbe6bd..a112198c381 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -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) diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index 853059081d2..6fd218f8ede 100644 --- a/gcc/config/i386/i386.opt +++ b/gcc/config/i386/i386.opt @@ -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 diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h index f3fbe8c5865..746d7d105da 100644 --- a/gcc/config/i386/mingw32.h +++ b/gcc/config/i386/mingw32.h @@ -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"); \ |