aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-01-28 13:21:49 -0800
committerRichard Henderson <rth@gcc.gnu.org>2000-01-28 13:21:49 -0800
commitae20388c7d5fea2bbea463fa0057468aa4a3b311 (patch)
treee15d1b8e09e399a4cb2f7ac75ac84465d4d558a0 /gcc
parenta3e0a73bd7eb20ac5121a946486713f694373eda (diff)
downloadgcc-ae20388c7d5fea2bbea463fa0057468aa4a3b311.zip
gcc-ae20388c7d5fea2bbea463fa0057468aa4a3b311.tar.gz
gcc-ae20388c7d5fea2bbea463fa0057468aa4a3b311.tar.bz2
Makefile.in (flow.o): Revert 24 Jan change.
* Makefile.in (flow.o): Revert 24 Jan change. * flow.c (mark_regs_live_at_end): Likewise. Force BLKmode FUNCTION_VALUE result to DECL_RESULT's mode. From-SVN: r31674
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/Makefile.in2
-rw-r--r--gcc/flow.c44
3 files changed, 32 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b1c8859..c39ab7f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2000-01-28 Richard Henderson <rth@cygnus.com>
+
+ * Makefile.in (flow.o): Revert 24 Jan change.
+ * flow.c (mark_regs_live_at_end): Likewise. Force BLKmode
+ FUNCTION_VALUE result to DECL_RESULT's mode.
+
2000-01-28 Zack Weinberg <zack@wolery.cumb.org>
* configure.in: Make --enable-cpplib the default.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 22ddebc..328611a 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1573,7 +1573,7 @@ unroll.o : unroll.c $(CONFIG_H) system.h $(RTL_H) insn-config.h function.h \
varray.h
flow.o : flow.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h insn-config.h \
$(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h $(RECOG_H) \
- insn-flags.h function.h except.h $(EXPR_H)
+ insn-flags.h function.h except.h
combine.o : combine.c $(CONFIG_H) system.h $(RTL_H) flags.h function.h \
insn-config.h insn-flags.h insn-codes.h insn-attr.h $(REGS_H) $(EXPR_H) \
$(BASIC_BLOCK_H) $(RECOG_H) real.h hard-reg-set.h toplev.h
diff --git a/gcc/flow.c b/gcc/flow.c
index bee21d2..008f0c2 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -133,7 +133,6 @@ Boston, MA 02111-1307, USA. */
#include "except.h"
#include "toplev.h"
#include "recog.h"
-#include "expr.h"
#include "insn-flags.h"
#include "obstack.h"
@@ -2783,8 +2782,7 @@ static void
mark_regs_live_at_end (set)
regset set;
{
- tree return_decl, return_type;
- rtx return_reg;
+ tree type;
int i;
/* If exiting needs the right stack value, consider the stack pointer
@@ -2843,34 +2841,42 @@ mark_regs_live_at_end (set)
/* Mark function return value. */
- return_decl = DECL_RESULT (current_function_decl);
- return_type = TREE_TYPE (return_decl);
- return_reg = DECL_RTL (return_decl);
- if (return_reg)
+ type = TREE_TYPE (DECL_RESULT (current_function_decl));
+ if (type != void_type_node)
{
- if (GET_CODE (return_reg) == REG
- && REGNO (return_reg) < FIRST_PSEUDO_REGISTER)
- {
- /* Use hard_function_value to avoid examining a BLKmode register. */
- return_reg
- = hard_function_value (return_type, current_function_decl, 1);
- mark_reg (set, return_reg);
- }
- else if (GET_CODE (return_reg) == PARALLEL)
+ rtx outgoing;
+
+ if (current_function_returns_struct
+ || current_function_returns_pcc_struct)
+ type = build_pointer_type (type);
+
+#ifdef FUNCTION_OUTGOING_VALUE
+ outgoing = FUNCTION_OUTGOING_VALUE (type, current_function_decl);
+#else
+ outgoing = FUNCTION_VALUE (type, current_function_decl);
+#endif
+ if (GET_MODE (outgoing) == BLKmode)
+ PUT_MODE (outgoing, DECL_RTL (DECL_RESULT (current_function_decl)));
+
+ if (GET_CODE (outgoing) == REG)
+ mark_reg (set, outgoing);
+ else if (GET_CODE (outgoing) == PARALLEL)
{
- int len = XVECLEN (return_reg, 0);
+ int len = XVECLEN (outgoing, 0);
/* Check for a NULL entry, used to indicate that the parameter
goes on the stack and in registers. */
- i = (XEXP (XVECEXP (return_reg, 0, 0), 0) ? 0 : 1);
+ i = (XEXP (XVECEXP (outgoing, 0, 0), 0) ? 0 : 1);
for ( ; i < len; ++i)
{
- rtx r = XVECEXP (return_reg, 0, i);
+ rtx r = XVECEXP (outgoing, 0, i);
if (GET_CODE (r) == REG)
mark_reg (set, r);
}
}
+ else
+ abort ();
}
}