From d8fe597607a6df62180d95d27105de746bf27842 Mon Sep 17 00:00:00 2001 From: huzife <634763349@qq.com> Date: Tue, 3 Jun 2025 12:31:07 +0800 Subject: [PATCH] [struct-reorg] Check ADDR_EXPR in pointer plus assign --- gcc/ipa-struct-reorg/ipa-struct-reorg.cc | 2 +- .../gcc.dg/struct/rf_defined_by_addr_expr.c | 16 ++++++++++++++++ gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/struct/rf_defined_by_addr_expr.c diff --git a/gcc/ipa-struct-reorg/ipa-struct-reorg.cc b/gcc/ipa-struct-reorg/ipa-struct-reorg.cc index 1140edd1d73..f5be8de7691 100644 --- a/gcc/ipa-struct-reorg/ipa-struct-reorg.cc +++ b/gcc/ipa-struct-reorg/ipa-struct-reorg.cc @@ -5566,7 +5566,7 @@ ipa_struct_reorg::check_definition_assign (srdecl *decl, : TYPE_SIZE_UNIT (type->type))) type->mark_escape (escape_non_multiply_size, stmt); - if (TREE_CODE (rhs) == SSA_NAME) + if (TREE_CODE (rhs) == SSA_NAME || TREE_CODE (rhs) == ADDR_EXPR) check_type_and_push (rhs, decl, worklist, stmt); return; } diff --git a/gcc/testsuite/gcc.dg/struct/rf_defined_by_addr_expr.c b/gcc/testsuite/gcc.dg/struct/rf_defined_by_addr_expr.c new file mode 100644 index 00000000000..65922be8e84 --- /dev/null +++ b/gcc/testsuite/gcc.dg/struct/rf_defined_by_addr_expr.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +struct A { + int a; +}; + +extern unsigned long long offset(); + +int main() { + unsigned char num[16]; + ((struct A*)(num + offset() * 4))->a = 10; + + return num[0]; +} + +/* { dg-final { scan-ipa-dump "struct A(\\\(\[0-9\]*\\\))? has escaped: \"Type escapes a cast to a different pointer\"" "struct_reorg" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c b/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c index 5ff166f0808..c52636925e6 100644 --- a/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c +++ b/gcc/testsuite/gcc.dg/struct/sr_early_void_ptr.c @@ -25,4 +25,4 @@ int main() { return 0; } -/* { dg-final { scan-ipa-dump "struct S(\[0-9\]*) has escaped" "struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "struct S(\\\(\[0-9\]*\\\))? has escaped" "struct_reorg" } } */ -- Gitee