aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-05-28 05:31:40 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-05-28 05:31:40 -0700
commit5828d725742962a7e74a0707bdc5d82c78be7b3f (patch)
tree8259d933168057d7c20100edea0e2f03c1405468
parent6745c1b9dd0edeeb6d1f1ea2f3285fe58ff7f91f (diff)
downloadgcc-5828d725742962a7e74a0707bdc5d82c78be7b3f.zip
gcc-5828d725742962a7e74a0707bdc5d82c78be7b3f.tar.gz
gcc-5828d725742962a7e74a0707bdc5d82c78be7b3f.tar.bz2
function.c (diddle_return_value): A pcc-style struct return returns a pointer.
* function.c (diddle_return_value): A pcc-style struct return returns a pointer. From-SVN: r34230
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/function.c16
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7fce1fd..01ef6af 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-05-28 Richard Henderson <rth@cygnus.com>
+
+ * function.c (diddle_return_value): A pcc-style struct return
+ returns a pointer.
+
2000-05-27 Zack Weinberg <zack@wolery.cumb.org>
* cppfiles.c: Read files in, using mmap if possible, then
diff --git a/gcc/function.c b/gcc/function.c
index a59de4b..07f58d5 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -6319,14 +6319,25 @@ diddle_return_value (doit, arg)
void *arg;
{
rtx outgoing = current_function_return_rtx;
+ int pcc;
if (! outgoing)
return;
- if (GET_CODE (outgoing) == REG
- && REGNO (outgoing) >= FIRST_PSEUDO_REGISTER)
+ pcc = (current_function_returns_struct
+ || current_function_returns_pcc_struct);
+
+ if ((GET_CODE (outgoing) == REG
+ && REGNO (outgoing) >= FIRST_PSEUDO_REGISTER)
+ || pcc)
{
tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
+
+ /* A PCC-style return returns a pointer to the memory in which
+ the structure is stored. */
+ if (pcc)
+ type = build_pointer_type (type);
+
#ifdef FUNCTION_OUTGOING_VALUE
outgoing = FUNCTION_OUTGOING_VALUE (type, current_function_decl);
#else
@@ -6337,6 +6348,7 @@ diddle_return_value (doit, arg)
if (GET_MODE (outgoing) == BLKmode)
PUT_MODE (outgoing,
GET_MODE (DECL_RTL (DECL_RESULT (current_function_decl))));
+ REG_FUNCTION_VALUE_P (outgoing) = 1;
}
if (GET_CODE (outgoing) == REG)