* Makefile.in (options.c options.h): Use stamp file s-options to
[official-gcc.git] / gcc / cgraph.h
blobb845ef7b597389cb077c7c564a790dd6f8d03c16
1 /* Callgraph handling code.
2 Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #ifndef GCC_CGRAPH_H
23 #define GCC_CGRAPH_H
25 /* Information about the function collected locally.
26 Available after function is analyzed. */
28 struct cgraph_local_info GTY(())
30 /* Size of the function before inlining. */
31 int self_insns;
33 /* Set when function function is visible in current compilation unit only
34 and it's address is never taken. */
35 bool local;
36 /* Set once it has been finalized so we consider it to be output. */
37 bool finalized;
39 /* False when there something makes inlining impossible (such as va_arg). */
40 bool inlinable;
41 /* True when function should be inlined independently on it's size. */
42 bool disregard_inline_limits;
43 /* True when the function has been originally extern inline, but it is
44 redefined now. */
45 bool redefined_extern_inline;
48 /* Information about the function that needs to be computed globally
49 once compilation is finished. Available only with -funit-at-time. */
51 struct cgraph_global_info GTY(())
53 /* Estimated size of the function after inlining. */
54 int insns;
56 /* Number of times given function will be cloned during output. */
57 int cloned_times;
59 /* Set when the function will be inlined exactly once. */
60 bool inline_once;
62 /* Set to true for all reachable functions before inlining is decided.
63 Once we inline all calls to the function and the function is local,
64 it is set to false. */
65 bool will_be_output;
67 /* Set iff at least one of the caller edges has inline_call flag set. */
68 bool inlined;
71 /* Information about the function that is propagated by the RTL backend.
72 Available only for functions that has been already assembled. */
74 struct cgraph_rtl_info GTY(())
76 bool const_function;
77 bool pure_function;
78 int preferred_incoming_stack_boundary;
82 /* The cgraph data structure.
83 Each function decl has assigned cgraph_node listing callees and callers. */
85 struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous")))
87 tree decl;
88 struct cgraph_edge *callees;
89 struct cgraph_edge *callers;
90 struct cgraph_node *next;
91 struct cgraph_node *previous;
92 /* For nested functions points to function the node is nested in. */
93 struct cgraph_node *origin;
94 /* Points to first nested function, if any. */
95 struct cgraph_node *nested;
96 /* Pointer to the next function with same origin, if any. */
97 struct cgraph_node *next_nested;
98 /* Pointer to the next function in cgraph_nodes_queue. */
99 struct cgraph_node *next_needed;
100 PTR GTY ((skip (""))) aux;
102 struct cgraph_local_info local;
103 struct cgraph_global_info global;
104 struct cgraph_rtl_info rtl;
105 /* Unique id of the node. */
106 int uid;
107 /* Set when function must be output - it is externally visible
108 or it's address is taken. */
109 bool needed;
110 /* Set when function is reachable by call from other function
111 that is either reachable or needed. */
112 bool reachable;
113 /* Set once the function has been instantiated and its callee
114 lists created. */
115 bool analyzed;
116 /* Set when function is scheduled to be assembled. */
117 bool output;
120 struct cgraph_edge GTY(())
122 struct cgraph_node *caller;
123 struct cgraph_node *callee;
124 struct cgraph_edge *next_caller;
125 struct cgraph_edge *next_callee;
126 /* When NULL, inline this call. When non-NULL, points to the explanation
127 why function was not inlined. */
128 const char *inline_failed;
131 /* The cgraph_varpool data structure.
132 Each static variable decl has assigned cgraph_varpool_node. */
134 struct cgraph_varpool_node GTY(())
136 tree decl;
137 /* Pointer to the next function in cgraph_varpool_nodes_queue. */
138 struct cgraph_varpool_node *next_needed;
140 /* Set when function must be output - it is externally visible
141 or it's address is taken. */
142 bool needed;
143 /* Set once it has been finalized so we consider it to be output. */
144 bool finalized;
145 /* Set when function is scheduled to be assembled. */
146 bool output;
149 extern GTY(()) struct cgraph_node *cgraph_nodes;
150 extern GTY(()) int cgraph_n_nodes;
151 extern GTY(()) int cgraph_max_uid;
152 extern bool cgraph_global_info_ready;
153 extern GTY(()) struct cgraph_node *cgraph_nodes_queue;
154 extern FILE *cgraph_dump_file;
156 extern GTY(()) int cgraph_varpool_n_nodes;
157 extern GTY(()) struct cgraph_varpool_node *cgraph_varpool_nodes_queue;
160 /* In cgraph.c */
161 void dump_cgraph (FILE *);
162 void cgraph_remove_edge (struct cgraph_node *, struct cgraph_node *);
163 void cgraph_remove_call (tree, tree);
164 void cgraph_remove_node (struct cgraph_node *);
165 struct cgraph_edge *cgraph_record_call (tree, tree);
166 struct cgraph_node *cgraph_node (tree decl);
167 struct cgraph_node *cgraph_node_for_identifier (tree id);
168 bool cgraph_calls_p (tree, tree);
169 struct cgraph_local_info *cgraph_local_info (tree);
170 struct cgraph_global_info *cgraph_global_info (tree);
171 struct cgraph_rtl_info *cgraph_rtl_info (tree);
172 const char * cgraph_node_name (struct cgraph_node *);
174 struct cgraph_varpool_node *cgraph_varpool_node (tree decl);
175 struct cgraph_varpool_node *cgraph_varpool_node_for_identifier (tree id);
176 void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node *);
177 void cgraph_varpool_finalize_decl (tree);
178 bool cgraph_varpool_assemble_pending_decls (void);
180 bool cgraph_function_possibly_inlined_p (tree);
182 /* In cgraphunit.c */
183 bool cgraph_assemble_pending_functions (void);
184 void cgraph_finalize_function (tree, bool);
185 void cgraph_finalize_compilation_unit (void);
186 void cgraph_create_edges (tree, tree);
187 void cgraph_optimize (void);
188 void cgraph_mark_needed_node (struct cgraph_node *);
189 void cgraph_mark_reachable_node (struct cgraph_node *);
190 bool cgraph_inline_p (tree, tree, const char **reason);
192 #endif /* GCC_CGRAPH_H */