summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/cgraph.c1
-rw-r--r--gcc/cgraph.h37
-rw-r--r--gcc/varpool.c1
4 files changed, 48 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd7a2c7377d..d346e435a24 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2012-04-10 Jan Hubicka <jh@suse.cz>
+
+ * 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.
+
2012-04-10 Ulrich Weigand <ulrich.weigand@linaro.org>
Richard Sandiford <rdsandiford@googlemail.com>
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 6c315072d9f..61a8e235fe3 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -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)
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index dc085e181d0..8740fba7c47 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -27,7 +27,23 @@ along with GCC; see the file COPYING3. If not see
#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;
@@ -689,6 +707,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)
diff --git a/gcc/varpool.c b/gcc/varpool.c
index e064f7bd648..043de4c607b 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -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;