function.c (expand_function_end): Properly handle DECL_RESULT and copy when ptr_mode != Pmode.

* function.c (expand_function_end): Properly handle DECL_RESULT
	and copy when ptr_mode != Pmode.
	* expmed.c (make_tree): Convert X from Pmode to ptr_mode, if needed.

From-SVN: r38607
This commit is contained in:
Richard Kenner 2001-01-02 02:31:22 +00:00 committed by Richard Kenner
parent 09f89307d3
commit d1608933b9
3 changed files with 30 additions and 6 deletions

View File

@ -1,3 +1,9 @@
Mon Jan 1 21:28:29 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* function.c (expand_function_end): Properly handle DECL_RESULT
and copy when ptr_mode != Pmode.
* expmed.c (make_tree): Convert X from Pmode to ptr_mode, if needed.
2001-01-01 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* c-common.c (c_common_nodes_and_builtins): Set prototype

View File

@ -1,7 +1,7 @@
/* Medium-level subroutines: convert bit-field store and extract
and shifts, multiplies and divides to rtl instructions.
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000 Free Software Foundation, Inc.
1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -4066,6 +4066,14 @@ make_tree (type, x)
default:
t = make_node (RTL_EXPR);
TREE_TYPE (t) = type;
#ifdef POINTERS_EXTEND_UNSIGNED
/* If TYPE is a POINTER_TYPE, X might be Pmode with TYPE_MODE being
ptr_mode. So convert. */
if (POINTER_TYPE_P (type) && GET_MODE (x) != TYPE_MODE (type))
x = convert_memory_address (TYPE_MODE (type), x);
#endif
RTL_EXPR_RTL (t) = x;
/* There are no insns to be output
when this rtl_expr is used. */

View File

@ -1,6 +1,6 @@
/* Expands front end tree to back end RTL for GNU C-Compiler
Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999, 2000 Free Software Foundation, Inc.
1998, 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -6825,8 +6825,8 @@ expand_function_end (filename, line, end_bindings)
if (current_function_returns_struct
|| current_function_returns_pcc_struct)
{
rtx value_address =
XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
rtx value_address
= XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
#ifdef FUNCTION_OUTGOING_VALUE
rtx outgoing
@ -6834,15 +6834,25 @@ expand_function_end (filename, line, end_bindings)
current_function_decl);
#else
rtx outgoing
= FUNCTION_VALUE (build_pointer_type (type),
current_function_decl);
= FUNCTION_VALUE (build_pointer_type (type), current_function_decl);
#endif
/* Mark this as a function return value so integrate will delete the
assignment and USE below when inlining this function. */
REG_FUNCTION_VALUE_P (outgoing) = 1;
#ifdef POINTERS_EXTEND_UNSIGNED
/* The address may be ptr_mode and OUTGOING may be Pmode. */
if (GET_MODE (outgoing) != GET_MODE (value_address))
value_address = convert_memory_address (GET_MODE (outgoing),
value_address);
#endif
emit_move_insn (outgoing, value_address);
/* Show return register used to hold result (in this case the address
of the result. */
current_function_return_rtx = outgoing;
}
/* ??? This should no longer be necessary since stupid is no longer with