Hi, this is very basis of the symbol table work. The basic idea is: 1) give cgraph node and varpool node common base (symtab node) 2) Move common data there: that is type, declaration, visibility flags, force_output, ipa references and other stuff. 3) Introduce symtab.c for basic symbol table manipulation that in first run is represented as simple linked list of cgraph/varpool node entries. 4) Update ipa-reference API for the new class structure 5) Significantly clanup/rework old cgraph reachability and construction code that has grown up very convoluted to meet non-unit-at-a-time needs. Merge most of logic done on varpool and cgraph into common grounds 6) reorg WHOPR partitioning code 7) Add new types of symbol table entries - labels, aliases and possibly constant pools and symbols defined by asm statements so existing WHOPR bugs have chance to be solved. 8) Add actual symbol name hash - this is trickier than it sounds given that GCC currently don't really know the symbol names on non-LTO targets. I plan to simply take the existing lto-symtab logic and slowly require targtets to provide hook to translate ASSEMBLER_NAME into symbol name. It would be nice to get rid of ASSEMBLER_NAME and replace it by SYMBOL_NAME + set of flags, but this is very hard to do since assembler name goes everywhere into target machinery. I am not really volunteering to do that at this moment. 9) Reorg most of lto-symtab to work on symtab keeping the prevailing and other stuff there.
I would like to get most of the changes into mainline for this stage1. In worst case at least 1-6. I prototytped all except for lto-symtab reorg, but I would like to re-do everything incrementally for mainline with cleanups on the way. Many of things can be significantly simplified over current implementation and I hope it will make it easier to follow the changes and get me some useful feedback. It is kind of second chance for cleaner cgraph API and it would be nice to get it mostly right. This patch takes the very first step by adding the base object. It implements inheritance in C via cgraph/varpool accessors. C++ would make sense here, but I think I still can't because of gengtype. Once C++ is not only allowed, but also useful, I don't think changing the syntactical shugar to actual classes would be a significant project. Honza * cgraph.h: Remove misledaing comment on ipa-ref.h. (symtab_type): New enum. (symtab_node): New structure. (cgraph_node, varpool_node): Add symbol base type. (cgraph, varpool): New accestor functions. * cgraph.c (cgraph_create_node_1): Set symbol type. * varpool.c (varpool_node): Set symbol type. Index: cgraph.h =================================================================== --- cgraph.h (revision 186252) +++ cgraph.h (working copy) @@ -27,7 +27,23 @@ along with GCC; see the file COPYING3. #include "tree.h" #include "basic-block.h" #include "function.h" -#include "ipa-ref.h" /* FIXME: inappropriate dependency of cgraph on IPA. */ +#include "ipa-ref.h" + +/* Symbol table consists of functions and variables. + TODO: add labels, constant pool and aliases. */ +enum symtab_type +{ + SYMTAB_FUNCTION, + SYMTAB_VARIABLE +}; + +/* Base of all entries in the symbol table. + The symtab_node is inherited by cgraph and varpol nodes. */ +struct GTY(()) symtab_node +{ + /* Type of the symbol. */ + enum symtab_type type; +}; enum availability { @@ -150,6 +166,7 @@ struct GTY(()) cgraph_clone_info Each function decl has assigned cgraph_node listing callees and callers. */ struct GTY((chain_next ("%h.next"), chain_prev ("%h.previous"))) cgraph_node { + struct symtab_node symbol; tree decl; struct cgraph_edge *callees; struct cgraph_edge *callers; @@ -387,6 +404,7 @@ DEF_VEC_ALLOC_P(cgraph_edge_p,heap); Each static variable decl has assigned varpool_node. */ struct GTY((chain_next ("%h.next"), chain_prev ("%h.prev"))) varpool_node { + struct symtab_node symbol; tree decl; /* For aliases points to declaration DECL is alias of. */ tree alias_of; @@ -688,6 +706,23 @@ void varpool_add_new_variable (tree); #define FOR_EACH_STATIC_VARIABLE(node) \ for ((node) = varpool_nodes_queue; (node); (node) = (node)->next_needed) +/* Return callgraph node for given symbol and check it is a function. */ +static inline struct cgraph_node * +cgraph (struct symtab_node *node) +{ + gcc_checking_assert (node->type == SYMTAB_FUNCTION); + return (struct cgraph_node *)node; +} + +/* Return varpool node for given symbol and check it is a variable. */ +static inline struct varpool_node * +varpool (struct symtab_node *node) +{ + gcc_checking_assert (node->type == SYMTAB_FUNCTION); + return (struct varpool_node *)node; +} + + /* Return first reachable static variable with initializer. */ static inline struct varpool_node * varpool_first_static_initializer (void) Index: cgraph.c =================================================================== --- cgraph.c (revision 186252) +++ cgraph.c (working copy) @@ -473,6 +473,7 @@ cgraph_create_node_1 (void) { struct cgraph_node *node = cgraph_allocate_node (); + node->symbol.type = SYMTAB_FUNCTION; node->next = cgraph_nodes; node->order = cgraph_order++; if (cgraph_nodes) Index: varpool.c =================================================================== --- varpool.c (revision 186252) +++ varpool.c (working copy) @@ -142,6 +142,7 @@ varpool_node (tree decl) if (*slot) return *slot; node = ggc_alloc_cleared_varpool_node (); + node->symbol.type = SYMTAB_VARIABLE; node->decl = decl; node->order = cgraph_order++; node->next = varpool_nodes;