ok. David
On Fri, Sep 30, 2011 at 6:54 PM, Easwaran Raman <era...@google.com> wrote: > This fixes two issues with sampled profile collection. It delays > cleanup of instrumentation_to_be_sampled after all callgraph nodes > have been instrumented and prevents gcov_sample_counter_decl and > gcov_sampling_rate_decl from being garbage collected. > > Ok for google/gcc-4_6 and google/main branches? > > -Easwaran > > 2011-09-30 Easwaran Raman <era...@google.com> > > * tree-profile.c (gcov_sample_counter_decl): Add GTY marker. > (gcov_sampling_rate_decl): Likewise. > (add_sampling_to_edge_counters): Do not free > instrumentation_to_be_sampled. > (cleanup_instrumentation_sampling): New function. > (tree_profiling): Call cleanup_instrumentation_sampling at the end. > > testsuite/ChangeLog.google-4_6: > > 2011-09-30 Easwaran Raman <era...@google.com> > > * gcc.dg/sample-profile-generate-1.c: New test. > > Index: gcc/testsuite/gcc.dg/sample-profile-generate-1.c > =================================================================== > --- gcc/testsuite/gcc.dg/sample-profile-generate-1.c (revision 0) > +++ gcc/testsuite/gcc.dg/sample-profile-generate-1.c (revision 0) > @@ -0,0 +1,26 @@ > +/* { dg-do compile} */ > +/* { dg-options "-O2 -fprofile-generate -fprofile-generate-sampling" } */ > + > +void foobar(int); > + > +void > +foo (void) > +{ > + int i; > + for (i = 0; i < 100; i++) > + { > + foobar(i); > + } > +} > + > +void > +bar (void) > +{ > + int i; > + for (i = 0; i < 100; i++) > + { > + foobar(i); > + } > +} > + > +/* { dg-final { cleanup-coverage-files } } */ > > Index: tree-profile.c > =================================================================== > --- tree-profile.c (revision 178897) > +++ tree-profile.c (working copy) > @@ -163,10 +163,10 @@ init_ic_make_global_vars (void) > static struct pointer_set_t *instrumentation_to_be_sampled = NULL; > > /* extern __thread gcov_unsigned_t __gcov_sample_counter */ > -static tree gcov_sample_counter_decl = NULL_TREE; > +static GTY(()) tree gcov_sample_counter_decl = NULL_TREE; > > /* extern gcov_unsigned_t __gcov_sampling_rate */ > -static tree gcov_sampling_rate_decl = NULL_TREE; > +static GTY(()) tree gcov_sampling_rate_decl = NULL_TREE; > > /* forward declaration. */ > void gimple_init_instrumentation_sampling (void); > @@ -281,9 +281,13 @@ add_sampling_to_edge_counters (void) > break; > } > } > +} > > +static void > +cleanup_instrumentation_sampling (void) > +{ > /* Free the bitmap. */ > - if (instrumentation_to_be_sampled) > + if (flag_profile_generate_sampling && instrumentation_to_be_sampled) > { > pointer_set_destroy (instrumentation_to_be_sampled); > instrumentation_to_be_sampled = NULL; > @@ -1452,6 +1456,7 @@ tree_profiling (void) > } > > del_node_map(); > + cleanup_instrumentation_sampling(); > return 0; > } >