(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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36770
138bc75d-0d04-0410-961f-
82ee72b054a4
+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.
tree *x_vcalls_possible_p;
- struct rtx_def *x_result_rtx;
-
int returns_value;
int returns_null;
int in_function_try_handler;
#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
/* 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));
/* 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;
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);
}
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;
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
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
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