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>
|
2010-02-09 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/43000
|
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>
|
2010-02-09 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/43000
|
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. */
|
the LHS point to global and escaped variables. */
|
||||||
|
|
||||||
static void
|
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;
|
VEC(ce_s, heap) *lhsc = NULL;
|
||||||
|
|
||||||
@ -3496,6 +3496,12 @@ handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc)
|
|||||||
it escapes. */
|
it escapes. */
|
||||||
DECL_EXTERNAL (vi->decl) = 0;
|
DECL_EXTERNAL (vi->decl) = 0;
|
||||||
vi->is_global_var = 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)
|
else if (VEC_length (ce_s, rhsc) > 0)
|
||||||
{
|
{
|
||||||
@ -3798,7 +3804,7 @@ find_func_aliases (gimple origt)
|
|||||||
handle_rhs_call (t, &rhsc);
|
handle_rhs_call (t, &rhsc);
|
||||||
if (gimple_call_lhs (t)
|
if (gimple_call_lhs (t)
|
||||||
&& could_have_pointers (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);
|
VEC_free (ce_s, heap, rhsc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user