error_marks in expand_expr
Martin v. Loewis
martin@mira.isdn.cs.tu-berlin.de
Tue Mar 16 16:52:00 GMT 1999
> Note that expand_expr already has some code to handle ERROR_MARK, way down
> in the main switch.
This function is way too large ... So you were thinking rather about
this patch?
Martin
Wed Mar 17 01:50:36 1999 Martin von Löwis <loewis@informatik.hu-berlin.de>
* expr.c (expand_expr): Handle ERROR_MARK much earlier.
Index: expr.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/expr.c,v
retrieving revision 1.129
diff -c -p -r1.129 expr.c
*** expr.c 1999/03/12 00:02:32 1.129
--- expr.c 1999/03/17 00:37:56
*************** expand_expr (exp, target, tmode, modifie
*** 5471,5491 ****
register rtx op0, op1, temp;
tree type = TREE_TYPE (exp);
int unsignedp = TREE_UNSIGNED (type);
! register enum machine_mode mode = TYPE_MODE (type);
register enum tree_code code = TREE_CODE (exp);
optab this_optab;
! /* Use subtarget as the target for operand 0 of a binary operation. */
! rtx subtarget = (target != 0 && GET_CODE (target) == REG ? target : 0);
! rtx original_target = target;
! int ignore = (target == const0_rtx
! || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
! || code == CONVERT_EXPR || code == REFERENCE_EXPR
! || code == COND_EXPR)
! && TREE_CODE (type) == VOID_TYPE));
tree context;
/* Used by check-memory-usage to make modifier read only. */
enum expand_modifier ro_modifier;
/* Make a read-only version of the modifier. */
if (modifier == EXPAND_NORMAL || modifier == EXPAND_SUM
|| modifier == EXPAND_CONST_ADDRESS || modifier == EXPAND_INITIALIZER)
--- 5471,5504 ----
register rtx op0, op1, temp;
tree type = TREE_TYPE (exp);
int unsignedp = TREE_UNSIGNED (type);
! register enum machine_mode mode;
register enum tree_code code = TREE_CODE (exp);
optab this_optab;
! rtx subtarget, original_target;
! int ignore;
tree context;
/* Used by check-memory-usage to make modifier read only. */
enum expand_modifier ro_modifier;
+ /* Handle ERROR_MARK before anybody tries to access its type. */
+ if (TREE_CODE (exp) == ERROR_MARK)
+ {
+ op0 = CONST0_RTX (tmode);
+ if (op0 != 0)
+ return op0;
+ return const0_rtx;
+ }
+
+ mode = TYPE_MODE (type);
+ /* Use subtarget as the target for operand 0 of a binary operation. */
+ subtarget = (target != 0 && GET_CODE (target) == REG ? target : 0);
+ original_target = target;
+ ignore = (target == const0_rtx
+ || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
+ || code == CONVERT_EXPR || code == REFERENCE_EXPR
+ || code == COND_EXPR)
+ && TREE_CODE (type) == VOID_TYPE));
+
/* Make a read-only version of the modifier. */
if (modifier == EXPAND_NORMAL || modifier == EXPAND_SUM
|| modifier == EXPAND_CONST_ADDRESS || modifier == EXPAND_INITIALIZER)
*************** expand_expr (exp, target, tmode, modifie
*** 8143,8154 ****
emit_move_insn (dhc, validize_mem (gen_rtx_MEM (Pmode, dhc)));
return const0_rtx;
}
-
- case ERROR_MARK:
- op0 = CONST0_RTX (tmode);
- if (op0 != 0)
- return op0;
- return const0_rtx;
default:
return (*lang_expand_expr) (exp, original_target, tmode, modifier);
--- 8156,8161 ----
More information about the Gcc-patches
mailing list