re PR tree-optimization/43008 (Attribute malloc not handled correctly)
2010-02-09 Richard Guenther <rguenther@suse.de> 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
This commit is contained in:
parent
44e7145eb9
commit
72d182d3d2
@ -1,3 +1,11 @@
|
||||
2010-02-09 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
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 <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/43000
|
||||
|
@ -1,3 +1,8 @@
|
||||
2010-02-09 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/43008
|
||||
* gcc.c-torture/execute/pr43008.c: New testcase.
|
||||
|
||||
2010-02-09 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/43000
|
||||
|
23
gcc/testsuite/gcc.c-torture/execute/pr43008.c
Normal file
23
gcc/testsuite/gcc.c-torture/execute/pr43008.c
Normal file
@ -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;
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user