https://gcc.gnu.org/g:323dd23d57243bba5bc3c1049a85087d0f3a0806

commit 323dd23d57243bba5bc3c1049a85087d0f3a0806
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Mar 5 21:11:56 2025 +0100

    Affichage des mises à jour de structures champ par champ

Diff:
---
 gcc/cgraphunit.cc | 172 ++++++++++++++++++++++++++++++++----------------------
 1 file changed, 101 insertions(+), 71 deletions(-)

diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index 84bba681da85..660a39584d61 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -2863,6 +2863,59 @@ context_printer::print_bb_entry (basic_block bb)
 }
 
 
+static tree
+pick_subref_at (tree var_ref, unsigned offset)
+{
+  tree ref = var_ref;
+  unsigned remaining_offset = offset;
+  while (true)
+    {
+      tree var_type = TREE_TYPE (ref);
+      if (TREE_CODE (var_type) == ARRAY_TYPE)
+       {
+         tree elt_type = TREE_TYPE (var_type);
+         unsigned elt_width;
+         gcc_assert (get_constant_type_size (elt_type, elt_width));
+         unsigned HOST_WIDE_INT hw_idx = remaining_offset / elt_width;
+         tree t_idx = build_int_cst (integer_type_node, hw_idx);
+         ref = build4 (ARRAY_REF, elt_type, ref,
+                       t_idx, NULL_TREE, NULL_TREE);
+         remaining_offset -= hw_idx * elt_width;
+       }
+      else if (TREE_CODE (var_type) == RECORD_TYPE)
+       {
+         tree field = NULL_TREE;
+         HOST_WIDE_INT field_position = -1;
+         tree next_field = TYPE_FIELDS (TREE_TYPE (ref));
+
+         do
+           {
+             HOST_WIDE_INT next_position;
+             next_position = int_bit_position (next_field);
+             if (next_position > remaining_offset)
+               break;
+
+             field = next_field;
+             field_position = next_position;
+             next_field = TREE_CHAIN (field);
+           }
+         while (next_field != NULL_TREE);
+
+         gcc_assert (field != NULL_TREE
+                     && field_position >= 0);
+
+         ref = build3 (COMPONENT_REF, TREE_TYPE (field),
+                       ref, field, NULL_TREE);
+         remaining_offset -= field_position;
+       }
+      else
+       break;
+    }
+  gcc_assert (remaining_offset == 0);
+  return ref;
+}
+
+
 static tree
 find_mem_ref_replacement (exec_context & context, tree data_ref, unsigned 
offset)
 {
@@ -2891,54 +2944,11 @@ find_mem_ref_replacement (exec_context & context, tree 
data_ref, unsigned offset
       gcc_assert (offset < UINT_MAX - shwi_offset);
       HOST_WIDE_INT remaining_offset = shwi_offset * CHAR_BIT + offset;
 
-      while (true)
-       {
-         if (TREE_CODE (var_type) == ARRAY_TYPE)
-           {
-             tree elt_type = TREE_TYPE (var_type);
-             unsigned elt_width;
-             gcc_assert (get_constant_type_size (elt_type, elt_width));
-             unsigned HOST_WIDE_INT hw_idx = remaining_offset / elt_width;
-             tree t_idx = build_int_cst (integer_type_node, hw_idx);
-             var_ref = build4 (ARRAY_REF, elt_type, var_ref,
-                               t_idx, NULL_TREE, NULL_TREE);
-             remaining_offset -= hw_idx * elt_width;
-           }
-         else if (TREE_CODE (var_type) == RECORD_TYPE)
-           {
-             tree field = NULL_TREE;
-             HOST_WIDE_INT field_position = -1;
-             tree next_field = TYPE_FIELDS (TREE_TYPE (var_ref));
-
-             do
-               {
-                 HOST_WIDE_INT next_position;
-                 next_position = int_bit_position (next_field);
-                 if (next_position > remaining_offset)
-                   break;
-
-                 field = next_field;
-                 field_position = next_position;
-                 next_field = TREE_CHAIN (field);
-               }
-             while (next_field != NULL_TREE);
-
-             gcc_assert (field != NULL_TREE
-                         && field_position >= 0);
-
-             var_ref = build3 (COMPONENT_REF, TREE_TYPE (field),
-                               var_ref, field, NULL_TREE);
-             remaining_offset -= field_position;
-           }
-         else
-           break;
-         var_type = TREE_TYPE (var_ref);
-       }
-      gcc_assert (remaining_offset == 0);
-      return var_ref;
+      return pick_subref_at (var_ref, remaining_offset);
     }
 }
 
