90 lines
3.6 KiB
Plaintext
90 lines
3.6 KiB
Plaintext
$OpenBSD: pp-gcc_expr_c,v 1.1 2005/01/04 23:06:33 espie Exp $
|
|
--- gcc/expr.c.orig Sun May 16 22:27:15 2004
|
|
+++ gcc/expr.c Mon Jan 3 10:17:42 2005
|
|
@@ -45,6 +45,7 @@ Software Foundation, 59 Temple Place - S
|
|
#include "langhooks.h"
|
|
#include "intl.h"
|
|
#include "tm_p.h"
|
|
+#include "protector.h"
|
|
|
|
/* Decide whether a function's arguments should be processed
|
|
from first to last or from last to first.
|
|
@@ -1560,7 +1561,7 @@ move_by_pieces (to, from, len, align)
|
|
|
|
if (USE_LOAD_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_from)
|
|
{
|
|
- data.from_addr = copy_addr_to_reg (plus_constant (from_addr, len));
|
|
+ data.from_addr = copy_addr_to_reg (plus_constant (from_addr, len-GET_MODE_SIZE (mode)));
|
|
data.autinc_from = 1;
|
|
data.explicit_inc_from = -1;
|
|
}
|
|
@@ -1574,7 +1575,7 @@ move_by_pieces (to, from, len, align)
|
|
data.from_addr = copy_addr_to_reg (from_addr);
|
|
if (USE_STORE_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_to)
|
|
{
|
|
- data.to_addr = copy_addr_to_reg (plus_constant (to_addr, len));
|
|
+ data.to_addr = copy_addr_to_reg (plus_constant (to_addr, len-GET_MODE_SIZE (mode)));
|
|
data.autinc_to = 1;
|
|
data.explicit_inc_to = -1;
|
|
}
|
|
@@ -1691,11 +1692,13 @@ move_by_pieces_1 (genfun, mode, data)
|
|
from1 = adjust_address (data->from, mode, data->offset);
|
|
|
|
if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0)
|
|
- emit_insn (gen_add2_insn (data->to_addr,
|
|
- GEN_INT (-(HOST_WIDE_INT)size)));
|
|
+ if (data->explicit_inc_to < -1)
|
|
+ emit_insn (gen_add2_insn (data->to_addr,
|
|
+ GEN_INT (-(HOST_WIDE_INT)size)));
|
|
if (HAVE_PRE_DECREMENT && data->explicit_inc_from < 0)
|
|
- emit_insn (gen_add2_insn (data->from_addr,
|
|
- GEN_INT (-(HOST_WIDE_INT)size)));
|
|
+ if (data->explicit_inc_from < -1)
|
|
+ emit_insn (gen_add2_insn (data->from_addr,
|
|
+ GEN_INT (-(HOST_WIDE_INT)size)));
|
|
|
|
if (data->to)
|
|
emit_insn ((*genfun) (to1, from1));
|
|
@@ -2868,7 +2871,7 @@ store_by_pieces_1 (data, align)
|
|
|
|
if (USE_STORE_PRE_DECREMENT (mode) && data->reverse && ! data->autinc_to)
|
|
{
|
|
- data->to_addr = copy_addr_to_reg (plus_constant (to_addr, data->len));
|
|
+ data->to_addr = copy_addr_to_reg (plus_constant (to_addr, data->len-GET_MODE_SIZE (mode)));
|
|
data->autinc_to = 1;
|
|
data->explicit_inc_to = -1;
|
|
}
|
|
@@ -2939,8 +2942,9 @@ store_by_pieces_2 (genfun, mode, data)
|
|
to1 = adjust_address (data->to, mode, data->offset);
|
|
|
|
if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0)
|
|
- emit_insn (gen_add2_insn (data->to_addr,
|
|
- GEN_INT (-(HOST_WIDE_INT) size)));
|
|
+ if (data->explicit_inc_to < -1)
|
|
+ emit_insn (gen_add2_insn (data->to_addr,
|
|
+ GEN_INT (-(HOST_WIDE_INT) size)));
|
|
|
|
cst = (*data->constfun) (data->constfundata, data->offset, mode);
|
|
emit_insn ((*genfun) (to1, cst));
|
|
@@ -5950,7 +5954,9 @@ force_operand (value, target)
|
|
&& GET_CODE (XEXP (value, 0)) == PLUS
|
|
&& GET_CODE (XEXP (XEXP (value, 0), 0)) == REG
|
|
&& REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
|
|
- && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
|
|
+ && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER
|
|
+ && (!flag_propolice_protection
|
|
+ || XEXP (XEXP (value, 0), 0) != virtual_stack_vars_rtx))
|
|
{
|
|
rtx temp = expand_simple_binop (GET_MODE (value), code,
|
|
XEXP (XEXP (value, 0), 0), op2,
|
|
@@ -8126,7 +8132,8 @@ expand_expr (exp, target, tmode, modifie
|
|
/* If adding to a sum including a constant,
|
|
associate it to put the constant outside. */
|
|
if (GET_CODE (op1) == PLUS
|
|
- && CONSTANT_P (XEXP (op1, 1)))
|
|
+ && CONSTANT_P (XEXP (op1, 1))
|
|
+ && !(flag_propolice_protection && (contains_fp (op0) || contains_fp (op1))))
|
|
{
|
|
rtx constant_term = const0_rtx;
|
|
|