mirror of git://gcc.gnu.org/git/gcc.git
sparc.h (FUNCTION_VALUE, [...]): Remove macros.
* config/sparc/sparc.h (FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE, LIBCALL_VALUE, FUNCTION_VALUE_REGNO_P): Remove macros. * config/sparc/sparc-protos.h (function_value): Remove declaration. * config/sparc/sparc.c (sparc_function_value, sparc_libcall_value, sparc_function_value_regno_p): New functions. (TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE, TARGET_FUNCTION_VALUE_REGNO_P): Define. (function_value): Rename to... (sparc_function_value_1): ... this. Make static. Change 'incoming_p' argument to 'outgoing'. (function_arg_record_value, function_arg_union_value, function_arg_vector_value): Update comment. From-SVN: r159890
This commit is contained in:
parent
4ad2e1ec08
commit
bf44d79278
|
|
@ -1,3 +1,18 @@
|
||||||
|
2010-05-26 Anatoly Sokolov <aesok@post.ru>
|
||||||
|
|
||||||
|
* config/sparc/sparc.h (FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE,
|
||||||
|
LIBCALL_VALUE, FUNCTION_VALUE_REGNO_P): Remove macros.
|
||||||
|
* config/sparc/sparc-protos.h (function_value): Remove declaration.
|
||||||
|
* config/sparc/sparc.c (sparc_function_value, sparc_libcall_value,
|
||||||
|
sparc_function_value_regno_p): New functions.
|
||||||
|
(TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE,
|
||||||
|
TARGET_FUNCTION_VALUE_REGNO_P): Define.
|
||||||
|
(function_value): Rename to...
|
||||||
|
(sparc_function_value_1): ... this. Make static. Change 'incoming_p'
|
||||||
|
argument to 'outgoing'.
|
||||||
|
(function_arg_record_value, function_arg_union_value,
|
||||||
|
function_arg_vector_value): Update comment.
|
||||||
|
|
||||||
2010-05-26 Eric Botcazou <ebotcazou@adacore.com>
|
2010-05-26 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
* dwarf2out.c (struct dw_fde_struct): Reorder flags.
|
* dwarf2out.c (struct dw_fde_struct): Reorder flags.
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ along with GCC; see the file COPYING3. If not see
|
||||||
#define __SPARC_PROTOS_H__
|
#define __SPARC_PROTOS_H__
|
||||||
|
|
||||||
#ifdef TREE_CODE
|
#ifdef TREE_CODE
|
||||||
extern struct rtx_def *function_value (const_tree, enum machine_mode, int);
|
|
||||||
extern void function_arg_advance (CUMULATIVE_ARGS *,
|
extern void function_arg_advance (CUMULATIVE_ARGS *,
|
||||||
enum machine_mode, tree, int);
|
enum machine_mode, tree, int);
|
||||||
extern struct rtx_def *function_arg (const CUMULATIVE_ARGS *,
|
extern struct rtx_def *function_arg (const CUMULATIVE_ARGS *,
|
||||||
|
|
|
||||||
|
|
@ -400,6 +400,9 @@ static const char *get_some_local_dynamic_name (void);
|
||||||
static int get_some_local_dynamic_name_1 (rtx *, void *);
|
static int get_some_local_dynamic_name_1 (rtx *, void *);
|
||||||
static bool sparc_rtx_costs (rtx, int, int, int *, bool);
|
static bool sparc_rtx_costs (rtx, int, int, int *, bool);
|
||||||
static bool sparc_promote_prototypes (const_tree);
|
static bool sparc_promote_prototypes (const_tree);
|
||||||
|
static rtx sparc_function_value (const_tree, const_tree, bool);
|
||||||
|
static rtx sparc_libcall_value (enum machine_mode, const_rtx);
|
||||||
|
static bool sparc_function_value_regno_p (const unsigned int);
|
||||||
static rtx sparc_struct_value_rtx (tree, int);
|
static rtx sparc_struct_value_rtx (tree, int);
|
||||||
static enum machine_mode sparc_promote_function_mode (const_tree, enum machine_mode,
|
static enum machine_mode sparc_promote_function_mode (const_tree, enum machine_mode,
|
||||||
int *, const_tree, int);
|
int *, const_tree, int);
|
||||||
|
|
@ -532,6 +535,13 @@ static bool fpu_option_set = false;
|
||||||
#undef TARGET_PROMOTE_PROTOTYPES
|
#undef TARGET_PROMOTE_PROTOTYPES
|
||||||
#define TARGET_PROMOTE_PROTOTYPES sparc_promote_prototypes
|
#define TARGET_PROMOTE_PROTOTYPES sparc_promote_prototypes
|
||||||
|
|
||||||
|
#undef TARGET_FUNCTION_VALUE
|
||||||
|
#define TARGET_FUNCTION_VALUE sparc_function_value
|
||||||
|
#undef TARGET_LIBCALL_VALUE
|
||||||
|
#define TARGET_LIBCALL_VALUE sparc_libcall_value
|
||||||
|
#undef TARGET_FUNCTION_VALUE_REGNO_P
|
||||||
|
#define TARGET_FUNCTION_VALUE_REGNO_P sparc_function_value_regno_p
|
||||||
|
|
||||||
#undef TARGET_STRUCT_VALUE_RTX
|
#undef TARGET_STRUCT_VALUE_RTX
|
||||||
#define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
|
#define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
|
||||||
#undef TARGET_RETURN_IN_MEMORY
|
#undef TARGET_RETURN_IN_MEMORY
|
||||||
|
|
@ -5150,10 +5160,10 @@ function_arg_record_value_2 (const_tree type, HOST_WIDE_INT startbitpos,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Used by function_arg and function_value to implement the complex
|
/* Used by function_arg and sparc_function_value_1 to implement the complex
|
||||||
conventions of the 64-bit ABI for passing and returning structures.
|
conventions of the 64-bit ABI for passing and returning structures.
|
||||||
Return an expression valid as a return value for the two macros
|
Return an expression valid as a return value for the FUNCTION_ARG
|
||||||
FUNCTION_ARG and FUNCTION_VALUE.
|
and TARGET_FUNCTION_VALUE.
|
||||||
|
|
||||||
TYPE is the data type of the argument (as a tree).
|
TYPE is the data type of the argument (as a tree).
|
||||||
This is null for libcalls where that information may
|
This is null for libcalls where that information may
|
||||||
|
|
@ -5251,10 +5261,10 @@ function_arg_record_value (const_tree type, enum machine_mode mode,
|
||||||
return parms.ret;
|
return parms.ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Used by function_arg and function_value to implement the conventions
|
/* Used by function_arg and sparc_function_value_1 to implement the conventions
|
||||||
of the 64-bit ABI for passing and returning unions.
|
of the 64-bit ABI for passing and returning unions.
|
||||||
Return an expression valid as a return value for the two macros
|
Return an expression valid as a return value for the FUNCTION_ARG
|
||||||
FUNCTION_ARG and FUNCTION_VALUE.
|
and TARGET_FUNCTION_VALUE.
|
||||||
|
|
||||||
SIZE is the size in bytes of the union.
|
SIZE is the size in bytes of the union.
|
||||||
MODE is the argument's machine mode.
|
MODE is the argument's machine mode.
|
||||||
|
|
@ -5289,10 +5299,10 @@ function_arg_union_value (int size, enum machine_mode mode, int slotno,
|
||||||
return regs;
|
return regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Used by function_arg and function_value to implement the conventions
|
/* Used by function_arg and sparc_function_value_1 to implement the conventions
|
||||||
for passing and returning large (BLKmode) vectors.
|
for passing and returning large (BLKmode) vectors.
|
||||||
Return an expression valid as a return value for the two macros
|
Return an expression valid as a return value for the FUNCTION_ARG
|
||||||
FUNCTION_ARG and FUNCTION_VALUE.
|
and TARGET_FUNCTION_VALUE.
|
||||||
|
|
||||||
SIZE is the size in bytes of the vector (at least 8 bytes).
|
SIZE is the size in bytes of the vector (at least 8 bytes).
|
||||||
REGNO is the FP hard register the vector will be passed in. */
|
REGNO is the FP hard register the vector will be passed in. */
|
||||||
|
|
@ -5747,17 +5757,18 @@ sparc_struct_value_rtx (tree fndecl, int incoming)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE, and LIBCALL_VALUE macros.
|
/* Handle TARGET_FUNCTION_VALUE, and TARGET_LIBCALL_VALUE target hook.
|
||||||
For v9, function return values are subject to the same rules as arguments,
|
For v9, function return values are subject to the same rules as arguments,
|
||||||
except that up to 32 bytes may be returned in registers. */
|
except that up to 32 bytes may be returned in registers. */
|
||||||
|
|
||||||
rtx
|
static rtx
|
||||||
function_value (const_tree type, enum machine_mode mode, int incoming_p)
|
sparc_function_value_1 (const_tree type, enum machine_mode mode,
|
||||||
|
bool outgoing)
|
||||||
{
|
{
|
||||||
/* Beware that the two values are swapped here wrt function_arg. */
|
/* Beware that the two values are swapped here wrt function_arg. */
|
||||||
int regbase = (incoming_p
|
int regbase = (outgoing
|
||||||
? SPARC_OUTGOING_INT_ARG_FIRST
|
? SPARC_INCOMING_INT_ARG_FIRST
|
||||||
: SPARC_INCOMING_INT_ARG_FIRST);
|
: SPARC_OUTGOING_INT_ARG_FIRST);
|
||||||
enum mode_class mclass = GET_MODE_CLASS (mode);
|
enum mode_class mclass = GET_MODE_CLASS (mode);
|
||||||
int regno;
|
int regno;
|
||||||
|
|
||||||
|
|
@ -5840,6 +5851,38 @@ function_value (const_tree type, enum machine_mode mode, int incoming_p)
|
||||||
return gen_rtx_REG (mode, regno);
|
return gen_rtx_REG (mode, regno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle TARGET_FUNCTION_VALUE.
|
||||||
|
|
||||||
|
On SPARC the value is found in the first "output" register, but the called
|
||||||
|
function leaves it in the first "input" register. */
|
||||||
|
|
||||||
|
static rtx
|
||||||
|
sparc_function_value (const_tree valtype,
|
||||||
|
const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
|
||||||
|
bool outgoing)
|
||||||
|
{
|
||||||
|
return sparc_function_value_1 (valtype, TYPE_MODE (valtype), outgoing);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle TARGET_LIBCALL_VALUE. */
|
||||||
|
|
||||||
|
static rtx
|
||||||
|
sparc_libcall_value (enum machine_mode mode,
|
||||||
|
const_rtx fun ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return sparc_function_value_1 (NULL_TREE, mode, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle FUNCTION_VALUE_REGNO_P.
|
||||||
|
On SPARC, the first "output" reg is used for integer values, and
|
||||||
|
the first floating point register is used for floating point values. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
sparc_function_value_regno_p (const unsigned int regno)
|
||||||
|
{
|
||||||
|
return (regno == 8 || regno == 32);
|
||||||
|
}
|
||||||
|
|
||||||
/* Do what is necessary for `va_start'. We look at the current function
|
/* Do what is necessary for `va_start'. We look at the current function
|
||||||
to determine if stdarg or varargs is used and return the address of
|
to determine if stdarg or varargs is used and return the address of
|
||||||
the first unnamed parameter. */
|
the first unnamed parameter. */
|
||||||
|
|
|
||||||
|
|
@ -1419,34 +1419,6 @@ extern char leaf_reg_remap[];
|
||||||
#define LOCAL_REGNO(REGNO) \
|
#define LOCAL_REGNO(REGNO) \
|
||||||
((REGNO) >= 16 && (REGNO) <= 31)
|
((REGNO) >= 16 && (REGNO) <= 31)
|
||||||
|
|
||||||
/* Define how to find the value returned by a function.
|
|
||||||
VALTYPE is the data type of the value (as a tree).
|
|
||||||
If the precise function being called is known, FUNC is its FUNCTION_DECL;
|
|
||||||
otherwise, FUNC is 0. */
|
|
||||||
|
|
||||||
/* On SPARC the value is found in the first "output" register. */
|
|
||||||
|
|
||||||
#define FUNCTION_VALUE(VALTYPE, FUNC) \
|
|
||||||
function_value ((VALTYPE), TYPE_MODE (VALTYPE), 1)
|
|
||||||
|
|
||||||
/* But the called function leaves it in the first "input" register. */
|
|
||||||
|
|
||||||
#define FUNCTION_OUTGOING_VALUE(VALTYPE, FUNC) \
|
|
||||||
function_value ((VALTYPE), TYPE_MODE (VALTYPE), 0)
|
|
||||||
|
|
||||||
/* Define how to find the value returned by a library function
|
|
||||||
assuming the value has mode MODE. */
|
|
||||||
|
|
||||||
#define LIBCALL_VALUE(MODE) \
|
|
||||||
function_value (NULL_TREE, (MODE), 1)
|
|
||||||
|
|
||||||
/* 1 if N is a possible register number for a function value
|
|
||||||
as seen by the caller.
|
|
||||||
On SPARC, the first "output" reg is used for integer values,
|
|
||||||
and the first floating point register is used for floating point values. */
|
|
||||||
|
|
||||||
#define FUNCTION_VALUE_REGNO_P(N) ((N) == 8 || (N) == 32)
|
|
||||||
|
|
||||||
/* Define the size of space to allocate for the return value of an
|
/* Define the size of space to allocate for the return value of an
|
||||||
untyped_call. */
|
untyped_call. */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue