Hi!

During the patch review of the C++ #embed optimization, Jason asked for
a macro for the common
((const unsigned char *) RAW_DATA_POINTER (value))[i]
and ditto with signed char patterns which appear in a lot of places.
In the just committed patch I've added
+#define RAW_DATA_UCHAR_ELT(NODE, I) \
+  (((const unsigned char *) RAW_DATA_POINTER (NODE))[I])
+#define RAW_DATA_SCHAR_ELT(NODE, I) \
+  (((const signed char *) RAW_DATA_POINTER (NODE))[I])
macros for that in tree.h.

The following patch is just a cleanup to use those macros where appropriate.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2024-12-06  Jakub Jelinek  <ja...@redhat.com>

gcc/
        * gimplify.cc (gimplify_init_ctor_eval): Use RAW_DATA_UCHAR_ELT
        macro.
        * gimple-fold.cc (fold_array_ctor_reference): Likewise.
        * tree-pretty-print.cc (dump_generic_node): Use RAW_DATA_UCHAR_ELT
        and RAW_DATA_SCHAR_ELT macros.
        * fold-const.cc (fold): Use RAW_DATA_UCHAR_ELT macro.
gcc/c/
        * c-parser.cc (c_parser_get_builtin_args, c_parser_expression,
        c_parser_expr_list): Use RAW_DATA_UCHAR_ELT macro.
        * c-typeck.cc (digest_init): Use RAW_DATA_UCHAR_ELT and
        RAW_DATA_SCHAR_ELT macros.
        (add_pending_init, maybe_split_raw_data): Use RAW_DATA_UCHAR_ELT
        macro.

--- gcc/gimplify.cc.jj  2024-12-02 11:08:52.077134419 +0100
+++ gcc/gimplify.cc     2024-12-05 19:05:53.921040446 +0100
@@ -5533,8 +5533,7 @@ gimplify_init_ctor_eval (tree object, ve
                    tree init
                      = build2 (INIT_EXPR, TREE_TYPE (cref), cref,
                                build_int_cst (TREE_TYPE (value),
-                                              ((const unsigned char *)
-                                               RAW_DATA_POINTER (value))[i]));
+                                              RAW_DATA_UCHAR_ELT (value, i)));
                    gimplify_and_add (init, pre_p);
                    ggc_free (init);
                  }
--- gcc/gimple-fold.cc.jj       2024-11-30 01:47:37.210351120 +0100
+++ gcc/gimple-fold.cc  2024-12-05 19:05:23.126471679 +0100
@@ -8389,9 +8389,7 @@ fold_array_ctor_reference (tree type, tr
            return NULL_TREE;
          *suboff += access_index.to_uhwi () * BITS_PER_UNIT;
          unsigned o = (access_index - wi::to_offset (elt->index)).to_uhwi ();
-         return build_int_cst (TREE_TYPE (val),
-                               ((const unsigned char *)
-                                RAW_DATA_POINTER (val))[o]);
+         return build_int_cst (TREE_TYPE (val), RAW_DATA_UCHAR_ELT (val, o));
        }
       if (!size && TREE_CODE (val) != CONSTRUCTOR)
        {
--- gcc/tree-pretty-print.cc.jj 2024-11-23 13:00:31.386984106 +0100
+++ gcc/tree-pretty-print.cc    2024-12-05 19:06:56.434165047 +0100
@@ -2625,11 +2625,9 @@ dump_generic_node (pretty_printer *pp, t
        {
          if (TYPE_UNSIGNED (TREE_TYPE (node))
              || TYPE_PRECISION (TREE_TYPE (node)) > CHAR_BIT)
-           pp_decimal_int (pp, ((const unsigned char *)
-                                RAW_DATA_POINTER (node))[i]);
+           pp_decimal_int (pp, RAW_DATA_UCHAR_ELT (node, i));
          else
-           pp_decimal_int (pp, ((const signed char *)
-                                RAW_DATA_POINTER (node))[i]);
+           pp_decimal_int (pp, RAW_DATA_SCHAR_ELT (node, i));
          if (i == RAW_DATA_LENGTH (node) - 1U)
            break;
          else if (i == 9 && RAW_DATA_LENGTH (node) > 20)
--- gcc/fold-const.cc.jj        2024-11-11 09:51:41.418810377 +0100
+++ gcc/fold-const.cc   2024-12-05 19:04:50.200932753 +0100
@@ -14001,8 +14001,7 @@ fold (tree expr)
                     - wi::to_offset (CONSTRUCTOR_ELT (op0, idx)->index));
                gcc_checking_assert (o < RAW_DATA_LENGTH (val));
                return build_int_cst (TREE_TYPE (val),
-                                     ((const unsigned char *)
-                                      RAW_DATA_POINTER (val))[o.to_uhwi ()]);
+                                     RAW_DATA_UCHAR_ELT (val, o.to_uhwi ()));
              }
          }
 
