From: Richard Henderson Date: Sun, 28 May 2000 12:31:40 +0000 (-0700) Subject: function.c (diddle_return_value): A pcc-style struct return returns a pointer. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5828d725742962a7e74a0707bdc5d82c78be7b3f;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fce1fd1028..01ef6afac32 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-05-28 Richard Henderson + + * function.c (diddle_return_value): A pcc-style struct return + returns a pointer. + 2000-05-27 Zack Weinberg * cppfiles.c: Read files in, using mmap if possible, then diff --git a/gcc/function.c b/gcc/function.c index a59de4b3467..07f58d56dbf 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)