https://gcc.gnu.org/g:ae42c3df608ec18da96a26730b015546144140ad
commit ae42c3df608ec18da96a26730b015546144140ad Author: Mikael Morin <mik...@gcc.gnu.org> Date: Thu Mar 6 17:22:35 2025 +0100 Modification affichage MEM_REF d'alloc. Diff: --- gcc/cgraphunit.cc | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 155 insertions(+), 7 deletions(-) diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index 51fa9143f7ca..6edc4984906d 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -2433,6 +2433,7 @@ namespace selftest void data_value_set_at_tests (); void data_value_set_address_tests (); void data_value_print_tests (); + void context_printer_print_tests (); void context_printer_print_first_data_ref_part_tests (); void context_printer_print_value_update_tests (); void exec_context_evaluate_tests (); @@ -2568,6 +2569,7 @@ class context_printer friend void selftest::exec_context_evaluate_tests (); friend void selftest::data_value_print_tests (); + friend void selftest::context_printer_print_tests (); friend void selftest::context_printer_print_first_data_ref_part_tests (); friend void selftest::context_printer_print_value_update_tests (); @@ -2576,7 +2578,7 @@ public: context_printer (dump_flags_t f); pretty_printer & get_pretty_printer () const { return const_cast <pretty_printer &> (pp); } void begin_stmt (gimple *); - void print (tree); + void print (exec_context *, tree); void print_newline (); void print_function_entry (struct function * func); void print_function_exit (struct function * func); @@ -2638,6 +2640,7 @@ class exec_context friend void selftest::data_value_print_tests (); friend void selftest::data_value_set_address_tests (); friend void selftest::data_value_set_tests (); + friend void selftest::context_printer_print_tests (); friend void selftest::exec_context_evaluate_literal_tests (); friend void selftest::exec_context_evaluate_unary_tests (); friend void selftest::exec_context_evaluate_binary_tests (); @@ -2808,9 +2811,50 @@ context_printer::begin_stmt (gimple *g) } void -context_printer::print (tree expr) +context_printer::print (exec_context * ctx, tree expr) { - dump_generic_node (&pp, expr, pp_indentation (&pp), flags, false); + switch (TREE_CODE (expr)) + { + case MEM_REF: + { + gcc_assert (ctx != nullptr); + data_value val = ctx->evaluate (TREE_OPERAND (expr, 0)); + gcc_assert (val.classify () == VAL_ADDRESS); + storage_address *address = val.get_address (); + gcc_assert (address != nullptr); + + data_value val_off = ctx->evaluate (TREE_OPERAND (expr, 1)); + gcc_assert (val_off.classify () == VAL_CONSTANT); + wide_int wi_off = val_off.get_cst (); + wi_off = (wi_off * CHAR_BIT) + address->offset; + + if (!wi::fits_uhwi_p (wi_off)) + gcc_unreachable (); + unsigned offset_bits = wi_off.to_uhwi (); + gcc_assert (offset_bits % CHAR_BIT == 0); + unsigned offset_bytes = offset_bits / CHAR_BIT; + + unsigned size_bits; + if (!get_constant_type_size (TREE_TYPE (expr), size_bits)) + gcc_unreachable (); + gcc_assert (size_bits % CHAR_BIT == 0); + unsigned size_bytes = size_bits / CHAR_BIT; + + address->storage.get ().print (*this); + pp_left_bracket (&pp); + pp_decimal_int (&pp, offset_bytes); + pp_character (&pp, 'B'); + pp_colon (&pp); + pp_plus (&pp); + pp_decimal_int (&pp, size_bytes); + pp_character (&pp, 'B'); + pp_right_bracket (&pp); + } + break; + + default: + dump_generic_node (&pp, expr, pp_indentation (&pp), flags, false); + } } @@ -3005,7 +3049,7 @@ context_printer::print_first_data_ref_part (exec_context & context, tree data_re pp_indent (&pp); pp_character (&pp, '#'); pp_space (&pp); - print (ref); + print (&context, ref); return TREE_TYPE (ref); } } @@ -3478,7 +3522,7 @@ context_printer::print_at (const data_value & value, tree type, unsigned offset, tree int_type = make_signed_type (width); tree cst = wide_int_to_tree (int_type, wi_val); tree real = fold_build1 (VIEW_CONVERT_EXPR, type, cst); - print (real); + print (nullptr, real); } else pp_wide_int (&pp, wi_val, SIGNED); @@ -3542,7 +3586,7 @@ data_storage::print (context_printer & printer) const case STRG_VARIABLE: { tree decl = get_variable (); - printer.print (decl); + printer.print (nullptr, decl); } break; @@ -5466,6 +5510,109 @@ data_storage_set_at_tests () } +void +context_printer_print_tests () +{ + heap_memory mem1; + + context_printer printer1; + pretty_printer & pp1 = printer1.pp; + + tree p1 = create_var (ptr_type_node, "p1"); + + vec<tree> decls1 {}; + decls1.safe_push (p1); + + context_builder builder1; + builder1.add_decls (&decls1); + exec_context ctx1 = builder1.build (mem1, printer1); + + data_storage & alloc1 = ctx1.allocate (12); + + storage_address addr_alloc1 (alloc1.get_ref (), 0); + data_value val_addr1 (ptr_type_node); + val_addr1.set_address (addr_alloc1); + + data_storage *strg_p1 = ctx1.find_reachable_var (p1); + gcc_assert (strg_p1 != nullptr); + strg_p1->set (val_addr1); + + tree mem_alloc1 = build2 (MEM_REF, char_type_node, + p1, build_zero_cst (ptr_type_node)); + + printer1.print (&ctx1, mem_alloc1); + + const char * str1 = pp_formatted_text (&pp1); + ASSERT_STREQ (str1, "<alloc00(12)>[0B:+1B]"); + + + heap_memory mem2; + + context_printer printer2; + pretty_printer & pp2 = printer2.pp; + + tree p2 = create_var (ptr_type_node, "p2"); + + vec<tree> decls2 {}; + decls2.safe_push (p2); + + context_builder builder2; + builder2.add_decls (&decls2); + exec_context ctx2 = builder2.build (mem2, printer2); + + data_storage & alloc2 = ctx2.allocate (17); + + storage_address addr_alloc2 (alloc2.get_ref (), 24); + data_value val_addr2 (ptr_type_node); + val_addr2.set_address (addr_alloc2); + + data_storage *strg_p2 = ctx2.find_reachable_var (p2); + gcc_assert (strg_p2 != nullptr); + strg_p2->set (val_addr2); + + tree mem_alloc2 = build2 (MEM_REF, char_type_node, + p2, build_int_cst (ptr_type_node, 11)); + + printer2.print (&ctx2, mem_alloc2); + + const char * str2 = pp_formatted_text (&pp2); + ASSERT_STREQ (str2, "<alloc00(17)>[14B:+1B]"); + + + heap_memory mem3; + + context_printer printer3; + pretty_printer & pp3 = printer3.pp; + + tree p3 = create_var (ptr_type_node, "p3"); + + vec<tree> decls3 {}; + decls3.safe_push (p3); + + context_builder builder3; + builder3.add_decls (&decls3); + exec_context ctx3 = builder3.build (mem3, printer3); + + data_storage & alloc3 = ctx3.allocate (19); + + storage_address addr_alloc3 (alloc3.get_ref (), 40); + data_value val_addr3 (ptr_type_node); + val_addr3.set_address (addr_alloc3); + + data_storage *strg_p3 = ctx3.find_reachable_var (p3); + gcc_assert (strg_p3 != nullptr); + strg_p3->set (val_addr3); + + tree mem_alloc3 = build2 (MEM_REF, integer_type_node, + p3, build_int_cst (ptr_type_node, 3)); + + printer3.print (&ctx3, mem_alloc3); + + const char * str3 = pp_formatted_text (&pp3); + ASSERT_STREQ (str3, "<alloc00(19)>[8B:+4B]"); +} + + void context_printer_print_first_data_ref_part_tests () { @@ -6034,7 +6181,7 @@ context_printer_print_value_update_tests () tree var1c1i = create_var (der1c1i, "var1c1i"); - vec<tree> decls7; + vec<tree> decls7 {}; decls7.safe_push (var1c1i); context_builder builder7; @@ -7613,6 +7760,7 @@ gimple_exec_cc_tests () data_value_set_at_tests (); data_value_print_tests (); data_storage_set_at_tests (); + context_printer_print_tests (); context_printer_print_first_data_ref_part_tests (); context_printer_print_value_update_tests (); exec_context_evaluate_tests ();