Squelch no-longer-necessary casting macros

Zack Weinberg zack@codesourcery.com
Wed Jul 21 03:43:00 GMT 2004


We have a number of macros whose sole purpose is to inject casts to
HOST_WIDE_INT into function calls.  These casts were necessary when we
could not count on the presence of a prototype for the function being
called, but now we can, and the casts can also mask bugs.  For
instance, plus_constant takes an rtx and a HOST_WIDE_INT, but if you
give it an rtx and another rtx (say, the result of GEN_INT) by
mistake, it silently takes that and treats the rtx address as the
constant to add.  If the cast-macro weren't there, we would have
gotten a pointer-to-integer conversion warning.

This patch removes all of these macros that I could find.  There may
be more lurking.  Bootstrapped amd64-linux, all languages, but ware
that this has a decent chance of exposing bugs in target-dependent
code (the hypothetical problem described in the previous paragraph was
in fact a real bug in arm.c, which motivated me to write this patch).
I will check this in now, and help fix such bugs as they appear.

zw

        * rtl.h (plus_constant): Delete.
        (plus_constant_wide): Rename to plus_constant.
        (plus_constant_for_output_wide): Delete vestigial prototype.
        (GEN_INT): Remove unnecessary cast.
        * tree.h (build_int_2, size_int_type): Delete.
        (build_int_2_wide): Rename to build_int_2.
        (size_int_wide): Rename to size_int_kind.
        (size_int_type_wide): Rename to size_int_type.
        (size_int, ssize_int, bitsize_int, sbitsize_int): Use size_int_kind.
        Remove unnecessary cast.
        * tree.c (build_int_2_wide): Rename build_int_2; update comment.
        * explow.c (plus_constant_wide): Rename plus_constant; update comment.
        * fold-const.c (size_int_wide): Rename size_int_kind. Use size_int_type.
        (size_int_type_wide): Rename size_int_type.
        (int_const_binop): Use size_int_type.
        * c-lex.c (interpret_integer): Use build_int_2.
        * final.c (split_double): Remove unnecessary casts.
        * tree-ssa-ccp.c (maybe_fold_offset_to_array_ref): Use build_int_2.

===================================================================
Index: gcc/rtl.h
--- gcc/rtl.h	17 Jul 2004 00:31:07 -0000	1.491
+++ gcc/rtl.h	20 Jul 2004 22:51:40 -0000
@@ -1564,8 +1564,6 @@ extern int generating_concat_p;
 /* In expmed.c */
 extern int ceil_log2 (unsigned HOST_WIDE_INT);
 
-#define plus_constant(X, C) plus_constant_wide ((X), (HOST_WIDE_INT) (C))
-
 /* In builtins.c */
 extern rtx expand_builtin_expect_jump (tree, rtx, rtx);
 extern void purge_builtin_constant_p (void);
