[gcc(refs/users/mikael/heads/refactor_descriptor_v01)] gimple-exec Restauration tests print_first_data_ref_part
Mikael Morin
mikael@gcc.gnu.org
Thu Mar 6 18:35:31 GMT 2025
https://gcc.gnu.org/g:257774fde348f21e93360443a91197ae856b9336
commit 257774fde348f21e93360443a91197ae856b9336
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Thu Mar 6 11:10:40 2025 +0100
gimple-exec Restauration tests print_first_data_ref_part
Diff:
---
gcc/cgraphunit.cc | 353 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 349 insertions(+), 4 deletions(-)
diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index 71eaf0509fdf..51fa9143f7ca 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -2582,7 +2582,7 @@ public:
void print_function_exit (struct function * func);
void print_bb_jump (edge e);
void print_bb_entry (basic_block bb);
- tree print_first_data_ref_part (exec_context & context, tree data_ref, const data_value & value, unsigned offset, int * ignored_bits);
+ tree print_first_data_ref_part (exec_context & context, tree data_ref, unsigned offset, int * ignored_bits);
void print_value_update (exec_context & context, tree, const data_value &);
void end_stmt (gimple *);
void print_at (const data_value & value, tree type, unsigned offset, unsigned width);
@@ -2979,7 +2979,7 @@ find_mem_ref_replacement (exec_context & context, tree data_ref,
tree
-context_printer::print_first_data_ref_part (exec_context & context, tree data_ref, const data_value & value, unsigned offset, int * ignored_bits)
+context_printer::print_first_data_ref_part (exec_context & context, tree data_ref, unsigned offset, int * ignored_bits)
{
switch (TREE_CODE (data_ref))
{
@@ -2988,7 +2988,7 @@ context_printer::print_first_data_ref_part (exec_context & context, tree data_re
tree mem_replacement = find_mem_ref_replacement (context, data_ref,
offset);
if (mem_replacement != NULL_TREE)
- return print_first_data_ref_part (context, mem_replacement, value, 0, ignored_bits);
+ return print_first_data_ref_part (context, mem_replacement, 0, ignored_bits);
}
/* Fall through. */
@@ -3018,7 +3018,7 @@ context_printer::print_value_update (exec_context & context, tree lhs, const dat
while (previously_done < width)
{
int ignored_bits = 0;
- tree type_done = print_first_data_ref_part (context, lhs, value,
+ tree type_done = print_first_data_ref_part (context, lhs,
previously_done,
&ignored_bits);
if (type_done == NULL_TREE)
@@ -5466,6 +5466,350 @@ data_storage_set_at_tests ()
}
+void
+context_printer_print_first_data_ref_part_tests ()
+{
+ vec<tree> empty{};
+
+ tree der2i = make_node (RECORD_TYPE);
+ tree der2i_i2 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der2i_i2"), integer_type_node);
+ DECL_CONTEXT (der2i_i2) = der2i;
+ DECL_CHAIN (der2i_i2) = NULL_TREE;
+ tree der2i_i1 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der2i_i1"), integer_type_node);
+ DECL_CONTEXT (der2i_i1) = der2i;
+ DECL_CHAIN (der2i_i1) = der2i_i2;
+ TYPE_FIELDS (der2i) = der2i_i1;
+ layout_type (der2i);
+
+ tree var2i = create_var (der2i, "var2i");
+
+ heap_memory mem1;
+ context_printer printer1;
+ pretty_printer & pp1 = printer1.pp;
+ exec_context ctx1 = context_builder ().build (mem1, printer1);
+
+ tree res1 = printer1.print_first_data_ref_part (ctx1, var2i, 0, nullptr);
+
+ ASSERT_EQ (res1, integer_type_node);
+ const char * str1 = pp_formatted_text (&pp1);
+ ASSERT_STREQ (str1, "# var2i.der2i_i1");
+
+
+ context_printer printer2;
+ pretty_printer & pp2 = printer2.pp;
+
+ vec<tree> decls2{};
+ decls2.safe_push (var2i);
+
+ context_builder builder2 {};
+ builder2.add_decls (&decls2);
+ exec_context ctx2 = builder2.build (mem1, printer2);
+
+ tree mem_var2i = build2 (MEM_REF, der2i,
+ build1 (ADDR_EXPR, ptr_type_node, var2i),
+ build_zero_cst (ptr_type_node));
+
+ tree res2 = printer2.print_first_data_ref_part (ctx2, mem_var2i, 0, nullptr);
+
+ ASSERT_EQ (res2, integer_type_node);
+ const char * str2 = pp_formatted_text (&pp2);
+ ASSERT_STREQ (str2, "# var2i.der2i_i1");
+
+
+ context_printer printer3;
+ pretty_printer & pp3 = printer3.pp;
+
+ context_builder builder3 {};
+ builder3.add_decls (&decls2);
+ exec_context ctx3 = builder3.build (mem1, printer3);
+
+ tree long_var2i = build2 (MEM_REF, long_integer_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var2i),
+ build_zero_cst (ptr_type_node));
+
+ tree res3 = printer3.print_first_data_ref_part (ctx3, long_var2i, 0, nullptr);
+
+ ASSERT_EQ (res3, integer_type_node);
+ const char * str3 = pp_formatted_text (&pp3);
+ ASSERT_STREQ (str3, "# var2i.der2i_i1");
+
+
+ tree der2s = make_node (RECORD_TYPE);
+ tree der2s_s2 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der2s_s2"),
+ short_integer_type_node);
+ DECL_CONTEXT (der2s_s2) = der2s;
+ DECL_CHAIN (der2s_s2) = NULL_TREE;
+ tree der2s_s1 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der2s_s1"),
+ short_integer_type_node);
+ DECL_CONTEXT (der2s_s1) = der2s;
+ DECL_CHAIN (der2s_s1) = der2s_s2;
+ TYPE_FIELDS (der2s) = der2s_s1;
+ layout_type (der2s);
+
+
+ tree der1d1i = make_node (RECORD_TYPE);
+ tree der1d1i_i2 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der1d1i_i2"), integer_type_node);
+ DECL_CONTEXT (der1d1i_i2) = der1d1i;
+ DECL_CHAIN (der1d1i_i2) = NULL_TREE;
+ tree der1d1i_d1 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der1d1i_d1"), der2s);
+ DECL_CONTEXT (der1d1i_d1) = der1d1i;
+ DECL_CHAIN (der1d1i_d1) = der1d1i_i2;
+ TYPE_FIELDS (der1d1i) = der1d1i_d1;
+ layout_type (der1d1i);
+
+ tree var1d1i = create_var (der1d1i, "var1d1i");
+
+ context_printer printer4;
+ pretty_printer & pp4 = printer4.pp;
+
+ vec<tree> decls4{};
+ decls4.safe_push (var1d1i);
+
+ context_builder builder4 {};
+ builder4.add_decls (&decls4);
+ exec_context ctx4 = builder4.build (mem1, printer4);
+
+ tree mem_var1d1i = build2 (MEM_REF, long_integer_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var1d1i),
+ build_zero_cst (ptr_type_node));
+
+ tree res4 = printer4.print_first_data_ref_part (ctx4, mem_var1d1i, 0, nullptr);
+
+ ASSERT_EQ (res4, short_integer_type_node);
+ const char * str4 = pp_formatted_text (&pp4);
+ ASSERT_STREQ (str4, "# var1d1i.der1d1i_d1.der2s_s1");
+
+
+ context_printer printer5;
+ pretty_printer & pp5 = printer5.pp;
+
+ context_builder builder5 {};
+ builder5.add_decls (&decls4);
+ exec_context ctx5 = builder5.build (mem1, printer5);
+
+ tree mem_var1d1i_s2 = build2 (MEM_REF, short_integer_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var1d1i),
+ build_int_cst (ptr_type_node,
+ sizeof (short)));
+
+ tree res5 = printer5.print_first_data_ref_part (ctx5, mem_var1d1i_s2, 0, nullptr);
+
+ ASSERT_EQ (res5, short_integer_type_node);
+ const char * str5 = pp_formatted_text (&pp5);
+ ASSERT_STREQ (str5, "# var1d1i.der1d1i_d1.der2s_s2");
+
+
+ tree der4c = make_node (RECORD_TYPE);
+ tree der4c_c4 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der4c_c4"),
+ char_type_node);
+ DECL_CONTEXT (der4c_c4) = der4c;
+ DECL_CHAIN (der4c_c4) = NULL_TREE;
+ tree der4c_c3 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der4c_c3"),
+ char_type_node);
+ DECL_CONTEXT (der4c_c3) = der4c;
+ DECL_CHAIN (der4c_c3) = der4c_c4;
+ tree der4c_c2 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der4c_c2"),
+ char_type_node);
+ DECL_CONTEXT (der4c_c2) = der4c;
+ DECL_CHAIN (der4c_c2) = der4c_c3;
+ tree der4c_c1 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der4c_c1"),
+ char_type_node);
+ DECL_CONTEXT (der4c_c1) = der4c;
+ DECL_CHAIN (der4c_c1) = der4c_c2;
+ TYPE_FIELDS (der4c) = der4c_c1;
+ layout_type (der4c);
+
+ tree var4c = create_var (der4c, "var4c");
+
+ context_printer printer6;
+ pretty_printer & pp6 = printer6.pp;
+
+ vec<tree> decls6{};
+ decls6.safe_push (var4c);
+
+ context_builder builder6 {};
+ builder6.add_decls (&decls6);
+ exec_context ctx6 = builder6.build (mem1, printer6);
+
+ tree mem_var4c = build2 (MEM_REF, long_integer_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var4c),
+ build_int_cst (ptr_type_node, 2));
+
+ tree res6 = printer6.print_first_data_ref_part (ctx6, mem_var4c, 0, nullptr);
+
+ ASSERT_EQ (res6, char_type_node);
+ const char * str6 = pp_formatted_text (&pp6);
+ ASSERT_STREQ (str6, "# var4c.der4c_c3");
+
+
+ tree der1i1d = make_node (RECORD_TYPE);
+ tree der1i1d_d2 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der1i1d_d2"),
+ der4c);
+ DECL_CONTEXT (der1i1d_d2) = der1i1d;
+ DECL_CHAIN (der1i1d_d2) = NULL_TREE;
+ tree der1i1d_i1 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der1i1d_i1"),
+ integer_type_node);
+ DECL_CONTEXT (der1i1d_i1) = der1i1d;
+ DECL_CHAIN (der1i1d_i1) = der1i1d_d2;
+ TYPE_FIELDS (der1i1d) = der1i1d_i1;
+ layout_type (der1i1d);
+
+ tree var1i1d = create_var (der1i1d, "var1i1d");
+
+ context_printer printer7;
+ pretty_printer & pp7 = printer7.pp;
+
+ vec<tree> decls7{};
+ decls7.safe_push (var1i1d);
+
+ context_builder builder7 {};
+ builder7.add_decls (&decls7);
+ exec_context ctx7 = builder7.build (mem1, printer7);
+
+ tree mem_var1i1d = build2 (MEM_REF, char_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var1i1d),
+ build_int_cst (ptr_type_node,
+ sizeof (int) + 1));
+
+ tree res7 = printer7.print_first_data_ref_part (ctx7, mem_var1i1d, 0, nullptr);
+
+ ASSERT_EQ (res7, char_type_node);
+ const char * str7 = pp_formatted_text (&pp7);
+ ASSERT_STREQ (str7, "# var1i1d.der1i1d_d2.der4c_c2");
+
+
+ tree i5 = build_array_type_nelts (integer_type_node, 5);
+
+ tree var_i5 = create_var (i5, "var_i5");
+
+ context_printer printer8;
+ pretty_printer & pp8 = printer8.pp;
+
+ vec<tree> decls8{};
+ decls8.safe_push (var_i5);
+
+ context_builder builder8 {};
+ builder8.add_decls (&decls8);
+ exec_context ctx8 = builder8.build (mem1, printer8);
+
+ tree mem_var_i5 = build2 (MEM_REF, char_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var_i5),
+ build_int_cst (ptr_type_node,
+ 3 * sizeof (int)));
+
+ tree res8 = printer8.print_first_data_ref_part (ctx8, mem_var_i5, 0, nullptr);
+
+ ASSERT_EQ (res8, integer_type_node);
+ const char * str8 = pp_formatted_text (&pp8);
+ ASSERT_STREQ (str8, "# var_i5[3]");
+
+
+ context_printer printer9;
+ pretty_printer & pp9 = printer9.pp;
+
+ context_builder builder9 {};
+ builder9.add_decls (&decls8);
+ exec_context ctx9 = builder9.build (mem1, printer9);
+
+ tree mem2_var_i5 = build2 (MEM_REF, char_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var_i5),
+ build_int_cst (ptr_type_node,
+ sizeof (int)));
+
+ tree res9 = printer9.print_first_data_ref_part (ctx9, mem2_var_i5,
+ HOST_BITS_PER_INT, nullptr);
+
+ ASSERT_EQ (res9, integer_type_node);
+ const char * str9 = pp_formatted_text (&pp9);
+ ASSERT_STREQ (str9, "# var_i5[2]");
+
+
+ tree a5c4 = build_array_type_nelts (der4c, 5);
+
+ tree der1i1a5d = make_node (RECORD_TYPE);
+ tree der1i1a5d_a5d2 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der1i1a5d_a5d2"),
+ a5c4);
+ DECL_CONTEXT (der1i1a5d_a5d2) = der1i1a5d;
+ DECL_CHAIN (der1i1a5d_a5d2) = NULL_TREE;
+ tree der1i1a5d_i1 = build_decl (input_location, FIELD_DECL,
+ get_identifier ("der1i1a5d_i1"),
+ integer_type_node);
+ DECL_CONTEXT (der1i1a5d_i1) = der1i1a5d;
+ DECL_CHAIN (der1i1a5d_i1) = der1i1a5d_a5d2;
+ TYPE_FIELDS (der1i1a5d) = der1i1a5d_i1;
+ layout_type (der1i1a5d);
+
+ tree var_d1i1a5d = create_var (der1i1a5d, "var_d1i1a5d");
+
+ context_printer printer10;
+ pretty_printer & pp10 = printer10.pp;
+
+ vec<tree> decls10{};
+ decls10.safe_push (var_d1i1a5d);
+
+ context_builder builder10 {};
+ builder10.add_decls (&decls10);
+ exec_context ctx10 = builder10.build (mem1, printer10);
+
+ tree mem_var_d1i1a5d = build2 (MEM_REF, char_type_node,
+ build1 (ADDR_EXPR, ptr_type_node, var_d1i1a5d),
+ build_int_cst (ptr_type_node,
+ sizeof (int) + 13));
+
+ tree res10 = printer10.print_first_data_ref_part (ctx10, mem_var_d1i1a5d, 0, nullptr);
+
+ ASSERT_EQ (res10, char_type_node);
+ const char * str10 = pp_formatted_text (&pp10);
+ ASSERT_STREQ (str10, "# var_d1i1a5d.der1i1a5d_a5d2[3].der4c_c2");
+
+
+ tree var_i = create_var (integer_type_node, "var_i");
+ tree ptr = create_var (ptr_type_node, "ptr");
+
+ context_printer printer11;
+ pretty_printer & pp11 = printer11.pp;
+
+ vec<tree> decls11{};
+ decls11.safe_push (var_i);
+ decls11.safe_push (ptr);
+
+ context_builder builder11 {};
+ builder11.add_decls (&decls11);
+ exec_context ctx11 = builder11.build (mem1, printer11);
+
+ data_storage *var_storage = ctx11.find_reachable_var (var_i);
+ storage_address var_address (var_storage->get_ref (), 0);
+
+ data_value ptr_val (ptr_type_node);
+ ptr_val.set_address (var_address);
+
+ data_storage *ptr_storage = ctx11.find_reachable_var (ptr);
+ ptr_storage->set (ptr_val);
+
+ tree ref_ptr = build2 (MEM_REF, integer_type_node, ptr,
+ build_zero_cst (ptr_type_node));
+
+ tree res11 = printer11.print_first_data_ref_part (ctx11, ref_ptr, 0, nullptr);
+
+ ASSERT_EQ (res11, integer_type_node);
+ const char * str11 = pp_formatted_text (&pp11);
+ ASSERT_STREQ (str11, "# var_i");
+}
+
+
void
context_printer_print_value_update_tests ()
{
@@ -7269,6 +7613,7 @@ gimple_exec_cc_tests ()
data_value_set_at_tests ();
data_value_print_tests ();
data_storage_set_at_tests ();
+ context_printer_print_first_data_ref_part_tests ();
context_printer_print_value_update_tests ();
exec_context_evaluate_tests ();
exec_context_evaluate_literal_tests ();
More information about the Gcc-cvs
mailing list