diff options
author | zadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-13 22:51:01 +0000 |
---|---|---|
committer | zadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-13 22:51:01 +0000 |
commit | acc70efa1df443f9b6ad2c686787a379f3829a4e (patch) | |
tree | 69297f66b1458959fbc86188df989df620a72c6f /gcc/cgraph.h | |
parent | 84860738349c884bfa028c398576d9081bebe0b9 (diff) | |
download | gcc-acc70efa1df443f9b6ad2c686787a379f3829a4e.tar.gz |
New code to analyze file level static variables and to determine if
they escape and also code to use this information to prune clobber
lists.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87455 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraph.h')
-rw-r--r-- | gcc/cgraph.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/gcc/cgraph.h b/gcc/cgraph.h index a6e9cd75880..0af4447df35 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -22,6 +22,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifndef GCC_CGRAPH_H #define GCC_CGRAPH_H #include "hashtab.h" +#include "bitmap.h" +#include "tree.h" /* Information about the function collected locally. Available after function is analyzed. */ @@ -30,19 +32,37 @@ struct cgraph_local_info GTY(()) { /* Size of the function before inlining. */ int self_insns; + /* Set when function function is visible in current compilation unit only and it's address is never taken. */ bool local; + + /* Set when function is defined in another compilation unit. */ + bool external; + + /* Set when this function calls a function external of the + compilation unit. In general, such calls are modeled as reading + and writing all variables (both bits on) but sometime there are + attributes on the called function so we can do better. */ + bool calls_read_all; + bool calls_write_all; + /* Set once it has been finalized so we consider it to be output. */ bool finalized; /* False when there something makes inlining impossible (such as va_arg). */ bool inlinable; + /* True when function should be inlined independently on it's size. */ bool disregard_inline_limits; + /* True when the function has been originally extern inline, but it is redefined now. */ bool redefined_extern_inline; + + /* True if statics_read_for_function and + statics_written_for_function contain valid data. */ + bool for_functions_valid; }; /* Information about the function that needs to be computed globally @@ -70,6 +90,69 @@ struct cgraph_rtl_info GTY(()) bool pure_function; }; +/* FIXME -- PROFILE-RESTRUCTURE: When the next round of the profiling + code gets merged in, it will contain a restructing where ssa form + is built for every function within the compilation unit before the + rest of the compilation continues. When this reorgination is done, + it will no longer be necessary to have the _decl_uid versions of + local_static_vars_info and global_static_vars_info structures. + Having both structures is now requirred because the _ann_uid values + for static variables are reset as each function is compiled. + Currently, the analysis is done using the _decl_uid versions and + converted to the _var_ann versions on demand. + + Also, the var_anns_valid fields within these structures can also go + away. +*/ + +/* The static variables defined within the compilation unit that are + loaded or stored directly by function that owns this structure. */ + +struct local_static_vars_info_d GTY(()) +{ + bitmap statics_read_by_decl_uid; + bitmap statics_written_by_decl_uid; +}; + +struct global_static_vars_info_d GTY(()) +{ + bitmap statics_read_by_decl_uid; + bitmap statics_written_by_decl_uid; + bitmap statics_read_by_ann_uid; + bitmap statics_written_by_ann_uid; + bitmap statics_not_read_by_decl_uid; + bitmap statics_not_written_by_decl_uid; + bitmap statics_not_read_by_ann_uid; + bitmap statics_not_written_by_ann_uid; + + /* var_anns_valid is reset at the start of compilation for each + function because the indexing that the "_var_anns" is based + on is invalidated between function compilations. This allows for + lazy creation of the "_var_ann" variables. */ + bool var_anns_valid; +}; + +/* Statics that are read and written by some set of functions. The + local ones are based on the loads and stores local to the function. + The global ones are based on the local info as well as the + transitive closure of the functions that are called. The + structures are separated to allow the global structures to be + shared between several functions since every function within a + strongly connected component will have the same information. This + sharing saves both time and space in the computation of the vectors + as well as their translation from decl_uid form to ann_uid + form. */ + +typedef struct local_static_vars_info_d *local_static_vars_info_t; +typedef struct global_static_vars_info_d *global_static_vars_info_t; + +struct static_vars_info_d GTY(()) +{ + local_static_vars_info_t local; + global_static_vars_info_t global; +}; + +typedef struct static_vars_info_d *static_vars_info_t; /* The cgraph data structure. Each function decl has assigned cgraph_node listing callees and callers. */ @@ -91,11 +174,18 @@ struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous"))) struct cgraph_node *next_needed; /* Pointer to the next clone. */ struct cgraph_node *next_clone; + /* Pointer to next node in a recursive call graph cycle; */ + struct cgraph_node *next_cycle; PTR GTY ((skip)) aux; struct cgraph_local_info local; struct cgraph_global_info global; struct cgraph_rtl_info rtl; + + /* Pointer to the structure that contains the sets of global + variables modified by function calls. */ + static_vars_info_t static_vars_info; + /* Unique id of the node. */ int uid; /* Set when function must be output - it is externally visible @@ -192,6 +282,9 @@ void verify_cgraph_node (struct cgraph_node *); void cgraph_mark_inline_edge (struct cgraph_edge *e); void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate); void cgraph_build_static_cdtor (char which, tree body, int priority); +void cgraph_reset_static_var_maps (void); +bitmap get_global_statics_not_read (tree fn); +bitmap get_global_statics_not_written(tree fn); void init_cgraph (void); #endif /* GCC_CGRAPH_H */ |