OSDN Git Service

* function.c (assign_parms): For a struct value address passed as
[pf3gnuchains/gcc-fork.git] / gcc / function.c
index 4df1800..0828969 100644 (file)
@@ -5009,30 +5009,32 @@ assign_parms (fndecl)
 
          SET_DECL_RTL (parm, stack_parm);
        }
 
          SET_DECL_RTL (parm, stack_parm);
        }
-
-      /* If this "parameter" was the place where we are receiving the
-        function's incoming structure pointer, set up the result.  */
-      if (parm == function_result_decl)
-       {
-         tree result = DECL_RESULT (fndecl);
-         rtx addr = DECL_RTL (parm);
-         rtx x;
-
-#ifdef POINTERS_EXTEND_UNSIGNED
-         if (GET_MODE (addr) != Pmode)
-           addr = convert_memory_address (Pmode, addr);
-#endif
-
-         x = gen_rtx_MEM (DECL_MODE (result), addr);
-         set_mem_attributes (x, result, 1);
-         SET_DECL_RTL (result, x);
-       }
     }
 
   /* Output all parameter conversion instructions (possibly including calls)
      now that all parameters have been copied out of hard registers.  */
   emit_insn (conversion_insns);
 
     }
 
   /* Output all parameter conversion instructions (possibly including calls)
      now that all parameters have been copied out of hard registers.  */
   emit_insn (conversion_insns);
 
+  /* If we are receiving a struct value address as the first argument, set up
+     the RTL for the function result. As this might require code to convert
+     the transmitted address to Pmode, we do this here to ensure that possible
+     preliminary conversions of the address have been emitted already.  */
+  if (function_result_decl)
+    {
+      tree result = DECL_RESULT (fndecl);
+      rtx addr = DECL_RTL (function_result_decl);
+      rtx x;
+      
+#ifdef POINTERS_EXTEND_UNSIGNED
+      if (GET_MODE (addr) != Pmode)
+       addr = convert_memory_address (Pmode, addr);
+#endif
+      
+      x = gen_rtx_MEM (DECL_MODE (result), addr);
+      set_mem_attributes (x, result, 1);
+      SET_DECL_RTL (result, x);
+    }
+
   last_parm_insn = get_last_insn ();
 
   current_function_args_size = stack_args_size.constant;
   last_parm_insn = get_last_insn ();
 
   current_function_args_size = stack_args_size.constant;