Commit 06790e5f by Zack Weinberg

tree.c (tree_operand_check_failed): New function.

	* tree.c (tree_operand_check_failed): New function.
	* tree.h (TREE_OPERAND_CHECK, TREE_OPERAND_CHECK_CODE,
	TREE_RTL_OPERAND_CHECK): New checking macros.
	(TREE_OPERAND, SAVE_EXPR_CONTEXT, SAVE_EXPR_RTL,
	RTL_EXPR_SEQUENCE, RTL_EXPR_RTL, WITH_CLEANUP_EXPR_RTL,
	CONSTRUCTOR_ELTS, LABELED_BLOCK_LABEL, LABELED_BLOCK_BODY,
	EXIT_BLOCK_RETURN, LOOP_EXPR_BODY, EXPR_WFL_NODE,
	EXPR_WFL_FILENAME_NODE, EXPR_WFL_FILENAME, TARGET_EXPR_SLOT,
	TARGET_EXPR_INITIAL, TARGET_EXPR_CLEANUP): Use the new
	checking macros.

From-SVN: r65452
parent 5288c2a1
2003-04-10 Zack Weinberg <zack@codesourcery.com>
* tree.c (tree_operand_check_failed): New function.
* tree.h (TREE_OPERAND_CHECK, TREE_OPERAND_CHECK_CODE,
TREE_RTL_OPERAND_CHECK): New checking macros.
(TREE_OPERAND, SAVE_EXPR_CONTEXT, SAVE_EXPR_RTL,
RTL_EXPR_SEQUENCE, RTL_EXPR_RTL, WITH_CLEANUP_EXPR_RTL,
CONSTRUCTOR_ELTS, LABELED_BLOCK_LABEL, LABELED_BLOCK_BODY,
EXIT_BLOCK_RETURN, LOOP_EXPR_BODY, EXPR_WFL_NODE,
EXPR_WFL_FILENAME_NODE, EXPR_WFL_FILENAME, TARGET_EXPR_SLOT,
TARGET_EXPR_INITIAL, TARGET_EXPR_CLEANUP): Use the new
checking macros.
Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz> Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz>
PR inline-asm/8803 PR inline-asm/8803
...@@ -94,7 +107,7 @@ Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz> ...@@ -94,7 +107,7 @@ Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz>
(sched_analyze_insn): Ditto. Use anti-dependencies for (sched_analyze_insn): Ditto. Use anti-dependencies for
MOVE_BARRIER and true-dependencies as TRUE_BARRIER. MOVE_BARRIER and true-dependencies as TRUE_BARRIER.
(init_deps_global): Initialize the barrier as NO_BARRIER. (init_deps_global): Initialize the barrier as NO_BARRIER.
2003-04-09 Vladimir Makarov <vmakarov@redhat.com> 2003-04-09 Vladimir Makarov <vmakarov@redhat.com>
* config/ia64/ia64.c (issue_nops_and_insn): Add new parameter. * config/ia64/ia64.c (issue_nops_and_insn): Add new parameter.
...@@ -135,7 +148,7 @@ Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz> ...@@ -135,7 +148,7 @@ Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz>
* config/arm/xscale-elf.h (SUBTARGET_EXTRA_ASM_SPEC): Likewise, * config/arm/xscale-elf.h (SUBTARGET_EXTRA_ASM_SPEC): Likewise,
but only if -msoft-float is specified pass. Otherwise pass but only if -msoft-float is specified pass. Otherwise pass
-mfpu=softvfp. -mfpu=softvfp.
2003-04-09 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> 2003-04-09 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
* function.c (purge_addressof): Use free_INSN_LIST_node instead of * function.c (purge_addressof): Use free_INSN_LIST_node instead of
...@@ -171,7 +184,7 @@ Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz> ...@@ -171,7 +184,7 @@ Thu Apr 10 23:52:30 CEST 2003 Jan Hubicka <jh@suse.cz>
* function.c (postponed_insns): New. * function.c (postponed_insns): New.
(purge_addressof_1): Postpone processing of insns if addressofs (purge_addressof_1): Postpone processing of insns if addressofs
are not put into stack. are not put into stack.
(purge_addressof): Process postponed insns. (purge_addressof): Process postponed insns.
2003-04-08 J"orn Rennecke <joern.rennecke@superh.com> 2003-04-08 J"orn Rennecke <joern.rennecke@superh.com>
...@@ -540,7 +553,7 @@ Mon Apr 7 14:36:24 CEST 2003 Jan Hubicka <jh@suse.cz> ...@@ -540,7 +553,7 @@ Mon Apr 7 14:36:24 CEST 2003 Jan Hubicka <jh@suse.cz>
handle_pch. handle_pch.
(c_common_write_pch): Call handle_pch. (c_common_write_pch): Call handle_pch.
(c_common_read_pch): Don't call start_source_file, (c_common_read_pch): Don't call start_source_file,
or end_source_file. or end_source_file.
Fri Apr 4 17:43:52 2003 Olivier Hainque <hainque@act-europe.fr> Fri Apr 4 17:43:52 2003 Olivier Hainque <hainque@act-europe.fr>
...@@ -585,7 +598,7 @@ Fri Apr 4 15:58:52 2003 J"orn Rennecke <joern.rennecke@superh.com> ...@@ -585,7 +598,7 @@ Fri Apr 4 15:58:52 2003 J"orn Rennecke <joern.rennecke@superh.com>
* sh.c (fpscr_set_from_mem): Use ACTUAL_NORMAL_MODE. * sh.c (fpscr_set_from_mem): Use ACTUAL_NORMAL_MODE.
2003-04-04 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at> 2003-04-04 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
* doc/contrib.texi (Contributors): Add entries for Wolfgang * doc/contrib.texi (Contributors): Add entries for Wolfgang
Bangerth, DJ Delorie, Christian Ehrhardt, Christopher Faylor, Bangerth, DJ Delorie, Christian Ehrhardt, Christopher Faylor,
Nathanael Nerode, Diego Novillo, Hartmut Penner, Volker Reichelt, Nathanael Nerode, Diego Novillo, Hartmut Penner, Volker Reichelt,
...@@ -665,7 +678,7 @@ Thu Apr 3 22:27:40 CEST 2003 Jan Hubicka <jh@suse.cz> ...@@ -665,7 +678,7 @@ Thu Apr 3 22:27:40 CEST 2003 Jan Hubicka <jh@suse.cz>
(dwarf2out_source_line): Don't do anything if line==0. (dwarf2out_source_line): Don't do anything if line==0.
* stor-layout.c (do_type_align): New fn, split out from... * stor-layout.c (do_type_align): New fn, split out from...
(layout_decl): ...here. Do all alignment calculations for (layout_decl): ...here. Do all alignment calculations for
FIELD_DECLs here. FIELD_DECLs here.
(update_alignment_for_field): Not here. (update_alignment_for_field): Not here.
(start_record_layout, debug_rli): Remove unpadded_align. (start_record_layout, debug_rli): Remove unpadded_align.
...@@ -739,7 +752,7 @@ Thu Apr 3 00:31:21 CEST 2003 Jan Hubicka <jh@suse.cz> ...@@ -739,7 +752,7 @@ Thu Apr 3 00:31:21 CEST 2003 Jan Hubicka <jh@suse.cz>
Thu Apr 3 00:18:49 CEST 2003 Jan Hubicka <jh@suse.cz> Thu Apr 3 00:18:49 CEST 2003 Jan Hubicka <jh@suse.cz>
* i386.c (override_options): Disable red zone by default on i386. * i386.c (override_options): Disable red zone by default on i386.
(compute_frame_layout, ix86_force_to_memory, ix86_free_from_memory): (compute_frame_layout, ix86_force_to_memory, ix86_free_from_memory):
Do not test TARGET_64BIT together with TARGET_RED_ZONE Do not test TARGET_64BIT together with TARGET_RED_ZONE
2003-04-02 Kazu Hirata <kazu@cs.umass.edu> 2003-04-02 Kazu Hirata <kazu@cs.umass.edu>
...@@ -781,7 +794,7 @@ Thu Apr 3 00:18:49 CEST 2003 Jan Hubicka <jh@suse.cz> ...@@ -781,7 +794,7 @@ Thu Apr 3 00:18:49 CEST 2003 Jan Hubicka <jh@suse.cz>
Remove additional cycle in the reservation before retirement. Remove additional cycle in the reservation before retirement.
(ppc8540_mfcr, ppc8540_mtcrf, ppc8540_mtjmpr): Add missed (ppc8540_mfcr, ppc8540_mtcrf, ppc8540_mtjmpr): Add missed
reservation of ppc8540_issue. reservation of ppc8540_issue.
2003-04-02 Andreas Schwab <schwab@suse.de> 2003-04-02 Andreas Schwab <schwab@suse.de>
* real.c (decode_ieee_single): Fix decoding of SNaN bit. * real.c (decode_ieee_single): Fix decoding of SNaN bit.
...@@ -1839,7 +1852,7 @@ Mon Mar 24 20:03:03 CET 2003 Jan Hubicka <jh@suse.cz> ...@@ -1839,7 +1852,7 @@ Mon Mar 24 20:03:03 CET 2003 Jan Hubicka <jh@suse.cz>
operands in case MULT_EXPR of 2003-02-16 patch. operands in case MULT_EXPR of 2003-02-16 patch.
2003-03-20 Daniel Berlin <dberlin@dberlin.org> 2003-03-20 Daniel Berlin <dberlin@dberlin.org>
Merge changes from new-regalloc-branch Merge changes from new-regalloc-branch
From Michael Matz <matz@suse.de> From Michael Matz <matz@suse.de>
* df.c (df_ref_record_1): Move init of loc to safe point. * df.c (df_ref_record_1): Move init of loc to safe point.
......
...@@ -4587,6 +4587,22 @@ tree_vec_elt_check_failed (idx, len, file, line, function) ...@@ -4587,6 +4587,22 @@ tree_vec_elt_check_failed (idx, len, file, line, function)
idx + 1, len, function, trim_filename (file), line); idx + 1, len, function, trim_filename (file), line);
} }
/* Similar to above, except that the check is for the bounds of the operand
vector of an expression node. */
void
tree_operand_check_failed (idx, code, file, line, function)
int idx;
enum tree_code code;
const char *file;
int line;
const char *function;
{
internal_error
("tree check: accessed operand %d of %s with %d operands in %s, at %s:%d",
idx + 1, tree_code_name[code], TREE_CODE_LENGTH (code),
function, trim_filename (file), line);
}
#endif /* ENABLE_TREE_CHECKING */ #endif /* ENABLE_TREE_CHECKING */
/* For a new vector type node T, build the information necessary for /* For a new vector type node T, build the information necessary for
......
...@@ -324,6 +324,40 @@ struct tree_common GTY(()) ...@@ -324,6 +324,40 @@ struct tree_common GTY(())
__FILE__, __LINE__, __FUNCTION__); \ __FILE__, __LINE__, __FUNCTION__); \
&__t->vec.a[__i]; })) &__t->vec.a[__i]; }))
/* Special checks for TREE_OPERANDs. */
#define TREE_OPERAND_CHECK(t, i) __extension__ \
(*({const tree __t = EXPR_CHECK(t); \
const int __i = (i); \
if (__i < 0 || __i >= TREE_CODE_LENGTH (TREE_CODE (__t))) \
tree_operand_check_failed (__i, TREE_CODE (__t), \
__FILE__, __LINE__, __FUNCTION__); \
&__t->exp.operands[__i]; }))
#define TREE_OPERAND_CHECK_CODE(t, code, i) __extension__ \
(*({const tree __t = t; \
const int __i = (i); \
const enum tree_code __code = code; \
if (TREE_CODE (__t) != __code) \
tree_check_failed (__t, __code, \
__FILE__, __LINE__, __FUNCTION__); \
if (__i < 0 || __i >= TREE_CODE_LENGTH (__code)) \
tree_operand_check_failed (__i, __code, \
__FILE__, __LINE__, __FUNCTION__); \
&__t->exp.operands[__i]; }))
#define TREE_RTL_OPERAND_CHECK(t, code, i) __extension__ \
(*(rtx *) \
({const tree __t = t; \
const int __i = (i); \
const enum tree_code __code = code; \
if (TREE_CODE (__t) != __code) \
tree_check_failed (__t, __code, \
__FILE__, __LINE__, __FUNCTION__); \
if (__i < 0 || __i >= TREE_CODE_LENGTH (__code)) \
tree_operand_check_failed (__i, __code, \
__FILE__, __LINE__, __FUNCTION__); \
&__t->exp.operands[__i]; }))
extern void tree_check_failed PARAMS ((const tree, enum tree_code, extern void tree_check_failed PARAMS ((const tree, enum tree_code,
const char *, int, const char *)) const char *, int, const char *))
ATTRIBUTE_NORETURN; ATTRIBUTE_NORETURN;
...@@ -334,6 +368,10 @@ extern void tree_vec_elt_check_failed PARAMS ((int, int, const char *, ...@@ -334,6 +368,10 @@ extern void tree_vec_elt_check_failed PARAMS ((int, int, const char *,
int, const char *)) int, const char *))
ATTRIBUTE_NORETURN; ATTRIBUTE_NORETURN;
extern void tree_operand_check_failed PARAMS ((int, enum tree_code,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
#else /* not ENABLE_TREE_CHECKING, or not gcc */ #else /* not ENABLE_TREE_CHECKING, or not gcc */
#define TREE_CHECK(t, code) (t) #define TREE_CHECK(t, code) (t)
...@@ -341,6 +379,9 @@ extern void tree_vec_elt_check_failed PARAMS ((int, int, const char *, ...@@ -341,6 +379,9 @@ extern void tree_vec_elt_check_failed PARAMS ((int, int, const char *,
#define CST_OR_CONSTRUCTOR_CHECK(t) (t) #define CST_OR_CONSTRUCTOR_CHECK(t) (t)
#define EXPR_CHECK(t) (t) #define EXPR_CHECK(t) (t)
#define TREE_VEC_ELT_CHECK(t, i) ((t)->vec.a[i]) #define TREE_VEC_ELT_CHECK(t, i) ((t)->vec.a[i])
#define TREE_OPERAND_CHECK(t, i) ((t)->exp.operands[i])
#define TREE_OPERAND_CHECK_CODE(t, code, i) ((t)->exp.operands[i])
#define TREE_RTL_OPERAND_CHECK(t, code, i) (*(rtx *) &((t)->exp.operands[i]))
#endif #endif
...@@ -826,8 +867,9 @@ struct tree_vec GTY(()) ...@@ -826,8 +867,9 @@ struct tree_vec GTY(())
/* Define fields and accessors for some nodes that represent expressions. */ /* Define fields and accessors for some nodes that represent expressions. */
/* In a SAVE_EXPR node. */ /* In a SAVE_EXPR node. */
#define SAVE_EXPR_CONTEXT(NODE) TREE_OPERAND (SAVE_EXPR_CHECK (NODE), 1) #define SAVE_EXPR_CONTEXT(NODE) TREE_OPERAND_CHECK_CODE (NODE, SAVE_EXPR, 1)
#define SAVE_EXPR_RTL(NODE) (*(rtx *) &SAVE_EXPR_CHECK (NODE)->exp.operands[2]) #define SAVE_EXPR_RTL(NODE) TREE_RTL_OPERAND_CHECK (NODE, SAVE_EXPR, 2)
#define SAVE_EXPR_NOPLACEHOLDER(NODE) TREE_UNSIGNED (SAVE_EXPR_CHECK (NODE)) #define SAVE_EXPR_NOPLACEHOLDER(NODE) TREE_UNSIGNED (SAVE_EXPR_CHECK (NODE))
/* Nonzero if the SAVE_EXPRs value should be kept, even if it occurs /* Nonzero if the SAVE_EXPRs value should be kept, even if it occurs
both in normal code and in a handler. (Normally, in a handler, all both in normal code and in a handler. (Normally, in a handler, all
...@@ -836,42 +878,41 @@ struct tree_vec GTY(()) ...@@ -836,42 +878,41 @@ struct tree_vec GTY(())
#define SAVE_EXPR_PERSISTENT_P(NODE) TREE_ASM_WRITTEN (SAVE_EXPR_CHECK (NODE)) #define SAVE_EXPR_PERSISTENT_P(NODE) TREE_ASM_WRITTEN (SAVE_EXPR_CHECK (NODE))
/* In a RTL_EXPR node. */ /* In a RTL_EXPR node. */
#define RTL_EXPR_SEQUENCE(NODE) \ #define RTL_EXPR_SEQUENCE(NODE) TREE_RTL_OPERAND_CHECK (NODE, RTL_EXPR, 0)
(*(rtx *) &RTL_EXPR_CHECK (NODE)->exp.operands[0]) #define RTL_EXPR_RTL(NODE) TREE_RTL_OPERAND_CHECK (NODE, RTL_EXPR, 1)
#define RTL_EXPR_RTL(NODE) (*(rtx *) &RTL_EXPR_CHECK (NODE)->exp.operands[1])
/* In a WITH_CLEANUP_EXPR node. */ /* In a WITH_CLEANUP_EXPR node. */
#define WITH_CLEANUP_EXPR_RTL(NODE) \ #define WITH_CLEANUP_EXPR_RTL(NODE) \
(*(rtx *) &WITH_CLEANUP_EXPR_CHECK (NODE)->exp.operands[2]) TREE_RTL_OPERAND_CHECK (NODE, WITH_CLEANUP_EXPR, 2)
/* In a CONSTRUCTOR node. */ /* In a CONSTRUCTOR node. */
#define CONSTRUCTOR_ELTS(NODE) TREE_OPERAND (CONSTRUCTOR_CHECK (NODE), 1) #define CONSTRUCTOR_ELTS(NODE) TREE_OPERAND_CHECK_CODE (NODE, CONSTRUCTOR, 1)
/* In ordinary expression nodes. */ /* In ordinary expression nodes. */
#define TREE_OPERAND(NODE, I) (EXPR_CHECK (NODE)->exp.operands[I]) #define TREE_OPERAND(NODE, I) TREE_OPERAND_CHECK (NODE, I)
#define TREE_COMPLEXITY(NODE) (EXPR_CHECK (NODE)->exp.complexity) #define TREE_COMPLEXITY(NODE) (EXPR_CHECK (NODE)->exp.complexity)
/* In a LABELED_BLOCK_EXPR node. */ /* In a LABELED_BLOCK_EXPR node. */
#define LABELED_BLOCK_LABEL(NODE) \ #define LABELED_BLOCK_LABEL(NODE) \
TREE_OPERAND (LABELED_BLOCK_EXPR_CHECK (NODE), 0) TREE_OPERAND_CHECK_CODE (NODE, LABELED_BLOCK_EXPR, 0)
#define LABELED_BLOCK_BODY(NODE) \ #define LABELED_BLOCK_BODY(NODE) \
TREE_OPERAND (LABELED_BLOCK_EXPR_CHECK (NODE), 1) TREE_OPERAND_CHECK_CODE (NODE, LABELED_BLOCK_EXPR, 1)
/* In an EXIT_BLOCK_EXPR node. */ /* In an EXIT_BLOCK_EXPR node. */
#define EXIT_BLOCK_LABELED_BLOCK(NODE) \ #define EXIT_BLOCK_LABELED_BLOCK(NODE) \
TREE_OPERAND (EXIT_BLOCK_EXPR_CHECK (NODE), 0) TREE_OPERAND_CHECK_CODE (NODE, EXIT_BLOCK_EXPR, 0)
#define EXIT_BLOCK_RETURN(NODE) TREE_OPERAND (EXIT_BLOCK_EXPR_CHECK (NODE), 1) #define EXIT_BLOCK_RETURN(NODE) TREE_OPERAND_CHECK_CODE (NODE, EXIT_BLOCK_EXPR, 1)
/* In a LOOP_EXPR node. */ /* In a LOOP_EXPR node. */
#define LOOP_EXPR_BODY(NODE) TREE_OPERAND (LOOP_EXPR_CHECK (NODE), 0) #define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
/* In an EXPR_WITH_FILE_LOCATION node. */ /* In an EXPR_WITH_FILE_LOCATION node. */
#define EXPR_WFL_EMIT_LINE_NOTE(NODE) \ #define EXPR_WFL_EMIT_LINE_NOTE(NODE) \
(EXPR_WITH_FILE_LOCATION_CHECK (NODE)->common.public_flag) (EXPR_WITH_FILE_LOCATION_CHECK (NODE)->common.public_flag)
#define EXPR_WFL_NODE(NODE) \ #define EXPR_WFL_NODE(NODE) \
TREE_OPERAND (EXPR_WITH_FILE_LOCATION_CHECK (NODE), 0) TREE_OPERAND_CHECK_CODE (NODE, EXPR_WITH_FILE_LOCATION, 0)
#define EXPR_WFL_FILENAME_NODE(NODE) \ #define EXPR_WFL_FILENAME_NODE(NODE) \
TREE_OPERAND (EXPR_WITH_FILE_LOCATION_CHECK (NODE), 1) TREE_OPERAND_CHECK_CODE (NODE, EXPR_WITH_FILE_LOCATION, 1)
#define EXPR_WFL_FILENAME(NODE) \ #define EXPR_WFL_FILENAME(NODE) \
IDENTIFIER_POINTER (EXPR_WFL_FILENAME_NODE (NODE)) IDENTIFIER_POINTER (EXPR_WFL_FILENAME_NODE (NODE))
/* ??? Java uses this in all expressions. */ /* ??? Java uses this in all expressions. */
...@@ -882,9 +923,9 @@ struct tree_vec GTY(()) ...@@ -882,9 +923,9 @@ struct tree_vec GTY(())
(EXPR_WFL_LINECOL(NODE) = ((LINE) << 12) | ((COL) & 0xfff)) (EXPR_WFL_LINECOL(NODE) = ((LINE) << 12) | ((COL) & 0xfff))
/* In a TARGET_EXPR node. */ /* In a TARGET_EXPR node. */
#define TARGET_EXPR_SLOT(NODE) TREE_OPERAND (TARGET_EXPR_CHECK (NODE), 0) #define TARGET_EXPR_SLOT(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 0)
#define TARGET_EXPR_INITIAL(NODE) TREE_OPERAND (TARGET_EXPR_CHECK (NODE), 1) #define TARGET_EXPR_INITIAL(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 1)
#define TARGET_EXPR_CLEANUP(NODE) TREE_OPERAND (TARGET_EXPR_CHECK (NODE), 2) #define TARGET_EXPR_CLEANUP(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 2)
struct tree_exp GTY(()) struct tree_exp GTY(())
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment