> On Fri, May 13, 2011 at 5:54 AM, Paolo Bonzini <bonz...@gnu.org> wrote:
> > On 05/13/2011 03:03 AM, Rong Xu wrote:
> >>
> >>        * gcc/coverage.c        (revision 173717): set a flag if building
> >> for Linux kernel.
> >>        * gcc/tree-profile.c    (revision 173717): don't emit TLS
> >> declarations for Linux kernel builds.
> >
> > I think this should be done without touching at all the profiling machinery
> > in GCC.
> >
> > 1) add a new TLS model -ftls-model=none and make the kernel uses it. The
> > model would simply force targetm.have_tls to false.
> >
> 
> This is a good idea.
> 
> 
> > 2) as Richi mentioned, gcov-io and libgcov changes then can move to the
> > kernel, and GCC needs no change at all here.
> >
> 
> In fact -- reuse gcc code profiling machinery for FDO is the KEY
> objective in this effort --- the effort tries to minimize gcc changes
> by refactoring gcc code and isolating/abstracting away part of gcc
> implementation that is user space program specific without using
> runtime hooks.  Aside from the kernel FDO change -- the refactoring
> itself actually makes the libgcov code more readable -- the existing
> implementation has many huge functions etc.
> 
> Kernel source has their implementation of coverage testing -- but it
> makes lots of data structure assumptions and hard coded -- it can
> easily out of sync with gcc and is considered  unmaintainable.

Yep,
I think it does make sense to share the implementation, but we need to find
resonable way to do so.  I guess we could separate out the i/o bits
into interface generic enough to cover the needs, move libgcov into its
own directory (just like libgcc is these days) and add an configury option
that sets the interface.  The kernel's interface can then be implemented
in a single file instead of tons of ifdefs and I guess can sit either in kernel
or gcc tree...

Honza
> 
> Rong will have more explanation on the design.
> 
> Thanks,
> 
> David
> 
> 
> > BTW, these parts of LIPO:
> >
> >> +      if (!is_kernel_build)
> >> +        DECL_TLS_MODEL (dc_gcov_type_ptr_var) =
> >> +         decl_default_tls_model (dc_gcov_type_ptr_var);
> >>
> >>       dc_void_ptr_var =
> >>        build_decl (UNKNOWN_LOCATION, VAR_DECL,
> >> @@ -1488,8 +1493,9 @@
> >>                    ptr_void);
> >>       DECL_ARTIFICIAL (dc_void_ptr_var) = 1;
> >>       DECL_EXTERNAL (dc_void_ptr_var) = 1;
> >> -      DECL_TLS_MODEL (dc_void_ptr_var) =
> >> -       decl_default_tls_model (dc_void_ptr_var);
> >> +      if (!is_kernel_build)
> >> +        DECL_TLS_MODEL (dc_void_ptr_var) =
> >> +         decl_default_tls_model (dc_void_ptr_var);
> >
> > Probably are missing a !targetm.have_tls.
> >
> > Paolo
> >

Reply via email to