Honza: following up from our IRC chat, I've ported the symtab, cgraph
and varpool nodes from the current hand-coded inheritance-in-C scheme
to being a C+ class hierarchy.
I know you're in the middle of making lots of other changes to this code,
so I've written a script to automate the parts of the conversion where
appropriate - see below.
In summary,
struct GTY(()) symtab_node_base
becomes:
class GTY((user)) symtab_node_base
and the subclasses:
struct GTY(()) cgraph_node
and:
struct GTY(()) varpool_node
become (respectively):
struct GTY((user)) cgraph_node : public symtab_node_base
and:
class GTY((user)) varpool_node : public symtab_node_base
The symtab_node_def union goes away, as do the "symbol" fields at the
top of the two subclasses.
I kept the existing names for things, and the "struct" for cgraph_node
since it is often referred to as "struct cgraph_node".
The patch is in three parts; all three are needed.
* a fix for a bug in gengtype:
http://gcc.gnu.org/ml/gcc-patches/2013-08/msg00882.html
This is needed to avoid generating a malfunctioning gtype-desc.c
*some* of the time - in capriciously changing ways as the sources
change... :( I sent it separately since I'm running into this
issue with other changes I'm trying out; it "randomly" appears
when trying to use GTY((user)).
* Patch 1 of the 2 in this series is the hand-written part of the
conversion. This makes the changes above, plus various workarounds
for dealing with yet more issues in how gengtype handles
GTY((user)).
* Patch 2 of the 2 in this series is the autogenerated part.
Currently to access the base symtab fields of a cgraph or varpool
node, the code has e.g.
node->symbol.decl
whereas with C++ inheritance, the "symbol" field is no more, and we
directly use the base-class field:
node->decl
The script that makes the patch is for Python (2.7), and is in:
https://github.com/davidmalcolm/gcc-refactoring-scripts
as refactor_symtab.py and there's a test suite in
test_refactor_symtab.py. It's basically a glorified sed, but it
also autogenerates the ChangeLog entries. It expects the gcc
checkout to be in a sister directory named "src".
Successfully bootstrapped and regtested on x86_64-unknown-linux-gnu
(using all three patches together, showing same results as an unpatched
source tree).
How does this look? Are there other automated changes you'd like me
to make? How should I go about getting this into trunk, given that you
have many other changes to this code on the way?
Thanks; hope this is helpful
Dave
David Malcolm (2):
Convert symtab, cgraph and varpool nodes into a real class hierarchy
Autogenerated fixes of "->symbol." to "->"
gcc/ada/gcc-interface/trans.c | 2 +-
gcc/ada/gcc-interface/utils.c | 2 +-
gcc/asan.c | 10 +-
gcc/c-family/c-gimplify.c | 2 +-
gcc/c-family/c-pragma.c | 2 +-
gcc/cfgexpand.c | 2 +-
gcc/cgraph.c | 480 ++++++++++++++++++++++++++++++------------
gcc/cgraph.h | 150 +++++++------
gcc/cgraphbuild.c | 10 +-
gcc/cgraphclones.c | 84 ++++----
gcc/cgraphunit.c | 260 +++++++++++------------
gcc/config/i386/i386.c | 18 +-
gcc/coverage.c | 4 +-
gcc/cp/call.c | 2 +-
gcc/cp/decl2.c | 24 +--
gcc/cp/tree.c | 4 +-
gcc/dbxout.c | 2 +-
gcc/dwarf2out.c | 4 +-
gcc/gimple-fold.c | 8 +-
gcc/gimplify.c | 4 +-
gcc/ipa-cp.c | 66 +++---
gcc/ipa-inline-analysis.c | 48 ++---
gcc/ipa-inline-transform.c | 46 ++--
gcc/ipa-inline.c | 166 +++++++--------
gcc/ipa-prop.c | 56 ++---
gcc/ipa-pure-const.c | 54 ++---
gcc/ipa-ref-inline.h | 4 +-
gcc/ipa-ref.c | 14 +-
gcc/ipa-ref.h | 6 +-
gcc/ipa-reference.c | 60 +++---
gcc/ipa-split.c | 26 +--
gcc/ipa-utils.c | 46 ++--
gcc/ipa.c | 410 ++++++++++++++++++------------------
gcc/is-a.h | 8 +-
gcc/java/decl.c | 2 +-
gcc/lto-cgraph.c | 224 ++++++++++----------
gcc/lto-streamer-in.c | 4 +-
gcc/lto-streamer-out.c | 38 ++--
gcc/lto-symtab.c | 198 ++++++++---------
gcc/lto/lto-partition.c | 126 +++++------
gcc/lto/lto.c | 26 +--
gcc/passes.c | 28 +--
gcc/symtab.c | 372 ++++++++++++++++----------------
gcc/toplev.c | 6 +-
gcc/trans-mem.c | 94 ++++-----
gcc/tree-eh.c | 4 +-
gcc/tree-emutls.c | 38 ++--
gcc/tree-inline.c | 36 ++--
gcc/tree-nested.c | 10 +-
gcc/tree-pretty-print.c | 2 +-
gcc/tree-profile.c | 20 +-
gcc/tree-sra.c | 20 +-
gcc/tree-ssa-structalias.c | 40 ++--
gcc/tree-vectorizer.c | 2 +-
gcc/tree.c | 10 +-
gcc/value-prof.c | 18 +-
gcc/varasm.c | 30 +--
gcc/varpool.c | 118 +++++------
58 files changed, 1881 insertions(+), 1669 deletions(-)
--
1.7.11.7