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

94 lines
3.1 KiB
Plaintext

$OpenBSD: pp-gcc_simplify-rtx_c,v 1.1 2005/01/04 23:06:33 espie Exp $
--- gcc/simplify-rtx.c.orig Thu Jul 3 09:38:22 2003
+++ gcc/simplify-rtx.c Mon Jan 3 10:17:42 2005
@@ -1670,7 +1670,8 @@ simplify_plus_minus (code, mode, op0, op
int n_ops = 2, input_ops = 2, input_consts = 0, n_consts;
int first, negate, changed;
int i, j;
-
+ HOST_WIDE_INT fp_offset = 0;
+
memset ((char *) ops, 0, sizeof ops);
/* Set up the two operands and then expand them until nothing has been
@@ -1695,6 +1696,10 @@ simplify_plus_minus (code, mode, op0, op
switch (this_code)
{
case PLUS:
+ if (flag_propolice_protection
+ && XEXP (this_op, 0) == virtual_stack_vars_rtx
+ && GET_CODE (XEXP (this_op, 1)) == CONST_INT)
+ fp_offset = INTVAL (XEXP (this_op, 1));
case MINUS:
if (n_ops == 7)
return NULL_RTX;
@@ -1849,10 +1854,10 @@ simplify_plus_minus (code, mode, op0, op
&& GET_CODE (ops[n_ops - 1].op) == CONST_INT
&& CONSTANT_P (ops[n_ops - 2].op))
{
- rtx value = ops[n_ops - 1].op;
+ int value = INTVAL (ops[n_ops - 1].op);
if (ops[n_ops - 1].neg ^ ops[n_ops - 2].neg)
- value = neg_const_int (mode, value);
- ops[n_ops - 2].op = plus_constant (ops[n_ops - 2].op, INTVAL (value));
+ value = -value;
+ ops[n_ops - 2].op = plus_constant (ops[n_ops - 2].op, value);
n_ops--;
}
@@ -1870,6 +1875,54 @@ simplify_plus_minus (code, mode, op0, op
&& (n_ops + n_consts > input_ops
|| (n_ops + n_consts == input_ops && n_consts <= input_consts)))
return NULL_RTX;
+
+ if (flag_propolice_protection)
+ {
+ /* keep the addressing style of local variables
+ as (plus (virtual_stack_vars_rtx) (CONST_int x))
+ (1) inline function is expanded, (+ (+VFP c1) -c2)=>(+ VFP c1-c2)
+ (2) the case ary[r-1], (+ (+VFP c1) (+r -1))=>(+ R (+r -1))
+ */
+ for (i = 0; i < n_ops; i++)
+#ifdef FRAME_GROWS_DOWNWARD
+ if (ops[i].op == virtual_stack_vars_rtx)
+#else
+ if (ops[i].op == virtual_stack_vars_rtx
+ || ops[i].op == frame_pointer_rtx)
+#endif
+ {
+ if (GET_CODE (ops[n_ops - 1].op) == CONST_INT)
+ {
+ HOST_WIDE_INT value = INTVAL (ops[n_ops - 1].op);
+ if (n_ops < 3 || value >= fp_offset)
+ {
+ ops[i].op = plus_constant (ops[i].op, value);
+ n_ops--;
+ }
+ else
+ {
+ if (!force
+ && (n_ops+1 + n_consts > input_ops
+ || (n_ops+1 + n_consts == input_ops && n_consts <= input_consts)))
+ return NULL_RTX;
+ ops[n_ops - 1].op = GEN_INT (value-fp_offset);
+ ops[i].op = plus_constant (ops[i].op, fp_offset);
+ }
+ }
+ /* buf[BUFSIZE]: buf is the first local variable (+ (+ fp -S) S)
+ or (+ (fp 0) r) ==> ((+ (+fp 1) r) -1) */
+ else if (fp_offset != 0)
+ return NULL_RTX;
+#ifndef FRAME_GROWS_DOWNWARD
+ /*
+ * For the case of buf[i], i: REG, buf: (plus fp 0),
+ */
+ else if (fp_offset == 0)
+ return NULL_RTX;
+#endif
+ break;
+ }
+ }
/* Put a non-negated operand first. If there aren't any, make all
operands positive and negate the whole thing later. */