i386.c (ix86_call_abi_override): Call ix86_function_abi.

* config/i386/i386.c (ix86_call_abi_override): Call ix86_function_abi.
	(ix86_function_abi): Cleanup.

From-SVN: r226187
This commit is contained in:
Uros Bizjak 2015-07-24 21:03:45 +02:00 committed by Uros Bizjak
parent 484d5dde41
commit 36b7d827db
2 changed files with 45 additions and 53 deletions

View File

@ -1,3 +1,8 @@
2015-07-24 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.c (ix86_call_abi_override): Call ix86_function_abi.
(ix86_function_abi): Cleanup.
2015-07-24 Michael Darling <darlingm@gmail.com>
PR other/66259

View File

@ -6316,37 +6316,6 @@ ix86_reg_parm_stack_space (const_tree fndecl)
return 0;
}
/* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
call abi used. */
enum calling_abi
ix86_function_type_abi (const_tree fntype)
{
if (fntype != NULL_TREE && TYPE_ATTRIBUTES (fntype) != NULL_TREE)
{
enum calling_abi abi = ix86_abi;
if (abi == SYSV_ABI)
{
if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
{
if (TARGET_X32)
{
static bool warned = false;
if (!warned)
{
error ("X32 does not support ms_abi attribute");
warned = true;
}
}
abi = MS_ABI;
}
}
else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
abi = SYSV_ABI;
return abi;
}
return ix86_abi;
}
/* We add this as a workaround in order to use libc_has_function
hook in i386.md. */
bool
@ -6355,6 +6324,45 @@ ix86_libc_has_function (enum function_class fn_class)
return targetm.libc_has_function (fn_class);
}
/* Returns value SYSV_ABI, MS_ABI dependent on fntype,
specifying the call abi used. */
enum calling_abi
ix86_function_type_abi (const_tree fntype)
{
enum calling_abi abi = ix86_abi;
if (fntype == NULL_TREE || TYPE_ATTRIBUTES (fntype) == NULL_TREE)
return abi;
if (abi == SYSV_ABI
&& lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
{
if (TARGET_X32)
error ("X32 does not support ms_abi attribute");
abi = MS_ABI;
}
else if (abi == MS_ABI
&& lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
abi = SYSV_ABI;
return abi;
}
static enum calling_abi
ix86_function_abi (const_tree fndecl)
{
return fndecl ? ix86_function_type_abi (TREE_TYPE (fndecl)) : ix86_abi;
}
/* Returns value SYSV_ABI, MS_ABI dependent on cfun,
specifying the call abi used. */
enum calling_abi
ix86_cfun_abi (void)
{
return cfun ? cfun->machine->call_abi : ix86_abi;
}
static bool
ix86_function_ms_hook_prologue (const_tree fn)
{
@ -6369,24 +6377,6 @@ ix86_function_ms_hook_prologue (const_tree fn)
return false;
}
static enum calling_abi
ix86_function_abi (const_tree fndecl)
{
if (! fndecl)
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. */
enum calling_abi
ix86_cfun_abi (void)
{
if (! cfun)
return ix86_abi;
return cfun->machine->call_abi;
}
/* Write the extra assembler code needed to declare a function properly. */
void
@ -6439,10 +6429,7 @@ extern void init_regs (void);
void
ix86_call_abi_override (const_tree fndecl)
{
if (fndecl == NULL_TREE)
cfun->machine->call_abi = ix86_abi;
else
cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
cfun->machine->call_abi = ix86_function_abi (fndecl);
}
/* 64-bit MS and SYSV ABI have different set of call used registers. Avoid