From 20168cf29dbef684cb40d4b196bc3df39d8e34ee Mon Sep 17 00:00:00 2001 From: dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Thu, 22 Dec 2005 15:01:02 +0000 Subject: [PATCH] 2005-12-22 Daniel Berlin <dberlin@dberlin.org> * ipa-reference.c (get_reference_vars_info_from_cgraph): Use function_ann. (get_local_reference_vars_info): Ditto. (get_global_reference_vars_info): Ditto. (analyze_function): Ditto. (clean_function): Ditto. * tree-dfa.c (create_function_ann): New function. * tree-flow-inline.h (var_ann): FUNCTION_DECL's don't have var_ann. (function_ann): New. (get_function_ann): Ditto. * tree-flow.h (tree_ann_type): Add FUNCTION_ANN. (struct var_ann_d): Move reference_vars_info to function annotation. (struct function_ann_d): New. (union tree_ann_d): Add function_ann. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108950 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ipa-reference.c | 12 ++++++------ gcc/tree-dfa.c | 20 ++++++++++++++++++++ gcc/tree-flow-inline.h | 22 ++++++++++++++++++++++ gcc/tree-flow.h | 22 ++++++++++++++++------ 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index 531705226a5e..ec8d3b8e5951 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -111,7 +111,7 @@ tree memory_identifier_string; static inline ipa_reference_vars_info_t get_reference_vars_info_from_cgraph (struct cgraph_node * node) { - return get_var_ann (node->decl)->reference_vars_info; + return get_function_ann (node->decl)->reference_vars_info; } /* Get a bitmap that contains all of the locally referenced static @@ -119,7 +119,7 @@ get_reference_vars_info_from_cgraph (struct cgraph_node * node) static ipa_reference_local_vars_info_t get_local_reference_vars_info (tree fn) { - ipa_reference_vars_info_t info = get_var_ann (fn)->reference_vars_info; + ipa_reference_vars_info_t info = get_function_ann (fn)->reference_vars_info; if (info) return info->local; @@ -134,7 +134,7 @@ get_local_reference_vars_info (tree fn) static ipa_reference_global_vars_info_t get_global_reference_vars_info (tree fn) { - ipa_reference_vars_info_t info = get_var_ann (fn)->reference_vars_info; + ipa_reference_vars_info_t info = get_function_ann (fn)->reference_vars_info; if (info) return info->global; @@ -790,7 +790,7 @@ analyze_function (struct cgraph_node *fn) tree decl = fn->decl; /* Add the info to the tree's annotation. */ - get_var_ann (fn->decl)->reference_vars_info = info; + get_function_ann (fn->decl)->reference_vars_info = info; info->local = l; l->statics_read = BITMAP_ALLOC (&ipa_obstack); @@ -874,8 +874,8 @@ clean_function (struct cgraph_node *fn) } - free (get_var_ann (fn->decl)->reference_vars_info); - get_var_ann (fn->decl)->reference_vars_info = NULL; + free (get_function_ann (fn->decl)->reference_vars_info); + get_function_ann (fn->decl)->reference_vars_info = NULL; } diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index 89cdd6ed849c..5af9753d5c68 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -167,6 +167,26 @@ create_var_ann (tree t) return ann; } +/* Create a new annotation for a FUNCTION_DECL node T. */ + +function_ann_t +create_function_ann (tree t) +{ + function_ann_t ann; + + gcc_assert (t); + gcc_assert (TREE_CODE (t) == FUNCTION_DECL); + gcc_assert (!t->common.ann || t->common.ann->common.type == FUNCTION_ANN); + + ann = ggc_alloc (sizeof (*ann)); + memset ((void *) ann, 0, sizeof (*ann)); + + ann->common.type = FUNCTION_ANN; + + t->common.ann = (tree_ann_t) ann; + + return ann; +} /* Create a new annotation for a statement node T. */ diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h index 057b2496c1a5..94e19720f7be 100644 --- a/gcc/tree-flow-inline.h +++ b/gcc/tree-flow-inline.h @@ -126,6 +126,7 @@ var_ann (tree t) { gcc_assert (t); gcc_assert (DECL_P (t)); + gcc_assert (TREE_CODE (t) != FUNCTION_DECL); gcc_assert (!t->common.ann || t->common.ann->common.type == VAR_ANN); return (var_ann_t) t->common.ann; @@ -140,6 +141,27 @@ get_var_ann (tree var) return (ann) ? ann : create_var_ann (var); } +/* Return the function annotation for T, which must be a FUNCTION_DECL node. + Return NULL if the function annotation doesn't already exist. */ +static inline function_ann_t +function_ann (tree t) +{ + gcc_assert (t); + gcc_assert (TREE_CODE (t) == FUNCTION_DECL); + gcc_assert (!t->common.ann || t->common.ann->common.type == FUNCTION_ANN); + + return (function_ann_t) t->common.ann; +} + +/* Return the function annotation for T, which must be a FUNCTION_DECL node. + Create the function annotation if it doesn't exist. */ +static inline function_ann_t +get_function_ann (tree var) +{ + function_ann_t ann = function_ann (var); + return (ann) ? ann : create_function_ann (var); +} + /* Return the statement annotation for T, which must be a statement node. Return NULL if the statement annotation doesn't exist. */ static inline stmt_ann_t diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index e59e809ea5ea..a507ced434a2 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -98,7 +98,7 @@ struct ptr_info_def GTY(()) /*--------------------------------------------------------------------------- Tree annotations stored in tree_common.ann ---------------------------------------------------------------------------*/ -enum tree_ann_type { TREE_ANN_COMMON, VAR_ANN, STMT_ANN }; +enum tree_ann_type { TREE_ANN_COMMON, VAR_ANN, FUNCTION_ANN, STMT_ANN }; struct tree_ann_common_d GTY(()) { @@ -209,16 +209,21 @@ struct var_ann_d GTY(()) current version of this variable (an SSA_NAME). */ tree current_def; - /* Pointer to the structure that contains the sets of global - variables modified by function calls. This field is only used - for FUNCTION_DECLs. */ - ipa_reference_vars_info_t GTY ((skip)) reference_vars_info; /* If this variable is a structure, this fields holds a list of symbols representing each of the fields of the structure. */ subvar_t subvars; }; +struct function_ann_d GTY(()) +{ + struct tree_ann_common_d common; + + /* Pointer to the structure that contains the sets of global + variables modified by function calls. This field is only used + for FUNCTION_DECLs. */ + ipa_reference_vars_info_t GTY ((skip)) reference_vars_info; +}; typedef struct immediate_use_iterator_d { @@ -287,7 +292,8 @@ struct stmt_ann_d GTY(()) union tree_ann_d GTY((desc ("ann_type ((tree_ann_t)&%h)"))) { struct tree_ann_common_d GTY((tag ("TREE_ANN_COMMON"))) common; - struct var_ann_d GTY((tag ("VAR_ANN"))) decl; + struct var_ann_d GTY((tag ("VAR_ANN"))) vdecl; + struct function_ann_d GTY((tag ("FUNCTION_ANN"))) fdecl; struct stmt_ann_d GTY((tag ("STMT_ANN"))) stmt; }; @@ -295,12 +301,15 @@ extern GTY(()) VEC(tree,gc) *modified_noreturn_calls; typedef union tree_ann_d *tree_ann_t; typedef struct var_ann_d *var_ann_t; +typedef struct function_ann_d *function_ann_t; typedef struct stmt_ann_d *stmt_ann_t; static inline tree_ann_t tree_ann (tree); static inline tree_ann_t get_tree_ann (tree); static inline var_ann_t var_ann (tree); static inline var_ann_t get_var_ann (tree); +static inline function_ann_t function_ann (tree); +static inline function_ann_t get_function_ann (tree); static inline stmt_ann_t stmt_ann (tree); static inline stmt_ann_t get_stmt_ann (tree); static inline enum tree_ann_type ann_type (tree_ann_t); @@ -533,6 +542,7 @@ extern void dump_generic_bb (FILE *, basic_block, int, int); /* In tree-dfa.c */ extern var_ann_t create_var_ann (tree); +extern function_ann_t create_function_ann (tree); extern stmt_ann_t create_stmt_ann (tree); extern tree_ann_t create_tree_ann (tree); extern void dump_dfa_stats (FILE *); -- GitLab