openbsd-ports/lang/gcc/3.3/patches/pp-gcc_explow_c
2005-01-04 23:06:33 +00:00

46 lines
1.4 KiB
Plaintext

$OpenBSD: pp-gcc_explow_c,v 1.1 2005/01/04 23:06:33 espie Exp $
--- gcc/explow.c.orig Wed Dec 24 17:04:46 2003
+++ gcc/explow.c Mon Jan 3 10:17:42 2005
@@ -86,7 +86,8 @@ plus_constant_wide (x, c)
rtx tem;
int all_constant = 0;
- if (c == 0)
+ if (c == 0
+ && !(flag_propolice_protection && x == virtual_stack_vars_rtx))
return x;
restart:
@@ -187,7 +188,8 @@ plus_constant_wide (x, c)
break;
}
- if (c != 0)
+ if (c != 0
+ || (flag_propolice_protection && x == virtual_stack_vars_rtx))
x = gen_rtx_PLUS (mode, x, GEN_INT (c));
if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
@@ -538,6 +540,21 @@ memory_address (mode, x)
in certain cases. This is not necessary since the code
below can handle all possible cases, but machine-dependent
transformations can make better code. */
+ if (flag_propolice_protection)
+ {
+#define FRAMEADDR_P(X) (GET_CODE (X) == PLUS \
+ && XEXP (X, 0) == virtual_stack_vars_rtx \
+ && GET_CODE (XEXP (X, 1)) == CONST_INT)
+ rtx y;
+ if (FRAMEADDR_P (x)) goto win;
+ for (y=x; y!=0 && GET_CODE (y)==PLUS; y = XEXP (y, 0))
+ {
+ if (FRAMEADDR_P (XEXP (y, 0)))
+ XEXP (y, 0) = force_reg (GET_MODE (XEXP (y, 0)), XEXP (y, 0));
+ if (FRAMEADDR_P (XEXP (y, 1)))
+ XEXP (y, 1) = force_reg (GET_MODE (XEXP (y, 1)), XEXP (y, 1));
+ }
+ }
LEGITIMIZE_ADDRESS (x, oldx, mode, win);
/* PLUS and MULT can appear in special ways