aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2001-01-02 02:31:22 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2001-01-01 21:31:22 -0500
commitd1608933b95df6978bf6683ededf4d05af9d65f4 (patch)
treec7c92d96f32e636df33dde2f85860e4404e7cb89 /gcc
parent09f89307d376748a461cc4b4aa3808a75384ca89 (diff)
downloadgcc-d1608933b95df6978bf6683ededf4d05af9d65f4.zip
gcc-d1608933b95df6978bf6683ededf4d05af9d65f4.tar.gz
gcc-d1608933b95df6978bf6683ededf4d05af9d65f4.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expmed.c10
-rw-r--r--gcc/function.c20
3 files changed, 30 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5fa3e72..1c9c7ba 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 6d6e6f5..0661e10 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -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. */
diff --git a/gcc/function.c b/gcc/function.c
index 586ef7e..bbd7ecc 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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