[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] gimple-exec: prise en charge memcpy
Mikael Morin
mikael@gcc.gnu.org
Fri Jun 13 15:05:40 GMT 2025
https://gcc.gnu.org/g:ad9802981a69de9cbbbbb27094b43542eda34761
commit ad9802981a69de9cbbbbb27094b43542eda34761
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Sat May 17 18:38:28 2025 +0200
gimple-exec: prise en charge memcpy
Diff:
---
gcc/cgraphunit.cc | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 59 insertions(+), 3 deletions(-)
diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index 836d62192c1f..84f8ffc3841e 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -2457,8 +2457,6 @@ class data_value
void set_cst_at (unsigned dest_offset, unsigned value_width,
const wide_int &val, unsigned src_offset);
stored_address *find_address (unsigned offset) const;
- void set_at (unsigned dest_offset, unsigned value_width,
- const data_value & value_src, unsigned src_offset);
friend void selftest::data_value_classify_tests ();
friend void selftest::data_value_set_address_tests ();
@@ -2484,6 +2482,8 @@ public:
void set_undefined_at (unsigned offset, unsigned width);
void set_address_at (storage_address & address, unsigned offset);
void set_address (storage_address & address);
+ void set_at (unsigned dest_offset, unsigned value_width,
+ const data_value & value_src, unsigned src_offset);
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);
@@ -4439,8 +4439,10 @@ exec_context::execute_call (gcall *g)
data_storage & storage1 = addr1.storage.get ();
data_value src = storage1.get_value ();
wide_int wi_len2 = len2.get_cst ();
+ wi_len2 *= CHAR_BIT;
gcc_assert (wi::fits_uhwi_p (wi_len2));
- dest_val.set (src);
+ dest_val.set_at (0, wi_len2.to_uhwi (),
+ src, addr1.offset);
storage0.set (dest_val);
}
else
@@ -8647,6 +8649,60 @@ exec_context_execute_call_tests ()
wide_int wi_v82 = v82_after.get_cst ();
ASSERT_PRED1 (wi::fits_shwi_p, wi_v82);
ASSERT_EQ (wi_v82.to_shwi (), 17);
+
+
+ tree i91 = create_var (integer_type_node, "i91");
+ tree c92 = create_var (char_type_node, "c92");
+ tree p93 = create_var (ptr_type_node, "p93");
+
+ vec<tree> decls9{};
+ decls9.safe_push (i91);
+ decls9.safe_push (c92);
+ decls9.safe_push (p93);
+
+ heap_memory mem9;
+ context_builder builder9 {};
+ builder9.add_decls (&decls9);
+ exec_context ctx9 = builder9.build (mem9, printer);
+
+ data_storage * storage_i91 = ctx9.find_reachable_var (i91);
+ gcc_assert (storage_i91 != nullptr);
+ storage_address addr91 (storage_i91->get_ref (), CHAR_BIT);
+
+ data_value val_addr91 (ptr_type_node);
+ val_addr91.set_address (addr91);
+
+ data_storage * storage_p93 = ctx9.find_reachable_var (p93);
+ gcc_assert (storage_p93 != nullptr);
+ storage_p93->set (val_addr91);
+
+ tree a92 = build1_loc (UNKNOWN_LOCATION, ADDR_EXPR,
+ ptr_type_node, c92);
+
+ gcall * memcpy_call9 = gimple_build_call (memcpy_fn, 3, a92, p93,
+ size_one_node);
+
+ data_value val91 (integer_type_node);
+ wide_int wi91 = wi::uhwi (5 + 3 * 256 + 1 * 65536, HOST_BITS_PER_INT);
+ val91.set_cst (wi91);
+
+ storage_i91->set (val91);
+
+ data_storage *storage_c92 = ctx9.find_reachable_var (c92);
+ gcc_assert (storage_c92 != nullptr);
+
+ data_value c92_before = storage_c92->get_value ();
+
+ ASSERT_EQ (c92_before.classify (), VAL_UNDEFINED);
+
+ ctx9.execute (memcpy_call9);
+
+ data_value c92_after = storage_c92->get_value ();
+
+ ASSERT_EQ (c92_after.classify (), VAL_CONSTANT);
+ wide_int wi_c92 = c92_after.get_cst ();
+ ASSERT_PRED1 (wi::fits_shwi_p, wi_c92);
+ ASSERT_EQ (wi_c92.to_shwi (), 3);
}
void
More information about the Gcc-cvs
mailing list