$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
