[cxx-conversion] Change check functions from templates to overloads. (issue6256075)
Lawrence Crowl
crowl@google.com
Thu May 31 03:49:00 GMT 2012
Change the check functions from templates to overloads.
Add "set unwindonsignal on" to gdbinit.in to gracefully handle aborts
in functions used from gdb.
Tested on x86-64.
Index: gcc/ChangeLog.cxx-conversion
2012-05-30 Lawrence Crowl <crowl@google.com>
* tree.h (tree_check): Change from template to const overload.
(tree_not_check): Likewise.
(tree_check2): Likewise.
(tree_not_check2): Likewise.
(tree_check3): Likewise.
(tree_not_check3): Likewise.
(tree_check4): Likewise.
(tree_not_check4): Likewise.
(tree_check5): Likewise.
(tree_not_check5): Likewise.
(contains_struct_check): Likewise.
(tree_class_check): Likewise.
(tree_range_check): Likewise.
(omp_clause_subcode_check): Likewise.
(omp_clause_range_check): Likewise.
(expr_check): Likewise.
(non_type_check): Likewise.
(tree_vec_elt_check): Likewise.
(omp_clause_elt_check): Likewise.
(tree_operand_check): Likewise.
(tree_operand_check_code): Likewise.
(tree_operand_length): Merge duplicate copy.
* gdbinit.in (set unwindonsignal on): New.
Index: gcc/tree.h
===================================================================
--- gcc/tree.h (revision 187989)
+++ gcc/tree.h (working copy)
@@ -3598,18 +3598,17 @@ union GTY ((ptr_alias (union lang_tree_n
};
#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-template <typename Tree>
-inline Tree
-tree_check (Tree __t, const char *__f, int __l, const char *__g, tree_code __c)
+
+inline tree
+tree_check (tree __t, const char *__f, int __l, const char *__g, tree_code __c)
{
if (TREE_CODE (__t) != __c)
tree_check_failed (__t, __f, __l, __g, __c, 0);
return __t;
}
-template <typename Tree>
-inline Tree
-tree_not_check (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_not_check (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c)
{
if (TREE_CODE (__t) == __c)
@@ -3617,9 +3616,8 @@ tree_not_check (Tree __t, const char *__
return __t;
}
-template <typename Tree>
-inline Tree
-tree_check2 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_check2 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2)
{
if (TREE_CODE (__t) != __c1
@@ -3628,9 +3626,8 @@ tree_check2 (Tree __t, const char *__f,
return __t;
}
-template <typename Tree>
-inline Tree
-tree_not_check2 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_not_check2 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2)
{
if (TREE_CODE (__t) == __c1
@@ -3639,9 +3636,8 @@ tree_not_check2 (Tree __t, const char *_
return __t;
}
-template <typename Tree>
-inline Tree
-tree_check3 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_check3 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
{
if (TREE_CODE (__t) != __c1
@@ -3651,9 +3647,8 @@ tree_check3 (Tree __t, const char *__f,
return __t;
}
-template <typename Tree>
-inline Tree
-tree_not_check3 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_not_check3 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
{
if (TREE_CODE (__t) == __c1
@@ -3663,9 +3658,8 @@ tree_not_check3 (Tree __t, const char *_
return __t;
}
-template <typename Tree>
-inline Tree
-tree_check4 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_check4 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
enum tree_code __c4)
{
@@ -3677,9 +3671,8 @@ tree_check4 (Tree __t, const char *__f,
return __t;
}
-template <typename Tree>
-inline Tree
-tree_not_check4 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_not_check4 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
enum tree_code __c4)
{
@@ -3691,9 +3684,8 @@ tree_not_check4 (Tree __t, const char *_
return __t;
}
-template <typename Tree>
-inline Tree
-tree_check5 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_check5 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
enum tree_code __c4, enum tree_code __c5)
{
@@ -3706,9 +3698,8 @@ tree_check5 (Tree __t, const char *__f,
return __t;
}
-template <typename Tree>
-inline Tree
-tree_not_check5 (Tree __t, const char *__f, int __l, const char *__g,
+inline tree
+tree_not_check5 (tree __t, const char *__f, int __l, const char *__g,
enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
enum tree_code __c4, enum tree_code __c5)
{
@@ -3721,9 +3712,8 @@ tree_not_check5 (Tree __t, const char *_
return __t;
}
-template <typename Tree>
-inline Tree
-contains_struct_check (Tree __t, const enum tree_node_structure_enum __s,
+inline tree
+contains_struct_check (tree __t, const enum tree_node_structure_enum __s,
const char *__f, int __l, const char *__g)
{
if (tree_contains_struct[TREE_CODE(__t)][__s] != 1)
@@ -3731,9 +3721,8 @@ contains_struct_check (Tree __t, const e
return __t;
}
-template <typename Tree>
-inline Tree
-tree_class_check (Tree __t, const enum tree_code_class __class,
+inline tree
+tree_class_check (tree __t, const enum tree_code_class __class,
const char *__f, int __l, const char *__g)
{
if (TREE_CODE_CLASS (TREE_CODE(__t)) != __class)
@@ -3741,21 +3730,8 @@ tree_class_check (Tree __t, const enum t
return __t;
}
-/* Compute the number of operands in an expression node NODE. For
- tcc_vl_exp nodes like CALL_EXPRs, this is stored in the node itself,
- otherwise it is looked up from the node's code. */
-static inline int
-tree_operand_length (const_tree node)
-{
- if (VL_EXP_CLASS_P (node))
- return VL_EXP_OPERAND_LENGTH (node);
- else
- return TREE_CODE_LENGTH (TREE_CODE (node));
-}
-
-template <typename Tree>
-inline Tree
-tree_range_check (Tree __t,
+inline tree
+tree_range_check (tree __t,
enum tree_code __code1, enum tree_code __code2,
const char *__f, int __l, const char *__g)
{
@@ -3764,9 +3740,8 @@ tree_range_check (Tree __t,
return __t;
}
-template <typename Tree>
-inline Tree
-omp_clause_subcode_check (Tree __t, enum omp_clause_code __code,
+inline tree
+omp_clause_subcode_check (tree __t, enum omp_clause_code __code,
const char *__f, int __l, const char *__g)
{
if (TREE_CODE (__t) != OMP_CLAUSE)
@@ -3776,9 +3751,8 @@ omp_clause_subcode_check (Tree __t, enum
return __t;
}
-template <typename Tree>
-inline Tree
-omp_clause_range_check (Tree __t,
+inline tree
+omp_clause_range_check (tree __t,
enum omp_clause_code __code1,
enum omp_clause_code __code2,
const char *__f, int __l, const char *__g)
@@ -3792,9 +3766,9 @@ omp_clause_range_check (Tree __t,
}
/* These checks have to be special cased. */
-template <typename Tree>
-inline Tree
-expr_check (Tree __t, const char *__f, int __l, const char *__g)
+
+inline tree
+expr_check (tree __t, const char *__f, int __l, const char *__g)
{
char const __c = TREE_CODE_CLASS (TREE_CODE (__t));
if (!IS_EXPR_CODE_CLASS (__c))
@@ -3803,18 +3777,17 @@ expr_check (Tree __t, const char *__f, i
}
/* These checks have to be special cased. */
-template <typename Tree>
-inline Tree
-non_type_check (Tree __t, const char *__f, int __l, const char *__g)
+
+inline tree
+non_type_check (tree __t, const char *__f, int __l, const char *__g)
{
if (TYPE_P (__t))
tree_not_class_check_failed (__t, tcc_type, __f, __l, __g);
return __t;
}
-template <typename Tree>
inline tree *
-tree_vec_elt_check (Tree __t, int __i,
+tree_vec_elt_check (tree __t, int __i,
const char *__f, int __l, const char *__g)
{
if (TREE_CODE (__t) != TREE_VEC)
@@ -3824,9 +3797,8 @@ tree_vec_elt_check (Tree __t, int __i,
return &CONST_CAST_TREE (__t)->vec.a[__i];
}
-template <typename Tree>
-inline Tree *
-omp_clause_elt_check (Tree __t, int __i,
+inline tree *
+omp_clause_elt_check (tree __t, int __i,
const char *__f, int __l, const char *__g)
{
if (TREE_CODE (__t) != OMP_CLAUSE)
@@ -3836,10 +3808,232 @@ omp_clause_elt_check (Tree __t, int __i,
return &__t->omp_clause.ops[__i];
}
+inline const_tree
+tree_check (const_tree __t, const char *__f, int __l, const char *__g,
+ tree_code __c)
+{
+ if (TREE_CODE (__t) != __c)
+ tree_check_failed (__t, __f, __l, __g, __c, 0);
+ return __t;
+}
+
+inline const_tree
+tree_not_check (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c)
+{
+ if (TREE_CODE (__t) == __c)
+ tree_not_check_failed (__t, __f, __l, __g, __c, 0);
+ return __t;
+}
+
+inline const_tree
+tree_check2 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2)
+{
+ if (TREE_CODE (__t) != __c1
+ && TREE_CODE (__t) != __c2)
+ tree_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
+ return __t;
+}
+
+inline const_tree
+tree_not_check2 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2)
+{
+ if (TREE_CODE (__t) == __c1
+ || TREE_CODE (__t) == __c2)
+ tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
+ return __t;
+}
+
+inline const_tree
+tree_check3 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
+{
+ if (TREE_CODE (__t) != __c1
+ && TREE_CODE (__t) != __c2
+ && TREE_CODE (__t) != __c3)
+ tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
+ return __t;
+}
+
+inline const_tree
+tree_not_check3 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
+{
+ if (TREE_CODE (__t) == __c1
+ || TREE_CODE (__t) == __c2
+ || TREE_CODE (__t) == __c3)
+ tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
+ return __t;
+}
+
+inline const_tree
+tree_check4 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
+ enum tree_code __c4)
+{
+ if (TREE_CODE (__t) != __c1
+ && TREE_CODE (__t) != __c2
+ && TREE_CODE (__t) != __c3
+ && TREE_CODE (__t) != __c4)
+ tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
+ return __t;
+}
+
+inline const_tree
+tree_not_check4 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
+ enum tree_code __c4)
+{
+ if (TREE_CODE (__t) == __c1
+ || TREE_CODE (__t) == __c2
+ || TREE_CODE (__t) == __c3
+ || TREE_CODE (__t) == __c4)
+ tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
+ return __t;
+}
+
+inline const_tree
+tree_check5 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
+ enum tree_code __c4, enum tree_code __c5)
+{
+ if (TREE_CODE (__t) != __c1
+ && TREE_CODE (__t) != __c2
+ && TREE_CODE (__t) != __c3
+ && TREE_CODE (__t) != __c4
+ && TREE_CODE (__t) != __c5)
+ tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
+ return __t;
+}
+
+inline const_tree
+tree_not_check5 (const_tree __t, const char *__f, int __l, const char *__g,
+ enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
+ enum tree_code __c4, enum tree_code __c5)
+{
+ if (TREE_CODE (__t) == __c1
+ || TREE_CODE (__t) == __c2
+ || TREE_CODE (__t) == __c3
+ || TREE_CODE (__t) == __c4
+ || TREE_CODE (__t) == __c5)
+ tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
+ return __t;
+}
+
+inline const_tree
+contains_struct_check (const_tree __t, const enum tree_node_structure_enum __s,
+ const char *__f, int __l, const char *__g)
+{
+ if (tree_contains_struct[TREE_CODE(__t)][__s] != 1)
+ tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
+ return __t;
+}
+
+inline const_tree
+tree_class_check (const_tree __t, const enum tree_code_class __class,
+ const char *__f, int __l, const char *__g)
+{
+ if (TREE_CODE_CLASS (TREE_CODE(__t)) != __class)
+ tree_class_check_failed (__t, __class, __f, __l, __g);
+ return __t;
+}
+
+inline const_tree
+tree_range_check (const_tree __t,
+ enum tree_code __code1, enum tree_code __code2,
+ const char *__f, int __l, const char *__g)
+{
+ if (TREE_CODE (__t) < __code1 || TREE_CODE (__t) > __code2)
+ tree_range_check_failed (__t, __f, __l, __g, __code1, __code2);
+ return __t;
+}
+
+inline const_tree
+omp_clause_subcode_check (const_tree __t, enum omp_clause_code __code,
+ const char *__f, int __l, const char *__g)
+{
+ if (TREE_CODE (__t) != OMP_CLAUSE)
+ tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
+ if (__t->omp_clause.code != __code)
+ omp_clause_check_failed (__t, __f, __l, __g, __code);
+ return __t;
+}
+
+inline const_tree
+omp_clause_range_check (const_tree __t,
+ enum omp_clause_code __code1,
+ enum omp_clause_code __code2,
+ const char *__f, int __l, const char *__g)
+{
+ if (TREE_CODE (__t) != OMP_CLAUSE)
+ tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
+ if ((int) __t->omp_clause.code < (int) __code1
+ || (int) __t->omp_clause.code > (int) __code2)
+ omp_clause_range_check_failed (__t, __f, __l, __g, __code1, __code2);
+ return __t;
+}
+
+inline const_tree
+expr_check (const_tree __t, const char *__f, int __l, const char *__g)
+{
+ char const __c = TREE_CODE_CLASS (TREE_CODE (__t));
+ if (!IS_EXPR_CODE_CLASS (__c))
+ tree_class_check_failed (__t, tcc_expression, __f, __l, __g);
+ return __t;
+}
+
+inline const_tree
+non_type_check (const_tree __t, const char *__f, int __l, const char *__g)
+{
+ if (TYPE_P (__t))
+ tree_not_class_check_failed (__t, tcc_type, __f, __l, __g);
+ return __t;
+}
+
+inline const_tree *
+tree_vec_elt_check (const_tree __t, int __i,
+ const char *__f, int __l, const char *__g)
+{
+ if (TREE_CODE (__t) != TREE_VEC)
+ tree_check_failed (__t, __f, __l, __g, TREE_VEC, 0);
+ if (__i < 0 || __i >= __t->vec.length)
+ tree_vec_elt_check_failed (__i, __t->vec.length, __f, __l, __g);
+ return CONST_CAST (const_tree *, &__t->vec.a[__i]);
+ //return &__t->vec.a[__i];
+}
+
+inline const_tree *
+omp_clause_elt_check (const_tree __t, int __i,
+ const char *__f, int __l, const char *__g)
+{
+ if (TREE_CODE (__t) != OMP_CLAUSE)
+ tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
+ if (__i < 0 || __i >= omp_clause_num_ops [__t->omp_clause.code])
+ omp_clause_operand_check_failed (__i, __t, __f, __l, __g);
+ return CONST_CAST (const_tree *, &__t->omp_clause.ops[__i]);
+}
+
+#endif
+
+/* Compute the number of operands in an expression node NODE. For
+ tcc_vl_exp nodes like CALL_EXPRs, this is stored in the node itself,
+ otherwise it is looked up from the node's code. */
+static inline int
+tree_operand_length (const_tree node)
+{
+ if (VL_EXP_CLASS_P (node))
+ return VL_EXP_OPERAND_LENGTH (node);
+ else
+ return TREE_CODE_LENGTH (TREE_CODE (node));
+}
+
+#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
+
/* Special checks for TREE_OPERANDs. */
-template <typename Tree>
inline tree *
-tree_operand_check (Tree __t, int __i,
+tree_operand_check (tree __t, int __i,
const char *__f, int __l, const char *__g)
{
const_tree __u = EXPR_CHECK (__t);
@@ -3848,9 +4042,8 @@ tree_operand_check (Tree __t, int __i,
return &CONST_CAST_TREE (__u)->exp.operands[__i];
}
-template <typename Tree>
-inline Tree *
-tree_operand_check_code (Tree __t, enum tree_code __code, int __i,
+inline tree *
+tree_operand_check_code (tree __t, enum tree_code __code, int __i,
const char *__f, int __l, const char *__g)
{
if (TREE_CODE (__t) != __code)
@@ -3860,18 +4053,25 @@ tree_operand_check_code (Tree __t, enum
return &__t->exp.operands[__i];
}
-#else
+inline const_tree *
+tree_operand_check (const_tree __t, int __i,
+ const char *__f, int __l, const char *__g)
+{
+ const_tree __u = EXPR_CHECK (__t);
+ if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__u))
+ tree_operand_check_failed (__i, __u, __f, __l, __g);
+ return CONST_CAST (const_tree *, &__u->exp.operands[__i]);
+}
-/* Compute the number of operands in an expression node NODE. For
- tcc_vl_exp nodes like CALL_EXPRs, this is stored in the node itself,
- otherwise it is looked up from the node's code. */
-static inline int
-tree_operand_length (const_tree node)
+inline const_tree *
+tree_operand_check_code (const_tree __t, enum tree_code __code, int __i,
+ const char *__f, int __l, const char *__g)
{
- if (VL_EXP_CLASS_P (node))
- return VL_EXP_OPERAND_LENGTH (node);
- else
- return TREE_CODE_LENGTH (TREE_CODE (node));
+ if (TREE_CODE (__t) != __code)
+ tree_check_failed (__t, __f, __l, __g, __code, 0);
+ if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__t))
+ tree_operand_check_failed (__i, __t, __f, __l, __g);
+ return CONST_CAST (const_tree *, &__t->exp.operands[__i]);
}
#endif
Index: gcc/gdbinit.in
===================================================================
--- gcc/gdbinit.in (revision 187989)
+++ gcc/gdbinit.in (working copy)
@@ -190,6 +190,9 @@ macro define __LINE__ 1
# These are used in accessor macros.
skip "tree.h"
+# Gracefully handle aborts in functions used from gdb.
+set unwindonsignal on
+
# Put breakpoints at exit and fancy_abort in case abort is mapped
# to either fprintf/exit or fancy_abort.
b fancy_abort
--
This patch is available for review at http://codereview.appspot.com/6256075
More information about the Gcc-patches
mailing list