diff options
author | Richard Henderson <rth@cygnus.com> | 2000-05-28 05:31:40 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-05-28 05:31:40 -0700 |
commit | 5828d725742962a7e74a0707bdc5d82c78be7b3f (patch) | |
tree | 8259d933168057d7c20100edea0e2f03c1405468 | |
parent | 6745c1b9dd0edeeb6d1f1ea2f3285fe58ff7f91f (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/function.c | 16 |
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) |