46 lines
1.4 KiB
Plaintext
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
|