cp-tree.h (struct cp_language_function): Remove x_result_rtx.
* cp/cp-tree.h (struct cp_language_function): Remove x_result_rtx. (original_result_rtx): Remove. * cp/decl.c (save_function_data): Don't clear x_result_rtx. (mark_lang_function): Don't mark it either. * cp/expr.c (fixup_result_decl): Remove. * cp/semantics.c (genrtl_named_return_value): Frob the return decl before calling emit_local_var. (genrtl_finish_function): Don't call fixup_result_decl. Always emit the jump to return_label. From-SVN: r36770
This commit is contained in:
parent
3e4eac3fe9
commit
156ce2112e
|
@ -1,3 +1,15 @@
|
|||
2000-10-06 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* cp-tree.h (struct cp_language_function): Remove x_result_rtx.
|
||||
(original_result_rtx): Remove.
|
||||
* decl.c (save_function_data): Don't clear x_result_rtx.
|
||||
(mark_lang_function): Don't mark it either.
|
||||
* expr.c (fixup_result_decl): Remove.
|
||||
* semantics.c (genrtl_named_return_value): Frob the return decl
|
||||
before calling emit_local_var.
|
||||
(genrtl_finish_function): Don't call fixup_result_decl.
|
||||
Always emit the jump to return_label.
|
||||
|
||||
2000-10-06 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* pt.c (lookup_template_class): Set current access for enum.
|
||||
|
|
|
@ -882,8 +882,6 @@ struct cp_language_function
|
|||
|
||||
tree *x_vcalls_possible_p;
|
||||
|
||||
struct rtx_def *x_result_rtx;
|
||||
|
||||
int returns_value;
|
||||
int returns_null;
|
||||
int in_function_try_handler;
|
||||
|
@ -963,13 +961,6 @@ struct cp_language_function
|
|||
|
||||
#define doing_semantic_analysis_p() (!expanding_p)
|
||||
|
||||
/* If original DECL_RESULT of current function was a register,
|
||||
but due to being an addressable named return value, would up
|
||||
on the stack, this variable holds the named return value's
|
||||
original location. */
|
||||
|
||||
#define original_result_rtx cp_function_chain->x_result_rtx
|
||||
|
||||
#define in_function_try_handler cp_function_chain->in_function_try_handler
|
||||
|
||||
/* Nonzero if __FUNCTION__ and its ilk have been declared in this
|
||||
|
@ -4042,7 +4033,6 @@ extern void check_handlers PARAMS ((tree));
|
|||
|
||||
/* in expr.c */
|
||||
extern void init_cplus_expand PARAMS ((void));
|
||||
extern void fixup_result_decl PARAMS ((tree, struct rtx_def *));
|
||||
extern int extract_init PARAMS ((tree, tree));
|
||||
extern tree cplus_expand_constant PARAMS ((tree));
|
||||
|
||||
|
|
|
@ -13992,7 +13992,6 @@ save_function_data (decl)
|
|||
/* Clear out the bits we don't need. */
|
||||
f->base.x_stmt_tree.x_last_stmt = NULL_TREE;
|
||||
f->base.x_stmt_tree.x_last_expr_type = NULL_TREE;
|
||||
f->x_result_rtx = NULL_RTX;
|
||||
f->x_named_label_uses = NULL;
|
||||
f->bindings = NULL;
|
||||
|
||||
|
@ -14631,8 +14630,6 @@ mark_lang_function (p)
|
|||
ggc_mark_tree (p->x_current_class_ref);
|
||||
ggc_mark_tree (p->x_eh_spec_try_block);
|
||||
|
||||
ggc_mark_rtx (p->x_result_rtx);
|
||||
|
||||
mark_named_label_lists (&p->x_named_labels, &p->x_named_label_uses);
|
||||
mark_binding_level (&p->bindings);
|
||||
}
|
||||
|
|
|
@ -148,36 +148,6 @@ init_cplus_expand ()
|
|||
lang_expand_constant = cplus_expand_constant;
|
||||
}
|
||||
|
||||
/* If DECL had its rtl moved from where callers expect it
|
||||
to be, fix it up. RESULT is the nominal rtl for the RESULT_DECL,
|
||||
which may be a pseudo instead of a hard register. */
|
||||
|
||||
void
|
||||
fixup_result_decl (decl, result)
|
||||
tree decl;
|
||||
rtx result;
|
||||
{
|
||||
if (REG_P (result))
|
||||
{
|
||||
if (REGNO (result) >= FIRST_PSEUDO_REGISTER)
|
||||
{
|
||||
rtx real_decl_result;
|
||||
|
||||
#ifdef FUNCTION_OUTGOING_VALUE
|
||||
real_decl_result
|
||||
= FUNCTION_OUTGOING_VALUE (TREE_TYPE (decl), current_function_decl);
|
||||
#else
|
||||
real_decl_result
|
||||
= FUNCTION_VALUE (TREE_TYPE (decl), current_function_decl);
|
||||
#endif
|
||||
REG_FUNCTION_VALUE_P (real_decl_result) = 1;
|
||||
result = real_decl_result;
|
||||
}
|
||||
store_expr (decl, result, 0);
|
||||
emit_insn (gen_rtx (USE, VOIDmode, result));
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
extract_init (decl, init)
|
||||
tree decl ATTRIBUTE_UNUSED, init ATTRIBUTE_UNUSED;
|
||||
|
|
|
@ -975,17 +975,12 @@ finish_decl_cleanup (decl, cleanup)
|
|||
static void
|
||||
genrtl_named_return_value ()
|
||||
{
|
||||
tree decl;
|
||||
|
||||
decl = DECL_RESULT (current_function_decl);
|
||||
|
||||
emit_local_var (decl);
|
||||
tree decl = DECL_RESULT (current_function_decl);
|
||||
|
||||
/* If this named return value comes in a register, put it in a
|
||||
pseudo-register. */
|
||||
if (DECL_REGISTER (decl))
|
||||
{
|
||||
original_result_rtx = DECL_RTL (decl);
|
||||
/* Note that the mode of the old DECL_RTL may be wider than the
|
||||
mode of DECL_RESULT, depending on the calling conventions for
|
||||
the processor. For example, on the Alpha, a 32-bit integer
|
||||
|
@ -993,10 +988,12 @@ genrtl_named_return_value ()
|
|||
SImode but the DECL_RTL for the DECL_RESULT has DImode. So,
|
||||
here, we use the mode the back-end has already assigned for
|
||||
the return value. */
|
||||
DECL_RTL (decl) = gen_reg_rtx (GET_MODE (original_result_rtx));
|
||||
DECL_RTL (decl) = gen_reg_rtx (GET_MODE (DECL_RTL (decl)));
|
||||
if (TREE_ADDRESSABLE (decl))
|
||||
put_var_into_stack (decl);
|
||||
}
|
||||
|
||||
emit_local_var (decl);
|
||||
}
|
||||
|
||||
/* Bind a name and initialization to the return value of
|
||||
|
@ -2602,15 +2599,9 @@ genrtl_finish_function (fn)
|
|||
emit_label (cleanup_label);
|
||||
}
|
||||
|
||||
/* Get return value into register if that's where it's supposed to
|
||||
be. */
|
||||
if (original_result_rtx)
|
||||
fixup_result_decl (DECL_RESULT (fn), original_result_rtx);
|
||||
|
||||
/* Finish building code that will trigger warnings if users forget
|
||||
to make their functions return values. */
|
||||
if (no_return_label || cleanup_label)
|
||||
emit_jump (return_label);
|
||||
emit_jump (return_label);
|
||||
if (no_return_label)
|
||||
{
|
||||
/* We don't need to call `expand_*_return' here because we don't
|
||||
|
|
Loading…
Reference in New Issue