OSDN Git Service

* function.c (diddle_return_value): A pcc-style struct return
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 May 2000 12:31:40 +0000 (12:31 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 May 2000 12:31:40 +0000 (12:31 +0000)
        returns a pointer.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@34230 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/function.c

index 7fce1fd..01ef6af 100644 (file)
@@ -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
index a59de4b..07f58d5 100644 (file)
@@ -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)