Commit a3bfa8b8 by David Malcolm Committed by David Malcolm

Convert symtab, cgraph and varpool nodes into a real class hierarchy

This is the handwritten part of the patch; automated part to follow.

	* cgraph.h (symtab_node_base): Convert to a class;
	add GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"))), and take
	chain_next/prev from symtab_node_def.
	(cgraph_node): Inherit from symtab_node; add GTY option
	tag ("SYMTAB_FUNCTION").
	(varpool_node): Inherit from symtab_node; add GTY option
	tag ("SYMTAB_VARIABLE").
	(symtab_node_def): Remove.
	(is_a_helper <cgraph_node>::test (symtab_node_def *)): Convert to...
	(is_a_helper <cgraph_node>::test (symtab_node_base *)): ...this.
	(is_a_helper <varpool_node>::test (symtab_node_def *)): Convert to...
	(is_a_helper <varpool_node>::test (symtab_node_base *)): ...this.

	* ipa-ref.h (symtab_node_def): Drop.
	(symtab_node): Change underlying type from symtab_node_def to
	symtab_node_base.
	(const_symtab_node): Likwise.

	* is-a.h: Update examples in comment.

	* symtab.c (symtab_hash): Change symtab_node_def to symtab_node_base.
	(assembler_name_hash): Likewise.

