From 72d182d3d2cbfdf653bf6a9d34172f78420802ef Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 9 Feb 2010 16:11:34 +0000 Subject: [PATCH] re PR tree-optimization/43008 (Attribute malloc not handled correctly) 2010-02-09 Richard Guenther PR tree-optimization/43008 * tree-ssa-structalias.c (handle_lhs_call): Pass in the fndecl, make HEAP variables initialized from global memory if they are not known builtin functions. (find_func_aliases): Adjust. * gcc.c-torture/execute/pr43008.c: New testcase. From-SVN: r156628 --- gcc/ChangeLog | 8 +++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/execute/pr43008.c | 23 +++++++++++++++++++ gcc/tree-ssa-structalias.c | 10 ++++++-- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr43008.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73e2be6d313..47608b1e2d4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-02-09 Richard Guenther + + PR tree-optimization/43008 + * tree-ssa-structalias.c (handle_lhs_call): Pass in the fndecl, + make HEAP variables initialized from global memory if they + are not known builtin functions. + (find_func_aliases): Adjust. + 2010-02-09 Richard Guenther PR tree-optimization/43000 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bbc21ec2aa9..9c162e27e20 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-02-09 Richard Guenther + + PR tree-optimization/43008 + * gcc.c-torture/execute/pr43008.c: New testcase. + 2010-02-09 Richard Guenther PR tree-optimization/43000 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr43008.c b/gcc/testsuite/gcc.c-torture/execute/pr43008.c new file mode 100644 index 00000000000..428f4ae3bbd --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr43008.c @@ -0,0 +1,23 @@ +int i; +struct X { + int *p; +}; +struct X * __attribute__((malloc)) +my_alloc (void) +{ + struct X *p = __builtin_malloc (sizeof (struct X)); + p->p = &i; + return p; +} +extern void abort (void); +int main() +{ + struct X *p, *q; + p = my_alloc (); + q = my_alloc (); + *(p->p) = 1; + *(q->p) = 0; + if (*(p->p) != 0) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 3db28745f1a..5138e72feb4 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -3482,7 +3482,7 @@ handle_rhs_call (gimple stmt, VEC(ce_s, heap) **results) the LHS point to global and escaped variables. */ static void -handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc) +handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc, tree fndecl) { VEC(ce_s, heap) *lhsc = NULL; @@ -3496,6 +3496,12 @@ handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc) it escapes. */ DECL_EXTERNAL (vi->decl) = 0; vi->is_global_var = 0; + /* If this is not a real malloc call assume the memory was + initialized and thus may point to global memory. All + builtin functions with the malloc attribute behave in a sane way. */ + if (!fndecl + || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL) + make_constraint_from (vi, nonlocal_id); } else if (VEC_length (ce_s, rhsc) > 0) { @@ -3798,7 +3804,7 @@ find_func_aliases (gimple origt) handle_rhs_call (t, &rhsc); if (gimple_call_lhs (t) && could_have_pointers (gimple_call_lhs (t))) - handle_lhs_call (gimple_call_lhs (t), flags, rhsc); + handle_lhs_call (gimple_call_lhs (t), flags, rhsc, fndecl); VEC_free (ce_s, heap, rhsc); } else