@@ -1573,8 +1571,7 @@ extern void purge_builtin_constant_p (vo
 /* In explow.c */
 extern void set_stack_check_libfunc (rtx);
 extern HOST_WIDE_INT trunc_int_for_mode	(HOST_WIDE_INT, enum machine_mode);
-extern rtx plus_constant_wide (rtx, HOST_WIDE_INT);
-extern rtx plus_constant_for_output_wide (rtx, HOST_WIDE_INT);
+extern rtx plus_constant (rtx, HOST_WIDE_INT);
 extern void optimize_save_area_alloca (void);
 
 /* In emit-rtl.c */
@@ -2019,9 +2016,7 @@ extern rtx gen_rtx_REG (enum machine_mod
 extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int);
 extern rtx gen_rtx_MEM (enum machine_mode, rtx);
 
-/* We need the cast here to ensure that we get the same result both with
-   and without prototypes.  */
-#define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (HOST_WIDE_INT) (N))
+#define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (N))
 
 /* Virtual registers are used during RTL generation to refer to locations into
    the stack frame when the actual location isn't known until RTL generation
===================================================================
Index: gcc/tree.h
--- gcc/tree.h	20 Jul 2004 13:56:18 -0000	1.565
+++ gcc/tree.h	20 Jul 2004 22:51:40 -0000
@@ -2677,9 +2677,6 @@ extern tree maybe_get_identifier (const 
 
 /* Construct various types of nodes.  */
 
-#define build_int_2(LO, HI)  \
-  build_int_2_wide ((unsigned HOST_WIDE_INT) (LO), (HOST_WIDE_INT) (HI))
-
 extern tree build (enum tree_code, tree, ...);
 extern tree build_nt (enum tree_code, ...);
 
@@ -2707,7 +2704,7 @@ extern tree build4_stat (enum tree_code,
 			 tree MEM_STAT_DECL);
 #define build4(c,t1,t2,t3,t4,t5) build4_stat (c,t1,t2,t3,t4,t5 MEM_STAT_INFO)
 
-extern tree build_int_2_wide (unsigned HOST_WIDE_INT, HOST_WIDE_INT);
+extern tree build_int_2 (unsigned HOST_WIDE_INT, HOST_WIDE_INT);
 extern tree build_vector (tree, tree);
 extern tree build_constructor (tree, tree);
 extern tree build_real_from_int_cst (tree, tree);
@@ -3049,14 +3046,13 @@ extern GTY(()) tree sizetype_tab[(int) T
 
 extern tree size_binop (enum tree_code, tree, tree);
 extern tree size_diffop (tree, tree);
-extern tree size_int_wide (HOST_WIDE_INT, enum size_type_kind);
-extern tree size_int_type_wide (HOST_WIDE_INT, tree);
+extern tree size_int_kind (HOST_WIDE_INT, enum size_type_kind);
+extern tree size_int_type (HOST_WIDE_INT, tree);
 
-#define size_int_type(L, T) size_int_type_wide ((HOST_WIDE_INT) (L), T)
-#define size_int(L) size_int_wide ((HOST_WIDE_INT) (L), SIZETYPE)
-#define ssize_int(L) size_int_wide ((HOST_WIDE_INT) (L), SSIZETYPE)
-#define bitsize_int(L) size_int_wide ((HOST_WIDE_INT) (L), BITSIZETYPE)
-#define sbitsize_int(L) size_int_wide ((HOST_WIDE_INT) (L), SBITSIZETYPE)
+#define size_int(L) size_int_kind (L, SIZETYPE)
+#define ssize_int(L) size_int_kind (L, SSIZETYPE)
+#define bitsize_int(L) size_int_kind (L, BITSIZETYPE)
+#define sbitsize_int(L) size_int_kind (L, SBITSIZETYPE)
 
 extern tree round_up (tree, int);
 extern tree round_down (tree, int);
===================================================================
Index: gcc/tree.c
--- gcc/tree.c	20 Jul 2004 13:56:18 -0000	1.399
+++ gcc/tree.c	20 Jul 2004 22:51:40 -0000
@@ -422,12 +422,10 @@ copy_list (tree list)
 
 /* Return a newly constructed INTEGER_CST node whose constant value
    is specified by the two ints LOW and HI.
-   The TREE_TYPE is set to `int'.
-
-   This function should be used via the `build_int_2' macro.  */
+   The TREE_TYPE is set to `int'.  */
 
 tree
-build_int_2_wide (unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
+build_int_2 (unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
 {
   tree t = make_node (INTEGER_CST);
 
===================================================================
Index: gcc/explow.c
--- gcc/explow.c	16 Jul 2004 21:12:58 -0000	1.134
+++ gcc/explow.c	20 Jul 2004 22:51:40 -0000
@@ -71,12 +71,10 @@ trunc_int_for_mode (HOST_WIDE_INT c, enu
   return c;
 }
 
-/* Return an rtx for the sum of X and the integer C.
-
-   This function should be used via the `plus_constant' macro.  */
+/* Return an rtx for the sum of X and the integer C.  */
 
 rtx
-plus_constant_wide (rtx x, HOST_WIDE_INT c)
+plus_constant (rtx x, HOST_WIDE_INT c)
 {
   RTX_CODE code;
   rtx y;
===================================================================
Index: gcc/fold-const.c
--- gcc/fold-const.c	19 Jul 2004 12:45:44 -0000	1.425
+++ gcc/fold-const.c	20 Jul 2004 22:51:40 -0000
@@ -1398,7 +1398,7 @@ int_const_binop (enum tree_code code, tr
       && ((hi == 0 && (HOST_WIDE_INT) low >= 0)
 	  || (hi == -1 && (HOST_WIDE_INT) low < 0))
       && overflow == 0 && ! TREE_OVERFLOW (arg1) && ! TREE_OVERFLOW (arg2))
-    return size_int_type_wide (low, type);
+    return size_int_type (low, type);
   else
     {
       t = build_int_2 (low, hi);
@@ -1602,9 +1602,9 @@ size_htab_eq (const void *x, const void 
    bits are given by NUMBER and of the sizetype represented by KIND.  */
 
 tree
-size_int_wide (HOST_WIDE_INT number, enum size_type_kind kind)
+size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
 {
-  return size_int_type_wide (number, sizetype_tab[(int) kind]);
+  return size_int_type (number, sizetype_tab[(int) kind]);
 }
 
 /* Likewise, but the desired type is specified explicitly.  */
@@ -1614,7 +1614,7 @@ static GTY ((if_marked ("ggc_marked_p"),
      htab_t size_htab;
 
 tree
-size_int_type_wide (HOST_WIDE_INT number, tree type)
+size_int_type (HOST_WIDE_INT number, tree type)
 {
   void **slot;
 
@@ -1751,7 +1751,7 @@ fold_convert_const (enum tree_code code,
 	  if (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
 	      && !TREE_CONSTANT_OVERFLOW (arg1)
 	      && compare_tree_int (arg1, 10000) < 0)
-	    return size_int_type_wide (TREE_INT_CST_LOW (arg1), type);
+	    return size_int_type (TREE_INT_CST_LOW (arg1), type);
 
 	  /* Given an integer constant, make new constant with new type,
 	     appropriately sign-extended or truncated.  */
===================================================================
Index: gcc/c-lex.c
--- gcc/c-lex.c	30 Jun 2004 18:05:03 -0000	1.223
+++ gcc/c-lex.c	20 Jul 2004 22:51:40 -0000
@@ -521,7 +521,7 @@ interpret_integer (const cpp_token *toke
 
   integer = cpp_interpret_integer (parse_in, token, flags);
   integer = cpp_num_sign_extend (integer, options->precision);
-  value = build_int_2_wide (integer.low, integer.high);
+  value = build_int_2 (integer.low, integer.high);
 
   /* The type of a constant with a U suffix is straightforward.  */
   if (flags & CPP_N_UNSIGNED)
===================================================================
Index: gcc/final.c
--- gcc/final.c	17 Jul 2004 10:41:44 -0000	1.323
+++ gcc/final.c	20 Jul 2004 22:51:40 -0000
@@ -3665,8 +3665,8 @@ split_double (rtx value, rtx *first, rtx
 	}
 #endif
 
-      *first = GEN_INT ((HOST_WIDE_INT) l[0]);
-      *second = GEN_INT ((HOST_WIDE_INT) l[1]);
+      *first = GEN_INT (l[0]);
+      *second = GEN_INT (l[1]);
     }
 }
 
===================================================================
Index: gcc/tree-ssa-ccp.c
--- gcc/tree-ssa-ccp.c	16 Jul 2004 21:13:03 -0000	2.23
+++ gcc/tree-ssa-ccp.c	20 Jul 2004 22:51:40 -0000
@@ -1551,7 +1551,7 @@ maybe_fold_offset_to_array_ref (tree bas
 	  || lrem || hrem)
 	return NULL_TREE;
 
-      idx = build_int_2_wide (lquo, hquo);
+      idx = build_int_2 (lquo, hquo);
     }
 
   /* Assume the low bound is zero.  If there is a domain type, get the



More information about the Gcc-patches mailing list