Commit 9d6bb566 by Richard Henderson Committed by Richard Henderson

mmix-protos.h (mmix_expand_builtin_va_arg): Remove.

        * config/mmix/mmix-protos.h (mmix_expand_builtin_va_arg): Remove.
        * config/mmix/mmix.c (TARGET_GIMPLIFY_VA_ARG_EXPR): New.
        (mmix_gimplify_va_arg_expr): Rewrite from mmix_expand_builtin_va_arg.
        * config/mmix/mmix.h (EXPAND_BUILTIN_VA_ARG): Remove.
        (FRAME_POINTER_REQUIRED): Use current_function_has_nonlocal_label.

From-SVN: r84336
parent 4e15608a
2004-07-08 Richard Henderson <rth@redhat.com> 2004-07-08 Richard Henderson <rth@redhat.com>
* config/mmix/mmix-protos.h (mmix_expand_builtin_va_arg): Remove.
* config/mmix/mmix.c (TARGET_GIMPLIFY_VA_ARG_EXPR): New.
(mmix_gimplify_va_arg_expr): Rewrite from mmix_expand_builtin_va_arg.
* config/mmix/mmix.h (EXPAND_BUILTIN_VA_ARG): Remove.
(FRAME_POINTER_REQUIRED): Use current_function_has_nonlocal_label.
* config/m32r/m32r-protos.h (m32r_va_arg): Remove. * config/m32r/m32r-protos.h (m32r_va_arg): Remove.
* config/m32r/m32r.c (TARGET_GIMPLIFY_VA_ARG_EXPR): New. * config/m32r/m32r.c (TARGET_GIMPLIFY_VA_ARG_EXPR): New.
(m32r_gimplify_va_arg_expr): Rewrite from m32r_va_arg. (m32r_gimplify_va_arg_expr): Rewrite from m32r_va_arg.
......
...@@ -67,7 +67,6 @@ extern void mmix_asm_declare_register_global ...@@ -67,7 +67,6 @@ extern void mmix_asm_declare_register_global
(FILE *, tree, int, const char *); (FILE *, tree, int, const char *);
extern rtx mmix_function_arg extern rtx mmix_function_arg
(const CUMULATIVE_ARGS *, enum machine_mode, tree, int, int); (const CUMULATIVE_ARGS *, enum machine_mode, tree, int, int);
extern rtx mmix_expand_builtin_va_arg (tree, tree);
extern void mmix_asm_output_addr_diff_elt (FILE *, rtx, int, int); extern void mmix_asm_output_addr_diff_elt (FILE *, rtx, int, int);
extern void mmix_asm_output_addr_vec_elt (FILE *, int); extern void mmix_asm_output_addr_vec_elt (FILE *, int);
extern enum reg_class mmix_preferred_reload_class (rtx, enum reg_class); extern enum reg_class mmix_preferred_reload_class (rtx, enum reg_class);
......
...@@ -139,6 +139,7 @@ static void mmix_file_start (void); ...@@ -139,6 +139,7 @@ static void mmix_file_start (void);
static void mmix_file_end (void); static void mmix_file_end (void);
static bool mmix_rtx_costs (rtx, int, int, int *); static bool mmix_rtx_costs (rtx, int, int, int *);
static rtx mmix_struct_value_rtx (tree, int); static rtx mmix_struct_value_rtx (tree, int);
static tree mmix_gimplify_va_arg_expr (tree, tree, tree *, tree *);
/* Target structure macros. Listed by node. See `Using and Porting GCC' /* Target structure macros. Listed by node. See `Using and Porting GCC'
...@@ -204,6 +205,8 @@ static rtx mmix_struct_value_rtx (tree, int); ...@@ -204,6 +205,8 @@ static rtx mmix_struct_value_rtx (tree, int);
#undef TARGET_SETUP_INCOMING_VARARGS #undef TARGET_SETUP_INCOMING_VARARGS
#define TARGET_SETUP_INCOMING_VARARGS mmix_setup_incoming_varargs #define TARGET_SETUP_INCOMING_VARARGS mmix_setup_incoming_varargs
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
#define TARGET_GIMPLIFY_VA_ARG_EXPR mmix_gimplify_va_arg_expr
struct gcc_target targetm = TARGET_INITIALIZER; struct gcc_target targetm = TARGET_INITIALIZER;
...@@ -843,109 +846,19 @@ mmix_setup_incoming_varargs (CUMULATIVE_ARGS *args_so_farp, ...@@ -843,109 +846,19 @@ mmix_setup_incoming_varargs (CUMULATIVE_ARGS *args_so_farp,
internal_error ("MMIX Internal: Last named vararg would not fit in a register"); internal_error ("MMIX Internal: Last named vararg would not fit in a register");
} }
/* EXPAND_BUILTIN_VA_ARG. */ /* Gimplify VA_ARG_EXPR. All we need to do is figure out if TYPE is
pass-by-reference and hand off to standard routines. */
/* This is modified from the "standard" implementation of va_arg: read the static tree
value from the current (padded) address and increment by the (padded) mmix_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
size. The difference for MMIX is that if the type is {
pass-by-reference, then perform an indirection. */ CUMULATIVE_ARGS cum;
cum.lib = 0;
rtx if (mmix_function_arg_pass_by_reference (&cum, TYPE_MODE (type), type, 0))
mmix_expand_builtin_va_arg (tree valist, tree type) return ind_gimplify_va_arg_expr (valist, type, pre_p, post_p);
{
tree ptr_size = size_int (BITS_PER_WORD / BITS_PER_UNIT);
tree addr_tree, type_size = NULL;
tree align, alignm1;
tree rounded_size;
rtx addr;
/* Compute the rounded size of the type. */
/* Get AP. */
addr_tree = valist;
align = size_int (PARM_BOUNDARY / BITS_PER_UNIT);
alignm1 = size_int (PARM_BOUNDARY / BITS_PER_UNIT - 1);
if (type == error_mark_node
|| (type_size = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type))) == NULL
|| TREE_OVERFLOW (type_size))
/* Presumably an error; the size isn't computable. A message has
supposedly been emitted elsewhere. */
rounded_size = size_zero_node;
else else
rounded_size = fold (build (MULT_EXPR, sizetype, return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
fold (build (TRUNC_DIV_EXPR, sizetype,
fold (build (PLUS_EXPR, sizetype,
type_size, alignm1)),
align)),
align));
if (AGGREGATE_TYPE_P (type)
&& GET_MODE_UNIT_SIZE (TYPE_MODE (type)) < 8
&& GET_MODE_UNIT_SIZE (TYPE_MODE (type)) != 0)
{
/* Adjust for big-endian the location of aggregates passed in a
register, but where the aggregate is accessed in a shorter mode
than the natural register mode (i.e. it is accessed as SFmode(?),
SImode, HImode or QImode rather than DImode or DFmode(?)). FIXME:
Or should we adjust the mode in which the aggregate is read, to be
a register size mode? (Hum, nah, a small offset is generally
cheaper than a wider memory access on MMIX.) */
addr_tree
= build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
size_int ((BITS_PER_WORD / BITS_PER_UNIT)
- GET_MODE_UNIT_SIZE (TYPE_MODE (type))));
}
else if (!integer_zerop (rounded_size))
{
if (!really_constant_p (type_size))
/* Varying-size types come in by reference. */
addr_tree
= build1 (INDIRECT_REF, build_pointer_type (type), addr_tree);
else
{
/* If the size is less than a register, then we need to pad the
address by adding the difference. */
tree addend
= fold (build (COND_EXPR, sizetype,
fold (build (GT_EXPR, sizetype,
rounded_size,
align)),
size_zero_node,
fold (build (MINUS_EXPR, sizetype,
rounded_size,
type_size))));
tree addr_tree1
= fold (build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
addend));
/* If this type is larger than what fits in a register, then it
is passed by reference. */
addr_tree
= fold (build (COND_EXPR, TREE_TYPE (addr_tree1),
fold (build (GT_EXPR, sizetype,
rounded_size,
ptr_size)),
build1 (INDIRECT_REF, build_pointer_type (type),
addr_tree1),
addr_tree1));
}
}
addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
addr = copy_to_reg (addr);
if (!integer_zerop (rounded_size))
{
/* Compute new value for AP. For MMIX, it is always advanced by the
size of a register. */
tree t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
build (PLUS_EXPR, TREE_TYPE (valist), valist,
ptr_size));
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
}
return addr;
} }
/* TRAMPOLINE_SIZE. */ /* TRAMPOLINE_SIZE. */
......
...@@ -687,7 +687,7 @@ enum reg_class ...@@ -687,7 +687,7 @@ enum reg_class
/* Node: Elimination */ /* Node: Elimination */
/* FIXME: Is this requirement built-in? Anyway, we should try to get rid /* FIXME: Is this requirement built-in? Anyway, we should try to get rid
of it; we can deduce the value. */ of it; we can deduce the value. */
#define FRAME_POINTER_REQUIRED (nonlocal_goto_stack_level != NULL_RTX) #define FRAME_POINTER_REQUIRED current_function_has_nonlocal_label
/* The frame-pointer is stored in a location that either counts to the /* The frame-pointer is stored in a location that either counts to the
offset of incoming parameters, or that counts to the offset of the offset of incoming parameters, or that counts to the offset of the
...@@ -789,13 +789,6 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS; ...@@ -789,13 +789,6 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
#define FUNCTION_PROFILER(FILE, LABELNO) \ #define FUNCTION_PROFILER(FILE, LABELNO) \
mmix_function_profiler (FILE, LABELNO) mmix_function_profiler (FILE, LABELNO)
/* Node: Varargs */
/* FIXME: This and other EXPAND_BUILTIN_VA_... target macros are not
documented, although used by several targets. */
#define EXPAND_BUILTIN_VA_ARG(VALIST, TYPE) \
mmix_expand_builtin_va_arg (VALIST, TYPE)
/* Node: Trampolines */ /* Node: Trampolines */
#define TRAMPOLINE_TEMPLATE(FILE) \ #define TRAMPOLINE_TEMPLATE(FILE) \
......
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