--- gcc/c/c-parser.cc.jj        2024-12-05 12:57:34.582801585 +0100
+++ gcc/c/c-parser.cc   2024-12-05 22:01:46.537894285 +0100
@@ -10811,8 +10811,7 @@ c_parser_get_builtin_args (c_parser *par
          for (unsigned int i = 0; i < (unsigned) RAW_DATA_LENGTH (value); i++)
            {
              expr.value = build_int_cst (integer_type_node,
-                                         ((const unsigned char *)
-                                          RAW_DATA_POINTER (value))[i]);
+                                         RAW_DATA_UCHAR_ELT (value, i));
              vec_safe_push (cexpr_list, expr);
            }
          c_parser_consume_token (parser);
@@ -13751,8 +13750,7 @@ c_parser_expression (c_parser *parser)
          tree val = embed->value;
          unsigned last = RAW_DATA_LENGTH (val) - 1;
          next.value = build_int_cst (TREE_TYPE (val),
-                                     ((const unsigned char *)
-                                      RAW_DATA_POINTER (val))[last]);
+                                     RAW_DATA_UCHAR_ELT (val, last));
          next.original_type = integer_type_node;
          c_parser_consume_token (parser);
        }
@@ -13881,8 +13879,7 @@ c_parser_expr_list (c_parser *parser, bo
                  && RAW_DATA_POINTER (value)[i] == 0)
                *literal_zero_mask |= 1U << (idx + 1);
              expr.value = build_int_cst (integer_type_node,
-                                         ((const unsigned char *)
-                                          RAW_DATA_POINTER (value))[i]);
+                                         RAW_DATA_UCHAR_ELT (value, i));
              vec_safe_push (ret, expr.value);
              if (orig_types)
                vec_safe_push (orig_types, expr.original_type);
--- gcc/c/c-typeck.cc.jj        2024-12-05 09:24:54.687007210 +0100
+++ gcc/c/c-typeck.cc   2024-12-05 19:03:25.191123187 +0100
@@ -9379,15 +9379,13 @@ digest_init (location_t init_loc, tree t
          && TYPE_PRECISION (type) == CHAR_BIT)
        for (unsigned int i = 0;
             i < (unsigned) RAW_DATA_LENGTH (inside_init); ++i)
-         if (((const signed char *) RAW_DATA_POINTER (inside_init))[i] < 0)
+         if (RAW_DATA_SCHAR_ELT (inside_init, i) < 0)
            warning_at (init_loc, OPT_Wconversion,
                        "conversion from %qT to %qT changes value from "
                        "%qd to %qd",
                        integer_type_node, type,
-                       ((const unsigned char *)
-                        RAW_DATA_POINTER (inside_init))[i],
-                       ((const signed char *)
-                        RAW_DATA_POINTER (inside_init))[i]);
+                       RAW_DATA_UCHAR_ELT (inside_init, i),
+                       RAW_DATA_SCHAR_ELT (inside_init, i));
       return inside_init;
     }
 
