diff options
Diffstat (limited to 'gcc/tree.h')
-rw-r--r-- | gcc/tree.h | 94 |
1 files changed, 77 insertions, 17 deletions
@@ -307,6 +307,34 @@ struct tree_common GTY(()) tree_check_failed (__t, (CODE), __FILE__, __LINE__, __FUNCTION__); \ __t; }) +#define TREE_CHECK2(T, CODE1, CODE2) __extension__ \ +({ const tree __t = (T); \ + if (TREE_CODE (__t) != (CODE1) \ + && TREE_CODE (__t) != (CODE2)) \ + tree_check2_failed (__t, (CODE1), (CODE2), __FILE__, __LINE__, \ + __FUNCTION__); \ + __t; }) + +#define TREE_CHECK3(T, CODE1, CODE2, CODE3) __extension__ \ +({ const tree __t = (T); \ + if (TREE_CODE (__t) != (CODE1) \ + && TREE_CODE (__t) != (CODE2) \ + && TREE_CODE (__t) != (CODE3)) \ + tree_check3_failed (__t, (CODE1), (CODE2), (CODE3), __FILE__, \ + __LINE__, __FUNCTION__); \ + __t; }) + +#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) __extension__ \ +({ const tree __t = (T); \ + if (TREE_CODE (__t) != (CODE1) \ + && TREE_CODE (__t) != (CODE2) \ + && TREE_CODE (__t) != (CODE3) \ + && TREE_CODE (__t) != (CODE4) \ + && TREE_CODE (__t) != (CODE5)) \ + tree_check5_failed (__t, (CODE1), (CODE2), (CODE3), (CODE4), \ + (CODE5), __FILE__, __LINE__, __FUNCTION__); \ + __t; }) + #define TREE_CLASS_CHECK(T, CLASS) __extension__ \ ({ const tree __t = (T); \ if (TREE_CODE_CLASS (TREE_CODE(__t)) != (CLASS)) \ @@ -367,6 +395,17 @@ struct tree_common GTY(()) extern void tree_check_failed (const tree, enum tree_code, const char *, int, const char *) ATTRIBUTE_NORETURN; +extern void tree_check2_failed (const tree, enum tree_code, enum tree_code, + const char *, int, const char *) + ATTRIBUTE_NORETURN; +extern void tree_check3_failed (const tree, enum tree_code, enum tree_code, + enum tree_code, const char *, int, + const char *) + ATTRIBUTE_NORETURN; +extern void tree_check5_failed (const tree, enum tree_code, enum tree_code, + enum tree_code, enum tree_code, enum tree_code, + const char *, int, const char *) + ATTRIBUTE_NORETURN; extern void tree_class_check_failed (const tree, int, const char *, int, const char *) ATTRIBUTE_NORETURN; @@ -380,12 +419,15 @@ extern void tree_operand_check_failed (int, enum tree_code, #else /* not ENABLE_TREE_CHECKING, or not gcc */ -#define TREE_CHECK(T, CODE) (T) -#define TREE_CLASS_CHECK(T, CODE) (T) -#define EXPR_CHECK(T) (T) -#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_CHECK(T, CODE) (T) +#define TREE_CHECK2(T, CODE1, CODE2) (T) +#define TREE_CHECK3(T, CODE1, CODE2, CODE3) (T) +#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) (T) +#define TREE_CLASS_CHECK(T, CODE) (T) +#define EXPR_CHECK(T) (T) +#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 @@ -396,6 +438,17 @@ extern void tree_operand_check_failed (int, enum tree_code, #define DECL_CHECK(T) TREE_CLASS_CHECK (T, 'd') #define CST_CHECK(T) TREE_CLASS_CHECK (T, 'c') #define STMT_CHECK(T) TREE_CLASS_CHECK (T, 's') +#define FUNC_OR_METHOD_CHECK(T) TREE_CHECK2 (T, FUNCTION_TYPE, METHOD_TYPE) + +#define SET_ARRAY_OR_VECTOR_CHECK(T) \ + TREE_CHECK3 (T, ARRAY_TYPE, SET_TYPE, VECTOR_TYPE) + +#define REC_OR_UNION_CHECK(T) \ + TREE_CHECK3 (T, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE) + +#define NUMERICAL_TYPE_CHECK(T) \ + TREE_CHECK5 (T, INTEGER_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, \ + CHAR_TYPE, REAL_TYPE) /* In all nodes that are expressions, this is the data type of the expression. In POINTER_TYPE nodes, this is the type that the pointer points to. @@ -945,24 +998,31 @@ struct tree_block GTY(()) /* Define fields and accessors for nodes representing data types. */ /* See tree.def for documentation of the use of these fields. - Look at the documentation of the various ..._TYPE tree codes. */ + Look at the documentation of the various ..._TYPE tree codes. + + Note that the type.values, type.minval, and type.maxval fiels are + overloaded and used for different macros in different kinds of types. + Each macro must check to ensure the tree node is of the proper kind of + type. Note also that some of the front-ends also overload these fields, + so they must be checked as well. */ #define TYPE_UID(NODE) (TYPE_CHECK (NODE)->type.uid) #define TYPE_SIZE(NODE) (TYPE_CHECK (NODE)->type.size) #define TYPE_SIZE_UNIT(NODE) (TYPE_CHECK (NODE)->type.size_unit) #define TYPE_MODE(NODE) (TYPE_CHECK (NODE)->type.mode) -#define TYPE_VALUES(NODE) (TYPE_CHECK (NODE)->type.values) -#define TYPE_DOMAIN(NODE) (TYPE_CHECK (NODE)->type.values) -#define TYPE_FIELDS(NODE) (TYPE_CHECK (NODE)->type.values) -#define TYPE_METHODS(NODE) (TYPE_CHECK (NODE)->type.maxval) -#define TYPE_VFIELD(NODE) (TYPE_CHECK (NODE)->type.minval) -#define TYPE_ARG_TYPES(NODE) (TYPE_CHECK (NODE)->type.values) -#define TYPE_METHOD_BASETYPE(NODE) (TYPE_CHECK (NODE)->type.maxval) -#define TYPE_OFFSET_BASETYPE(NODE) (TYPE_CHECK (NODE)->type.maxval) +#define TYPE_ORIG_SIZE_TYPE(NODE) (INTEGER_TYPE_CHECK (NODE)->type.values) +#define TYPE_VALUES(NODE) (ENUMERAL_TYPE_CHECK (NODE)->type.values) +#define TYPE_DOMAIN(NODE) (SET_ARRAY_OR_VECTOR_CHECK (NODE)->type.values) +#define TYPE_FIELDS(NODE) (REC_OR_UNION_CHECK (NODE)->type.values) +#define TYPE_METHODS(NODE) (REC_OR_UNION_CHECK (NODE)->type.maxval) +#define TYPE_VFIELD(NODE) (REC_OR_UNION_CHECK (NODE)->type.minval) +#define TYPE_ARG_TYPES(NODE) (FUNC_OR_METHOD_CHECK (NODE)->type.values) +#define TYPE_METHOD_BASETYPE(NODE) (FUNC_OR_METHOD_CHECK (NODE)->type.maxval) +#define TYPE_OFFSET_BASETYPE(NODE) (OFFSET_TYPE_CHECK (NODE)->type.maxval) #define TYPE_POINTER_TO(NODE) (TYPE_CHECK (NODE)->type.pointer_to) #define TYPE_REFERENCE_TO(NODE) (TYPE_CHECK (NODE)->type.reference_to) -#define TYPE_MIN_VALUE(NODE) (TYPE_CHECK (NODE)->type.minval) -#define TYPE_MAX_VALUE(NODE) (TYPE_CHECK (NODE)->type.maxval) +#define TYPE_MIN_VALUE(NODE) (NUMERICAL_TYPE_CHECK (NODE)->type.minval) +#define TYPE_MAX_VALUE(NODE) (NUMERICAL_TYPE_CHECK (NODE)->type.maxval) #define TYPE_PRECISION(NODE) (TYPE_CHECK (NODE)->type.precision) #define TYPE_SYMTAB_ADDRESS(NODE) (TYPE_CHECK (NODE)->type.symtab.address) #define TYPE_SYMTAB_POINTER(NODE) (TYPE_CHECK (NODE)->type.symtab.pointer) |