I've been looking at removing global state from GCC with a view to
making it be usable as a shared library.

I've been posting various patches relating to this, but I thought it was
time to post a comprehensive plan so you can see how I think it all
ought to fit together.

You can see an HTML version of my proposal at:
  http://dmalcolm.fedorapeople.org/gcc/global-state/

and the source for the doc can be seen at:
  https://github.com/davidmalcolm/gcc-global-state/
(restructured text, using the Sphinx toolchain).

I've gone through all of GCC's passes, identifying internal state, and
also looked at the most-frequently used global variables in GCC.  You
can see detailed notes on these in the appendices.

It's still a work-in-progress - there are still quite a few TODOs in
there, but it seemed time to post to this list.

A single-paragraph summary is that I want to move global variables and
functions into classes: these classes will be "singletons" in the normal
build, and will have multiple instances in a shared library build,
allowing for multiple "parallel universes" of state within one GCC
process.  There are various tricks to (a) maintain the performance of
the standard "monolithic binaries" use case and (b) minimize the
patching and backporting pain relative to older GCC source trees.  In
particular, it introduces a new compiler attribute "force_static" which
gets used in stages 2 and 3 of the bootstrap to eliminate "this" from
methods of the various singleton classes.

I hope the plan seems reasonable to the core GCC maintainers, and I'm
keen to get moving on this for GCC 4.9.   However I appreciate that I'm
a relative newcomer to GCC development (albeit the author/maintainer of
the gcc python plugin, for the last 2 years).

There are various questions e.g. what can go into trunk vs a branch?
various naming decisions etc.

The "trunk vs branch" question is the one I'm most keen to resolve.  In
particular, I'm aware that Andrew MacLeod recently posted another
architectural proposal:
  http://gcc.gnu.org/ml/gcc/2013-06/msg00163.html
AIUI his proposal and mine are mostly orthogonal to each other: his
makes changes to the insides to "tree", whereas mine bundles up global
variables and functions into classes.  Both proposals involve touching a
lot of code but both can largely be done incrementally, and, I hope
independently of each other - but I want to avoid painful branch
mergers, of course.

BTW, I will be at the GNU Tools Cauldron next month.

Thoughts?
Dave

Reply via email to