@@ -10593,8 +10591,7 @@ add_pending_init (location_t loc, tree p
                      tree origtype = p->origtype;
                      if (start == 1)
                        p->value = build_int_cst (TREE_TYPE (v),
-                                                 *(const unsigned char *)
-                                                 RAW_DATA_POINTER (v));
+                                                 RAW_DATA_UCHAR_ELT (v, 0));
                      else
                        {
                          p->value = v;
@@ -10614,9 +10611,8 @@ add_pending_init (location_t loc, tree p
                            }
                          else
                            v = build_int_cst (TREE_TYPE (v),
-                                              ((const unsigned char *)
-                                               RAW_DATA_POINTER (v))[plen
-                                                                     - end]);
+                                              RAW_DATA_UCHAR_ELT (v, plen
+                                                                     - end));
                          add_pending_init (loc, epurpose, v, origtype,
                                            implicit, braced_init_obstack);
                        }
@@ -10650,8 +10646,7 @@ add_pending_init (location_t loc, tree p
                      unsigned int l = RAW_DATA_LENGTH (p->value) - 1;
                      p->value
                        = build_int_cst (TREE_TYPE (p->value),
-                                        ((const unsigned char *)
-                                         RAW_DATA_POINTER (p->value))[l]);
+                                        RAW_DATA_UCHAR_ELT (p->value, l));
                    }
                  p->purpose = size_binop (PLUS_EXPR, p->purpose,
                                           bitsize_int (len));
@@ -10698,13 +10693,10 @@ add_pending_init (location_t loc, tree p
                          RAW_DATA_LENGTH (last->value) -= l;
                          RAW_DATA_POINTER (last->value) += l;
                          if (RAW_DATA_LENGTH (last->value) == 1)
-                           {
-                             const unsigned char *s
-                               = ((const unsigned char *)
-                                  RAW_DATA_POINTER (last->value));
-                             last->value
-                               = build_int_cst (TREE_TYPE (last->value), *s);
-                           }
+                           last->value
+                             = build_int_cst (TREE_TYPE (last->value),
+                                              RAW_DATA_UCHAR_ELT (last->value,
+                                                                  0));
                          last->purpose
                            = size_binop (PLUS_EXPR, last->purpose,
                                          bitsize_int (l));
@@ -10718,8 +10710,7 @@ add_pending_init (location_t loc, tree p
                                           > cnt);
                      RAW_DATA_LENGTH (value) -= cnt;
                      const unsigned char *s
-                       = ((const unsigned char *) RAW_DATA_POINTER (value)
-                          + RAW_DATA_LENGTH (value));
+                       = &RAW_DATA_UCHAR_ELT (value, RAW_DATA_LENGTH (value));
                      unsigned int o = RAW_DATA_LENGTH (value);
                      for (r = p; cnt--; ++o, ++s)
                        {
@@ -10731,8 +10722,7 @@ add_pending_init (location_t loc, tree p
                        }
                      if (RAW_DATA_LENGTH (value) == 1)
                        value = build_int_cst (TREE_TYPE (value),
-                                              *((const unsigned char *)
-                                                RAW_DATA_POINTER (value)));
+                                              RAW_DATA_UCHAR_ELT (value, 0));
                    }
                }
              if (!implicit)
@@ -11662,8 +11652,7 @@ maybe_split_raw_data (tree value, tree *
     return value;
   *raw_data = value;
   value = build_int_cst (integer_type_node,
-                        *(const unsigned char *)
-                        RAW_DATA_POINTER (*raw_data));
+                        RAW_DATA_UCHAR_ELT (*raw_data, 0));
   ++RAW_DATA_POINTER (*raw_data);
   --RAW_DATA_LENGTH (*raw_data);
   return value;

        Jakub

Reply via email to