> Hello. > > Following patch skips static {c,d}tors in IPA ICF. > Patch can bootstrap and survives regtests on x86_64-linux-gnu.
OK, (it woudl make more sense to turn them into wrappers that can be easily done, too, but we can do that next stage1) thanks! Honza > > Ready for trunk? > Thanks, > Martin > >From 7a5748b38e173702c88b97420d6b4d8969ae7e85 Mon Sep 17 00:00:00 2001 > From: marxin <mli...@suse.cz> > Date: Mon, 21 Mar 2016 13:51:32 +0100 > Subject: [PATCH] Skip static ctors/dtors in IPA ICF (PR ipa/70306) > > gcc/testsuite/ChangeLog: > > 2016-03-21 Martin Liska <mli...@suse.cz> > > * gcc.dg/ipa/pr70306.c: New test. > > gcc/ChangeLog: > > 2016-03-21 Martin Liska <mli...@suse.cz> > > * ipa-icf.c (sem_function::parse): Skip static > constructors and destructors. > --- > gcc/ipa-icf.c | 5 +++++ > gcc/testsuite/gcc.dg/ipa/pr70306.c | 45 > ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 50 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/ipa/pr70306.c > > diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c > index d82eb87..aa6589c 100644 > --- a/gcc/ipa-icf.c > +++ b/gcc/ipa-icf.c > @@ -1697,6 +1697,11 @@ sem_function::parse (cgraph_node *node, bitmap_obstack > *stack) > if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != > NULL) > return NULL; > > + /* PR ipa/70306. */ > + if (DECL_STATIC_CONSTRUCTOR (node->decl) > + || DECL_STATIC_DESTRUCTOR (node->decl)) > + return NULL; > + > sem_function *f = new sem_function (node, 0, stack); > > f->init (); > diff --git a/gcc/testsuite/gcc.dg/ipa/pr70306.c > b/gcc/testsuite/gcc.dg/ipa/pr70306.c > new file mode 100644 > index 0000000..be18208 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/ipa/pr70306.c > @@ -0,0 +1,45 @@ > +/* { dg-options "-O2 -fdump-ipa-icf" } */ > +/* { dg-do run } */ > + > +int ctor_counter = 1; > +int dtor_counter; > + > +__attribute__((constructor)) > +void A() > +{ > + ctor_counter++; > +} > + > +__attribute__((destructor)) > +void B() > +{ > + if (dtor_counter == 0) > + __builtin_abort (); > + > + dtor_counter--; > +} > + > +__attribute__((constructor)) > +static void C() { > + ctor_counter++; > +} > + > +__attribute__((destructor)) > +static void D() { > + if (dtor_counter == 0) > + __builtin_abort (); > + > + dtor_counter--; > +} > + > +int main() > +{ > + if (ctor_counter != 3) > + __builtin_abort (); > + > + dtor_counter = 2; > + > + return 0; > +} > + > +/* { dg-final { scan-ipa-dump "Equal symbols: 0" "icf" } } */ > -- > 2.7.1 >