+
 tree
 context_printer::print_first_data_ref_part (exec_context & context, tree 
data_ref, unsigned offset)
 {
@@ -2955,10 +2965,10 @@ context_printer::print_first_data_ref_part 
(exec_context & context, tree data_re
     /* Fall through.  */
 
     default:
-      print (data_ref);
+      tree ref = pick_subref_at (data_ref, offset);
+      print (ref);
+      return TREE_TYPE (ref);
     }
-
-  return TREE_TYPE (data_ref);
 }
 
 void
@@ -2983,25 +2993,6 @@ context_printer::print_value_update (exec_context & 
context, tree lhs, const dat
       print_newline ();
       previously_done += just_done;
     }
-  //pp_newline_and_indent (&pp, -2);
-#if 0
-  tree type = TREE_TYPE (lhs);
-  if (TREE_CODE (type) == VECTOR_TYPE)
-    {
-      unsigned size = get_constant_type_size (type);
-      tree elt_type = TREE_TYPE (type);
-      unsigned chunk_size = get_constant_type_size (elt_type);
-      gcc_assert (size % chunk_size == 0);
-      for (unsigned i = 0; i < size / chunk_size; i++)
-      //for (unsigned i = 0; i < TREE_VEC_LENGTH (type); i++)
-       {
-         tree lhs_part = TREE_VEC_ELT (lhs, i);
-         print_part_update (lhs_part, value, i * chunk_size);
-       }
-    }
-  else
-    print_part_update (lhs, value, 0);
-#endif
 }
 
 
@@ -5419,9 +5410,9 @@ context_printer_print_first_data_ref_part_tests ()
 
   tree res1 = printer1.print_first_data_ref_part (ctx1, var2i, 0);
 
-  ASSERT_EQ (res1, der2i);
+  ASSERT_EQ (res1, integer_type_node);
   const char * str1 = pp_formatted_text (&pp1);
-  ASSERT_STREQ (str1, "var2i");
+  ASSERT_STREQ (str1, "var2i.der2i_i1");
 
 
   context_printer printer2;
@@ -5440,9 +5431,9 @@ context_printer_print_first_data_ref_part_tests ()
 
   tree res2 = printer2.print_first_data_ref_part (ctx2, mem_var2i, 0);
 
-  ASSERT_EQ (res2, der2i);
+  ASSERT_EQ (res2, integer_type_node);
   const char * str2 = pp_formatted_text (&pp2);
-  ASSERT_STREQ (str2, "var2i");
+  ASSERT_STREQ (str2, "var2i.der2i_i1");
 
 
   context_printer printer3;
@@ -5900,6 +5891,45 @@ context_printer_print_value_update_tests ()
   printer5.print_value_update (ctx5, p, val5);
   const char *str5 = pp_formatted_text (&pp5);
   ASSERT_STREQ (str5, "# p = &v5i + 3B\n");
+
+
+  context_printer printer6;
+  pretty_printer & pp6 = printer6.pp;
+  pp_buffer (&pp6)->m_flush_p = false;
+
+  tree der2i_bis = make_node (RECORD_TYPE);
+  tree der2i_i2_bis = build_decl (input_location, FIELD_DECL,
+                                 get_identifier ("der2i_i2_bis"),
+                                 integer_type_node);
+  DECL_CONTEXT (der2i_i2_bis) = der2i_bis;
+  DECL_CHAIN (der2i_i2_bis) = NULL_TREE;
+  tree der2i_i1_bis = build_decl (input_location, FIELD_DECL,
+                                 get_identifier ("der2i_i1_bis"),
+                                 integer_type_node);
+  DECL_CONTEXT (der2i_i1_bis) = der2i_bis;
+  DECL_CHAIN (der2i_i1_bis) = der2i_i2_bis;
+  TYPE_FIELDS (der2i_bis) = der2i_i1_bis;
+  layout_type (der2i_bis);
+
+  tree var2i = create_var (der2i_bis, "var2i");
+
+  vec<tree> decls6{};
+  decls6.safe_push (var2i);
+
+  context_builder builder6;
+  builder6.add_decls (&decls6);
+  exec_context ctx6 = builder6.build (mem, printer6);
+
+  wide_int wi12 = wi::shwi (12, HOST_BITS_PER_INT);
+  wide_int wi7 = wi::shwi (7, HOST_BITS_PER_INT);
+  data_value cstr_12_7 (der2i_bis);
+  cstr_12_7.set_cst_at (wi12, 0);
+  cstr_12_7.set_cst_at (wi7, HOST_BITS_PER_INT);
+
+  printer6.print_value_update (ctx6, var2i, cstr_12_7);
+
+  const char *str6 = pp_formatted_text (&pp6);
+  ASSERT_STREQ (str6, "# var2i.der2i_i1_bis = 12\n# var2i.der2i_i2_bis = 7\n");
 }

Reply via email to