From-SVN: r204170
parent c960732f
2013-10-29 David Malcolm <dmalcolm@redhat.com>
* cgraph.h (symtab_node_base): Convert to a class;
add GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"))), and take
chain_next/prev from symtab_node_def.
(cgraph_node): Inherit from symtab_node; add GTY option
tag ("SYMTAB_FUNCTION").
(varpool_node): Inherit from symtab_node; add GTY option
tag ("SYMTAB_VARIABLE").
(symtab_node_def): Remove.
(is_a_helper <cgraph_node>::test (symtab_node_def *)): Convert to...
(is_a_helper <cgraph_node>::test (symtab_node_base *)): ...this.
(is_a_helper <varpool_node>::test (symtab_node_def *)): Convert to...
(is_a_helper <varpool_node>::test (symtab_node_base *)): ...this.
* ipa-ref.h (symtab_node_def): Drop.
(symtab_node): Change underlying type from symtab_node_def to
symtab_node_base.
(const_symtab_node): Likwise.
* is-a.h: Update examples in comment.
* symtab.c (symtab_hash): Change symtab_node_def to symtab_node_base.
(assembler_name_hash): Likewise.
2013-10-29 Martin Liska <marxin.liska@gmail.com> 2013-10-29 Martin Liska <marxin.liska@gmail.com>
* doc/tree-ssa.texi (gimple_phi_result): Document. * doc/tree-ssa.texi (gimple_phi_result): Document.
...@@ -39,8 +39,11 @@ enum symtab_type ...@@ -39,8 +39,11 @@ enum symtab_type
/* Base of all entries in the symbol table. /* Base of all entries in the symbol table.
The symtab_node is inherited by cgraph and varpol nodes. */ The symtab_node is inherited by cgraph and varpol nodes. */
struct GTY(()) symtab_node_base class GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"),
chain_next ("%h.next"), chain_prev ("%h.previous")))
symtab_node_base
{ {
public:
/* Type of the symbol. */ /* Type of the symbol. */
ENUM_BITFIELD (symtab_type) type : 8; ENUM_BITFIELD (symtab_type) type : 8;
...@@ -251,25 +254,19 @@ struct GTY(()) cgraph_clone_info ...@@ -251,25 +254,19 @@ struct GTY(()) cgraph_clone_info
/* The cgraph data structure. /* The cgraph data structure.
Each function decl has assigned cgraph_node listing callees and callers. */ Each function decl has assigned cgraph_node listing callees and callers. */
struct GTY(()) cgraph_node { struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node_base {
struct symtab_node_base symbol; public:
struct cgraph_edge *callees; struct cgraph_edge *callees;
struct cgraph_edge *callers; struct cgraph_edge *callers;
/* List of edges representing indirect calls with a yet undetermined /* List of edges representing indirect calls with a yet undetermined
callee. */ callee. */
struct cgraph_edge *indirect_calls; struct cgraph_edge *indirect_calls;
/* For nested functions points to function the node is nested in. */ /* For nested functions points to function the node is nested in. */
struct cgraph_node * struct cgraph_node *origin;
GTY ((nested_ptr (union symtab_node_def, "(struct cgraph_node *)(%h)", "(symtab_node)%h")))
origin;
/* Points to first nested function, if any. */ /* Points to first nested function, if any. */
struct cgraph_node * struct cgraph_node *nested;
GTY ((nested_ptr (union symtab_node_def, "(struct cgraph_node *)(%h)", "(symtab_node)%h")))
nested;
/* Pointer to the next function with same origin, if any. */ /* Pointer to the next function with same origin, if any. */
struct cgraph_node * struct cgraph_node *next_nested;
GTY ((nested_ptr (union symtab_node_def, "(struct cgraph_node *)(%h)", "(symtab_node)%h")))
next_nested;
/* Pointer to the next clone. */ /* Pointer to the next clone. */
struct cgraph_node *next_sibling_clone; struct cgraph_node *next_sibling_clone;
struct cgraph_node *prev_sibling_clone; struct cgraph_node *prev_sibling_clone;
...@@ -517,9 +514,8 @@ typedef struct cgraph_edge *cgraph_edge_p; ...@@ -517,9 +514,8 @@ typedef struct cgraph_edge *cgraph_edge_p;
/* The varpool data structure. /* The varpool data structure.
Each static variable decl has assigned varpool_node. */ Each static variable decl has assigned varpool_node. */
struct GTY(()) varpool_node { class GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node_base {
struct symtab_node_base symbol; public:
/* Set when variable is scheduled to be assembled. */ /* Set when variable is scheduled to be assembled. */
unsigned output : 1; unsigned output : 1;
}; };
...@@ -535,22 +531,12 @@ struct GTY(()) asm_node { ...@@ -535,22 +531,12 @@ struct GTY(()) asm_node {
int order; int order;
}; };
/* Symbol table entry. */
union GTY((desc ("%h.symbol.type"), chain_next ("%h.symbol.next"),
chain_prev ("%h.symbol.previous"))) symtab_node_def {
struct symtab_node_base GTY ((tag ("SYMTAB_SYMBOL"))) symbol;
/* To access the following fields,
use the use dyn_cast or as_a to obtain the concrete type. */
struct cgraph_node GTY ((tag ("SYMTAB_FUNCTION"))) x_function;
struct varpool_node GTY ((tag ("SYMTAB_VARIABLE"))) x_variable;
};
/* Report whether or not THIS symtab node is a function, aka cgraph_node. */ /* Report whether or not THIS symtab node is a function, aka cgraph_node. */
template <> template <>
template <> template <>
inline bool inline bool
is_a_helper <cgraph_node>::test (symtab_node_def *p) is_a_helper <cgraph_node>::test (symtab_node_base *p)
{ {
return p->symbol.type == SYMTAB_FUNCTION; return p->symbol.type == SYMTAB_FUNCTION;
} }
...@@ -560,7 +546,7 @@ is_a_helper <cgraph_node>::test (symtab_node_def *p) ...@@ -560,7 +546,7 @@ is_a_helper <cgraph_node>::test (symtab_node_def *p)
template <> template <>
template <> template <>
inline bool inline bool
is_a_helper <varpool_node>::test (symtab_node_def *p) is_a_helper <varpool_node>::test (symtab_node_base *p)
{ {
return p->symbol.type == SYMTAB_VARIABLE; return p->symbol.type == SYMTAB_VARIABLE;
} }
......
...@@ -20,9 +20,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -20,9 +20,9 @@ along with GCC; see the file COPYING3. If not see
struct cgraph_node; struct cgraph_node;
struct varpool_node; struct varpool_node;
union symtab_node_def; class symtab_node_base;
typedef union symtab_node_def *symtab_node; typedef symtab_node_base *symtab_node;
typedef const union symtab_node_def *const_symtab_node; typedef const symtab_node_base *const_symtab_node;
/* How the reference is done. */ /* How the reference is done. */
......
...@@ -31,7 +31,7 @@ bool is_a <TYPE> (pointer) ...@@ -31,7 +31,7 @@ bool is_a <TYPE> (pointer)
Tests whether the pointer actually points to a more derived TYPE. Tests whether the pointer actually points to a more derived TYPE.
Suppose you have a symtab_node_def *ptr, AKA symtab_node ptr. You can test Suppose you have a symtab_node_base *ptr, AKA symtab_node ptr. You can test
whether it points to a 'derived' cgraph_node as follows. whether it points to a 'derived' cgraph_node as follows.
if (is_a <cgraph_node> (ptr)) if (is_a <cgraph_node> (ptr))
...@@ -110,7 +110,7 @@ example, ...@@ -110,7 +110,7 @@ example,
template <> template <>
template <> template <>
inline bool inline bool
is_a_helper <cgraph_node>::test (symtab_node_def *p) is_a_helper <cgraph_node>::test (symtab_node_base *p)
{ {
return p->symbol.type == SYMTAB_FUNCTION; return p->symbol.type == SYMTAB_FUNCTION;
} }
...@@ -122,7 +122,7 @@ when needed may result in a crash. For example, ...@@ -122,7 +122,7 @@ when needed may result in a crash. For example,
template <> template <>
template <> template <>
inline bool inline bool
is_a_helper <cgraph_node>::cast (symtab_node_def *p) is_a_helper <cgraph_node>::cast (symtab_node_base *p)
{ {
return &p->x_function; return &p->x_function;
} }
......
...@@ -49,9 +49,9 @@ const char * const ld_plugin_symbol_resolution_names[]= ...@@ -49,9 +49,9 @@ const char * const ld_plugin_symbol_resolution_names[]=
}; };
/* Hash table used to convert declarations into nodes. */ /* Hash table used to convert declarations into nodes. */
static GTY((param_is (union symtab_node_def))) htab_t symtab_hash; static GTY((param_is (symtab_node_base))) htab_t symtab_hash;
/* Hash table used to convert assembler names into nodes. */ /* Hash table used to convert assembler names into nodes. */
static GTY((param_is (union symtab_node_def))) htab_t assembler_name_hash; static GTY((param_is (symtab_node_base))) htab_t assembler_name_hash;
/* Linked list of symbol table nodes. */ /* Linked list of symbol table nodes. */
symtab_node symtab_nodes; symtab_node symtab_nodes;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment