https://gcc.gnu.org/g:ab7d5b1b1fb93bc4771a90ef759c1ebd896b9068
commit ab7d5b1b1fb93bc4771a90ef759c1ebd896b9068 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Tue Mar 4 22:10:01 2025 +0100 Changement du type attendu par set_address: data_storage -> storage_address Diff: --- gcc/cgraphunit.cc | 158 +++++++++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 72 deletions(-) diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index f29e9aa846b8..5290f7f27cfd 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -2413,6 +2413,17 @@ struct storage_address {} }; + +struct stored_address +{ + storage_address address; + unsigned position; + + stored_address (storage_address addr, unsigned pos) + : address (addr), position (pos) + {} +}; + namespace selftest { void data_value_classify_tests (); @@ -2438,10 +2449,10 @@ class data_value wide_int constant_mask; wide_int address_mask; wide_int constant_value; - vec<storage_address> addresses; + vec<stored_address> addresses; void set_cst_at (unsigned dest_offset, unsigned value_width, const wide_int &val, unsigned src_offset); - storage_address *find_address (unsigned offset) const; + stored_address *find_address (unsigned offset) const; void set_at (unsigned dest_offset, unsigned value_width, const data_value & value_src, unsigned src_offset); @@ -2466,8 +2477,8 @@ public: value_type classify () const; value_type classify (unsigned offset, unsigned width) const; unsigned get_bitwidth () const { return bit_width; } - void set_address_at (data_storage &storage, unsigned offset); - void set_address (data_storage &); + void set_address_at (storage_address & address, unsigned offset); + void set_address (storage_address & address); void set_at (const data_value & value, unsigned offset); void set (const data_value & value); void set_cst_at (const wide_int & val, unsigned offset); @@ -3078,19 +3089,19 @@ data_value::classify (unsigned offset, unsigned width) const } -storage_address * +stored_address * data_value::find_address (unsigned offset) const { gcc_assert (offset <= bit_width - HOST_BITS_PER_PTR); - storage_address *result = nullptr; - storage_address *strg_address; + stored_address *result = nullptr; + stored_address *strd_address; unsigned i; - FOR_EACH_VEC_ELT (addresses, i, strg_address) - if (strg_address->offset == offset) + FOR_EACH_VEC_ELT (addresses, i, strd_address) + if (strd_address->position == offset) { gcc_assert (result == nullptr); - result = strg_address; + result = strd_address; } return result; @@ -3098,34 +3109,36 @@ data_value::find_address (unsigned offset) const void -data_value::set_address_at (data_storage &storage, unsigned offset) +data_value::set_address_at (storage_address & address, unsigned offset) { wide_int mask = wi::shifted_mask (offset, HOST_BITS_PER_PTR, false, bit_width); enum value_type type = classify (offset, HOST_BITS_PER_PTR); + /* Assume we don't store both regular integers and address + in the same variable over time. */ gcc_assert (type == VAL_ADDRESS || type == VAL_UNDEFINED); if (type == VAL_ADDRESS) { - storage_address *existing_address = find_address (offset); + stored_address *existing_address = find_address (offset); gcc_assert (existing_address != nullptr); /* Invalidate existing address. */ - existing_address->offset = -1; + existing_address->position = -1; } constant_mask &= ~mask; address_mask |= mask; - storage_address addr_info (storage.get_ref (), offset);; - addresses.safe_push (addr_info); + stored_address new_address (address, offset); + addresses.safe_push (new_address); } void -data_value::set_address (data_storage &storage) +data_value::set_address (storage_address & address) { gcc_assert (bit_width == HOST_BITS_PER_PTR); - set_address_at (storage, 0); + set_address_at (address, 0); } @@ -3180,14 +3193,14 @@ data_value::set_at (unsigned dest_offset, unsigned value_width, { if (value_width == HOST_BITS_PER_PTR) { - storage_address *found_address = value_src.find_address (src_offset); + stored_address *found_address = value_src.find_address (src_offset); gcc_assert (found_address != nullptr); - - data_storage &storage = found_address->storage.get (); - set_address_at (storage, dest_offset); + set_address_at (found_address->address, dest_offset); } else { + /* Several addresses side by side in the same area. Set them one + by one */ gcc_assert (value_width > HOST_BITS_PER_PTR); gcc_assert (value_width % HOST_BITS_PER_PTR == 0); gcc_assert (dest_offset % HOST_BITS_PER_PTR == 0); @@ -3259,32 +3272,6 @@ void data_value::set_at (const data_value & value, unsigned offset) { set_at (offset, value.bit_width, value, 0); -#if 0 - unsigned value_width = value.get_bitwidth (); - gcc_assert (offset < bit_width); - gcc_assert (value_width <= bit_width - offset); - - enum value_type type = value.classify (); - switch (type) - { - case VAL_CONSTANT: - set_cst_at (offset, value.bit_width, value.constant_value, 0); - break; - - case VAL_ADDRESS: - { - storage_address *found_address = value.find_address (0); - gcc_assert (found_address != nullptr); - - data_storage &storage = found_address->storage.get (); - set_address_at (storage, offset); - } - break; - - default: - gcc_unreachable (); - } -#endif } @@ -3335,9 +3322,9 @@ data_value::get_address_at (unsigned offset) const wide_int mask = wi::shifted_mask (offset, HOST_BITS_PER_PTR, false, bit_width); - storage_address *addr_info = find_address (offset); + stored_address *addr_info = find_address (offset); if (addr_info != nullptr) - return &(addr_info->storage.get ()); + return &(addr_info->address.storage.get ()); return nullptr; } @@ -3362,8 +3349,12 @@ data_value::get_at (unsigned offset, unsigned width) const break; case VAL_ADDRESS: - gcc_assert (width == HOST_BITS_PER_PTR); - result.set_address (*get_address_at (offset)); + { + gcc_assert (width == HOST_BITS_PER_PTR); + data_storage *storage = get_address_at (offset); + storage_address address (storage->get_ref (), 0); + result.set_address (address); + } break; case VAL_UNDEFINED: @@ -3745,8 +3736,9 @@ exec_context::evaluate (tree expr) const { data_storage *strg = find_reachable_var (TREE_OPERAND (expr, 0)); gcc_assert (strg != nullptr); + storage_address address (strg->get_ref (), 0); data_value result (TREE_TYPE (expr)); - result.set_address (*strg); + result.set_address (address); return result; } @@ -4030,7 +4022,8 @@ exec_context::execute_call (gcall *g) tree lhs = gimple_call_lhs (g); gcc_assert (lhs != NULL_TREE); data_value ptr (TREE_TYPE (lhs)); - ptr.set_address (storage); + storage_address address (storage.get_ref (), 0); + ptr.set_address (address); printer.print_value_update (*this, lhs, ptr); data_storage *lhs_strg = find_var (lhs); @@ -4706,11 +4699,13 @@ data_value_classify_tests () data_storage *storage_a = ctx.find_reachable_var (a); gcc_assert (storage_a != nullptr); + storage_address address_a (storage_a->get_ref (), 0); + data_value ptr(ptr_type_node); ASSERT_EQ (ptr.classify (), VAL_UNDEFINED); - ptr.set_address (*storage_a); + ptr.set_address (address_a); ASSERT_EQ (ptr.classify (), VAL_ADDRESS); @@ -4744,13 +4739,13 @@ data_value_classify_tests () VAL_UNDEFINED); ASSERT_EQ (val3.classify (), VAL_UNDEFINED); - val3.set_address_at (*storage_a, HOST_BITS_PER_PTR); + val3.set_address_at (address_a, HOST_BITS_PER_PTR); ASSERT_EQ (val3.classify (0, HOST_BITS_PER_PTR), VAL_UNDEFINED); ASSERT_EQ (val3.classify (HOST_BITS_PER_PTR, HOST_BITS_PER_PTR), VAL_ADDRESS); ASSERT_EQ (val3.classify (), VAL_MIXED); - val3.set_address_at (*storage_a, 0); + val3.set_address_at (address_a, 0); ASSERT_EQ (val3.classify (0, HOST_BITS_PER_PTR), VAL_ADDRESS); ASSERT_EQ (val3.classify (HOST_BITS_PER_PTR, HOST_BITS_PER_PTR), VAL_ADDRESS); @@ -4836,13 +4831,15 @@ data_value_set_address_tests () data_value val1(ptr_type_node); data_storage *storage_a = ctx.find_reachable_var (a); - val1.set_address (*storage_a); + storage_address address_a (storage_a->get_ref (), 0); + val1.set_address (address_a); ASSERT_EQ (val1.classify (), VAL_ADDRESS); ASSERT_EQ (val1.get_address (), storage_a); data_storage *storage_b = ctx.find_reachable_var (b); - val1.set_address (*storage_b); + storage_address address_b (storage_b->get_ref (), 0); + val1.set_address (address_b); ASSERT_EQ (val1.classify (), VAL_ADDRESS); ASSERT_EQ (val1.get_address (), storage_b); @@ -4873,10 +4870,11 @@ data_value_set_tests () exec_context ctx = builder.build (mem, printer); data_storage *storage_a = ctx.find_var (a); + storage_address address_a (storage_a->get_ref (), 0); data_value val1(ptr_type_node); - val1.set_address (*storage_a); + val1.set_address (address_a); data_value val2(ptr_type_node); @@ -4906,9 +4904,12 @@ data_value_set_at_tests () data_storage *storage_a = ctx.find_reachable_var (a); data_storage *storage_b = ctx.find_reachable_var (b); + storage_address address_a (storage_a->get_ref (), 0); + storage_address address_b (storage_b->get_ref (), 0); + data_value val1(ptr_type_node); - val1.set_address (*storage_a); + val1.set_address (address_a); tree vec2ptr = build_vector_type (ptr_type_node, 2); data_value val2(vec2ptr); @@ -4917,7 +4918,7 @@ data_value_set_at_tests () ASSERT_EQ (val2.classify (HOST_BITS_PER_PTR, HOST_BITS_PER_PTR), VAL_ADDRESS); ASSERT_EQ (val2.get_address_at (HOST_BITS_PER_PTR), storage_a); - val1.set_address (*storage_b); + val1.set_address (address_b); val2.set_at (val1, 0); ASSERT_EQ (val2.classify (0, HOST_BITS_PER_PTR), VAL_ADDRESS); @@ -5044,7 +5045,9 @@ data_value_set_at_tests () data_storage *storage = ctx4.find_reachable_var (t); gcc_assert (storage != nullptr); - mv.set_address_at (*storage, HOST_BITS_PER_LONG); + storage_address address (storage->get_ref (), 0); + + mv.set_address_at (address, HOST_BITS_PER_LONG); wide_int wi7 = wi::shwi (7, HOST_BITS_PER_INT); mv.set_cst_at (wi7, HOST_BITS_PER_LONG + HOST_BITS_PER_PTR); @@ -5093,7 +5096,9 @@ data_value_print_tests () data_value val1 (ptr_type_node); data_storage *storage = ctx.find_reachable_var (my_var); - val1.set_address (*storage); + storage_address address (storage->get_ref (), 0); + + val1.set_address (address); printer.print (val1, ptr_type_node); ASSERT_STREQ (pp_formatted_text (&pp), "&my_var"); @@ -5117,9 +5122,11 @@ data_value_print_tests () tree vec2ptr = build_vector_type (ptr_type_node, 2); data_value val2 (vec2ptr); data_storage *strg_my_var = ctx2.find_reachable_var (my_var); - val2.set_address_at (*strg_my_var, 0); + storage_address addr_my_var (strg_my_var->get_ref (), 0); + val2.set_address_at (addr_my_var, 0); data_storage *strg_x = ctx2.find_reachable_var (y); - val2.set_address_at (*strg_x, HOST_BITS_PER_PTR); + storage_address addr_x (strg_x->get_ref (), 0); + val2.set_address_at (addr_x, HOST_BITS_PER_PTR); printer2.print (val2, vec2ptr); const char *str2 = pp_formatted_text (&pp2); @@ -5145,9 +5152,10 @@ data_value_print_tests () exec_context ctx4 = context_builder ().build (mem4, printer4); data_storage & alloc1 = ctx4.allocate (12); + storage_address address1 (alloc1.get_ref (), 0); data_value val_ptr (ptr_type_node); - val_ptr.set_address (alloc1); + val_ptr.set_address (address1); printer4.print (val_ptr, ptr_type_node); @@ -5162,9 +5170,10 @@ data_value_print_tests () ctx5.allocate (12); data_storage & alloc2_ctx5 = ctx5.allocate (17); + storage_address address2_ctx5 (alloc2_ctx5.get_ref (), 0); data_value val_ptr2 (ptr_type_node); - val_ptr.set_address (alloc2_ctx5); + val_ptr.set_address (address2_ctx5); printer5.print (val_ptr, ptr_type_node); @@ -5552,9 +5561,10 @@ context_printer_print_first_data_ref_part_tests () 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_storage); + ptr_val.set_address (var_address); data_storage *ptr_storage = ctx11.find_reachable_var (ptr); ptr_storage->set (ptr_val); @@ -5594,7 +5604,8 @@ context_printer_print_value_update_tests () data_value val1 (ptr_type_node); data_storage *storage = ctx.find_reachable_var (my_var); - val1.set_address (*storage); + storage_address address (storage->get_ref (), 0); + val1.set_address (address); printer.print_value_update (ctx, my_lhs, val1); const char *str = pp_formatted_text (&pp); @@ -5609,9 +5620,11 @@ context_printer_print_value_update_tests () tree vec2ptr = build_vector_type (ptr_type_node, 2); data_value val2 (vec2ptr); data_storage *strg_my_var = ctx2.find_reachable_var (my_var); - val2.set_address_at (*strg_my_var, 0); + storage_address addr_my_var (strg_my_var->get_ref (), 0); + val2.set_address_at (addr_my_var, 0); data_storage *strg_x = ctx2.find_reachable_var (y); - val2.set_address_at (*strg_x, HOST_BITS_PER_PTR); + storage_address addr_x (strg_x->get_ref (), 0); + val2.set_address_at (addr_x, HOST_BITS_PER_PTR); tree vec_lhs = create_var (vec2ptr, "vec_lhs"); @@ -6352,11 +6365,12 @@ exec_context_execute_assign_tests () exec_context ctx3 = builder3.build (mem, printer); data_storage & alloc1 = ctx3.allocate (12); + storage_address address1 (alloc1.get_ref (), 0); data_storage *pointer = ctx3.find_reachable_var (ptr); gcc_assert (pointer != nullptr); data_value p (ptr_type_node); - p.set_address (alloc1); + p.set_address (address1); pointer->set (p); tree ref = build2 (MEM_REF, integer_type_node, ptr,