]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cgraph.h
backport: ChangeLog.tuples: ChangeLog from gimple-tuples-branch.
[thirdparty/gcc.git] / gcc / cgraph.h
CommitLineData
1c4a429a 1/* Callgraph handling code.
2bafad93
JJ
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
1c4a429a
JH
4 Contributed by Jan Hubicka
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
9dcd6f09 10Software Foundation; either version 3, or (at your option) any later
1c4a429a
JH
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
1c4a429a
JH
21
22#ifndef GCC_CGRAPH_H
23#define GCC_CGRAPH_H
6674a6ce 24#include "tree.h"
e42922b1 25#include "basic-block.h"
1c4a429a 26
6b02a499
JH
27enum availability
28{
29 /* Not yet set by cgraph_function_body_availability. */
30 AVAIL_UNSET,
31 /* Function body/variable initializer is unknown. */
32 AVAIL_NOT_AVAILABLE,
33 /* Function body/variable initializer is known but might be replaced
34 by a different one from other compilation unit and thus needs to
35 be dealt with a care. Like AVAIL_NOT_AVAILABLE it can have
36 arbitrary side effects on escaping variables and functions, while
37 like AVAILABLE it might access static variables. */
38 AVAIL_OVERWRITABLE,
39 /* Function body/variable initializer is known and will be used in final
40 program. */
41 AVAIL_AVAILABLE,
42 /* Function body/variable initializer is known and all it's uses are explicitly
43 visible within current unit (ie it's address is never taken and it is not
44 exported to other units).
45 Currently used only for functions. */
46 AVAIL_LOCAL
47};
48
8a4a83ed
JH
49extern const char * const cgraph_availability_names[];
50
dafc5b82 51/* Information about the function collected locally.
25c84396 52 Available after function is analyzed. */
dafc5b82 53
ed2df68b 54struct cgraph_local_info GTY(())
dafc5b82 55{
95622280
JH
56 struct inline_summary {
57 /* Estimated stack frame consumption by the function. */
58 HOST_WIDE_INT estimated_self_stack_size;
ff28a94d 59
95622280
JH
60 /* Size of the function before inlining. */
61 int self_insns;
62 } inline_summary;
6674a6ce 63
e0bb17a8 64 /* Set when function function is visible in current compilation unit only
e2209b03 65 and its address is never taken. */
b4e19405 66 unsigned local : 1;
6674a6ce 67
e7d6beb0 68 /* Set when function is visible by other units. */
b4e19405 69 unsigned externally_visible : 1;
e7d6beb0 70
f6981e16 71 /* Set once it has been finalized so we consider it to be output. */
b4e19405 72 unsigned finalized : 1;
b58b1157 73
b3c3af2f 74 /* False when there something makes inlining impossible (such as va_arg). */
b4e19405 75 unsigned inlinable : 1;
6674a6ce 76
e2209b03 77 /* True when function should be inlined independently on its size. */
b4e19405 78 unsigned disregard_inline_limits : 1;
6674a6ce 79
95c755e9
JH
80 /* True when the function has been originally extern inline, but it is
81 redefined now. */
b4e19405 82 unsigned redefined_extern_inline : 1;
6674a6ce
KZ
83
84 /* True if statics_read_for_function and
85 statics_written_for_function contain valid data. */
b4e19405 86 unsigned for_functions_valid : 1;
8634c649
JJ
87
88 /* True if the function is going to be emitted in some other translation
89 unit, referenced from vtable. */
b4e19405 90 unsigned vtable_method : 1;
dafc5b82
JH
91};
92
93/* Information about the function that needs to be computed globally
726a989a 94 once compilation is finished. Available only with -funit-at-a-time. */
dafc5b82 95
ed2df68b 96struct cgraph_global_info GTY(())
dafc5b82 97{
ff28a94d
JH
98 /* Estimated stack frame consumption by the function. */
99 HOST_WIDE_INT estimated_stack_size;
100 /* Expected offset of the stack frame of inlined function. */
101 HOST_WIDE_INT stack_frame_offset;
102
726a989a
RB
103 /* For inline clones this points to the function they will be
104 inlined into. */
18c6ada9
JH
105 struct cgraph_node *inlined_to;
106
b58b1157
JH
107 /* Estimated size of the function after inlining. */
108 int insns;
109
670cd5c5
JH
110 /* Estimated growth after inlining. INT_MIN if not computed. */
111 int estimated_growth;
112
18c6ada9 113 /* Set iff the function has been inlined at least once. */
1bb17c21 114 bool inlined;
dafc5b82
JH
115};
116
b255a036
JH
117/* Information about the function that is propagated by the RTL backend.
118 Available only for functions that has been already assembled. */
119
ed2df68b 120struct cgraph_rtl_info GTY(())
b255a036 121{
17b29c0a 122 unsigned int preferred_incoming_stack_boundary;
b255a036
JH
123};
124
ba228239 125/* The cgraph data structure.
e0bb17a8 126 Each function decl has assigned cgraph_node listing callees and callers. */
1c4a429a 127
d1bd0ded 128struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous")))
1c4a429a
JH
129{
130 tree decl;
131 struct cgraph_edge *callees;
132 struct cgraph_edge *callers;
ed2df68b
JH
133 struct cgraph_node *next;
134 struct cgraph_node *previous;
1c4a429a
JH
135 /* For nested functions points to function the node is nested in. */
136 struct cgraph_node *origin;
137 /* Points to first nested function, if any. */
138 struct cgraph_node *nested;
139 /* Pointer to the next function with same origin, if any. */
140 struct cgraph_node *next_nested;
8bd87c4e
JH
141 /* Pointer to the next function in cgraph_nodes_queue. */
142 struct cgraph_node *next_needed;
18c6ada9
JH
143 /* Pointer to the next clone. */
144 struct cgraph_node *next_clone;
1655dc9d 145 struct cgraph_node *prev_clone;
6b02a499
JH
146 /* Pointer to a single unique cgraph node for this function. If the
147 function is to be output, this is the copy that will survive. */
148 struct cgraph_node *master_clone;
70d539ce
JH
149 /* For functions with many calls sites it holds map from call expression
150 to the edge to speed up cgraph_edge function. */
151 htab_t GTY((param_is (struct cgraph_edge))) call_site_hash;
c22cacf3 152
1431042e 153 PTR GTY ((skip)) aux;
1c4a429a 154
95c755e9
JH
155 struct cgraph_local_info local;
156 struct cgraph_global_info global;
157 struct cgraph_rtl_info rtl;
c22cacf3 158
e42922b1
JH
159 /* Expected number of executions: calculated in profile.c. */
160 gcov_type count;
95c755e9
JH
161 /* Unique id of the node. */
162 int uid;
474eccc6
ILT
163 /* Ordering of all cgraph nodes. */
164 int order;
b4e19405 165
1c4a429a 166 /* Set when function must be output - it is externally visible
e2209b03 167 or its address is taken. */
b4e19405 168 unsigned needed : 1;
1c4a429a 169 /* Set when function is reachable by call from other function
e0bb17a8 170 that is either reachable or needed. */
b4e19405 171 unsigned reachable : 1;
50674e96 172 /* Set once the function is lowered (i.e. its CFG is built). */
b4e19405 173 unsigned lowered : 1;
25c84396
RH
174 /* Set once the function has been instantiated and its callee
175 lists created. */
b4e19405 176 unsigned analyzed : 1;
1c4a429a 177 /* Set when function is scheduled to be assembled. */
b4e19405 178 unsigned output : 1;
12527dce 179 /* Set for aliases once they got through assemble_alias. */
b4e19405 180 unsigned alias : 1;
ea99e0be
JH
181
182 /* In non-unit-at-a-time mode the function body of inline candidates is saved
183 into clone before compiling so the function in original form can be
184 inlined later. This pointer points to the clone. */
185 tree inline_decl;
6bad2617
TB
186
187 /* unique id for profiling. pid is not suitable because of different
188 number of cfg nodes with -fprofile-generate and -fprofile-use */
189 int pid;
1c4a429a
JH
190};
191
2563c224 192struct cgraph_edge GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller")))
1c4a429a 193{
ed2df68b
JH
194 struct cgraph_node *caller;
195 struct cgraph_node *callee;
2563c224 196 struct cgraph_edge *prev_caller;
1c4a429a 197 struct cgraph_edge *next_caller;
2563c224 198 struct cgraph_edge *prev_callee;
1c4a429a 199 struct cgraph_edge *next_callee;
726a989a 200 gimple call_stmt;
18c6ada9 201 PTR GTY ((skip (""))) aux;
dc0bfe6a
JH
202 /* When NULL, inline this call. When non-NULL, points to the explanation
203 why function was not inlined. */
204 const char *inline_failed;
e42922b1
JH
205 /* Expected number of executions: calculated in profile.c. */
206 gcov_type count;
45a80bb9
JH
207 /* Expected frequency of executions within the function.
208 When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
209 per function call. The range is 0 to CGRAPH_FREQ_MAX. */
210 int frequency;
e42922b1 211 /* Depth of loop nest, 1 means no loop nest. */
3e293154
MJ
212 unsigned int loop_nest : 31;
213 /* Whether this edge describes a call that was originally indirect. */
214 unsigned int indirect_call : 1;
9088c1cc
MJ
215 /* Unique id of the edge. */
216 int uid;
1c4a429a
JH
217};
218
45a80bb9
JH
219#define CGRAPH_FREQ_BASE 1000
220#define CGRAPH_FREQ_MAX 100000
221
b2c0ad40
KH
222typedef struct cgraph_edge *cgraph_edge_p;
223
224DEF_VEC_P(cgraph_edge_p);
225DEF_VEC_ALLOC_P(cgraph_edge_p,heap);
226
8a4a83ed
JH
227/* The varpool data structure.
228 Each static variable decl has assigned varpool_node. */
e69529cd 229
266ad5c8 230struct varpool_node GTY((chain_next ("%h.next")))
e69529cd
JH
231{
232 tree decl;
8a4a83ed
JH
233 /* Pointer to the next function in varpool_nodes. */
234 struct varpool_node *next;
235 /* Pointer to the next function in varpool_nodes_queue. */
236 struct varpool_node *next_needed;
474eccc6
ILT
237 /* Ordering of all cgraph nodes. */
238 int order;
e69529cd
JH
239
240 /* Set when function must be output - it is externally visible
e2209b03 241 or its address is taken. */
b4e19405 242 unsigned needed : 1;
cd9c7bd2
JH
243 /* Needed variables might become dead by optimization. This flag
244 forces the variable to be output even if it appears dead otherwise. */
b4e19405 245 unsigned force_output : 1;
cd9c7bd2
JH
246 /* Set once the variable has been instantiated and its callee
247 lists created. */
b4e19405 248 unsigned analyzed : 1;
e69529cd 249 /* Set once it has been finalized so we consider it to be output. */
b4e19405 250 unsigned finalized : 1;
6b02a499 251 /* Set when variable is scheduled to be assembled. */
b4e19405 252 unsigned output : 1;
e7d6beb0 253 /* Set when function is visible by other units. */
b4e19405 254 unsigned externally_visible : 1;
1a612e0a 255 /* Set for aliases once they got through assemble_alias. */
b4e19405 256 unsigned alias : 1;
e69529cd
JH
257};
258
474eccc6
ILT
259/* Every top level asm statement is put into a cgraph_asm_node. */
260
261struct cgraph_asm_node GTY(())
262{
263 /* Next asm node. */
264 struct cgraph_asm_node *next;
265 /* String for this asm node. */
266 tree asm_str;
267 /* Ordering of all cgraph nodes. */
268 int order;
269};
270
ed2df68b
JH
271extern GTY(()) struct cgraph_node *cgraph_nodes;
272extern GTY(()) int cgraph_n_nodes;
b58b1157 273extern GTY(()) int cgraph_max_uid;
9088c1cc 274extern GTY(()) int cgraph_edge_max_uid;
6bad2617 275extern GTY(()) int cgraph_max_pid;
dafc5b82 276extern bool cgraph_global_info_ready;
f45e0ad1
JH
277enum cgraph_state
278{
279 /* Callgraph is being constructed. It is safe to add new functions. */
280 CGRAPH_STATE_CONSTRUCTION,
281 /* Callgraph is built and IPA passes are being run. */
282 CGRAPH_STATE_IPA,
7a388ee4
JH
283 /* Callgraph is built and all functions are transformed to SSA form. */
284 CGRAPH_STATE_IPA_SSA,
f45e0ad1
JH
285 /* Functions are now ordered and being passed to RTL expanders. */
286 CGRAPH_STATE_EXPANSION,
287 /* All cgraph expansion is done. */
288 CGRAPH_STATE_FINISHED
289};
290extern enum cgraph_state cgraph_state;
e7d6beb0 291extern bool cgraph_function_flags_ready;
ed2df68b 292extern GTY(()) struct cgraph_node *cgraph_nodes_queue;
f45e0ad1 293extern GTY(()) struct cgraph_node *cgraph_new_nodes;
1c4a429a 294
474eccc6
ILT
295extern GTY(()) struct cgraph_asm_node *cgraph_asm_nodes;
296extern GTY(()) int cgraph_order;
e69529cd 297
1c4a429a 298/* In cgraph.c */
439f7bc3 299void dump_cgraph (FILE *);
c4e622b6 300void debug_cgraph (void);
18c6ada9 301void dump_cgraph_node (FILE *, struct cgraph_node *);
c4e622b6 302void debug_cgraph_node (struct cgraph_node *);
ea99e0be 303void cgraph_insert_node_to_hashtable (struct cgraph_node *node);
18c6ada9 304void cgraph_remove_edge (struct cgraph_edge *);
439f7bc3 305void cgraph_remove_node (struct cgraph_node *);
3a40c18a 306void cgraph_release_function_body (struct cgraph_node *);
2563c224 307void cgraph_node_remove_callees (struct cgraph_node *node);
18c6ada9
JH
308struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
309 struct cgraph_node *,
726a989a 310 gimple, gcov_type, int, int);
e42922b1 311struct cgraph_node *cgraph_node (tree);
bedb9fc0 312struct cgraph_node *cgraph_node_for_asm (tree asmname);
726a989a
RB
313struct cgraph_edge *cgraph_edge (struct cgraph_node *, gimple);
314void cgraph_set_call_stmt (struct cgraph_edge *, gimple);
315void cgraph_update_edges_for_call_stmt (gimple, gimple);
439f7bc3
AJ
316struct cgraph_local_info *cgraph_local_info (tree);
317struct cgraph_global_info *cgraph_global_info (tree);
318struct cgraph_rtl_info *cgraph_rtl_info (tree);
319const char * cgraph_node_name (struct cgraph_node *);
c5a4444c 320struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *,
c22cacf3 321 struct cgraph_node *,
726a989a 322 gimple, gcov_type, int, int, bool);
45a80bb9 323struct cgraph_node * cgraph_clone_node (struct cgraph_node *, gcov_type, int,
c5a4444c 324 int, bool);
1c4a429a 325
18c6ada9 326void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *);
e69529cd 327
474eccc6
ILT
328struct cgraph_asm_node *cgraph_add_asm_node (tree);
329
1bb17c21 330bool cgraph_function_possibly_inlined_p (tree);
e42922b1 331void cgraph_unnest_node (struct cgraph_node *);
1bb17c21 332
6b02a499 333enum availability cgraph_function_body_availability (struct cgraph_node *);
6b02a499
JH
334bool cgraph_is_master_clone (struct cgraph_node *);
335struct cgraph_node *cgraph_master_clone (struct cgraph_node *);
f45e0ad1 336void cgraph_add_new_function (tree, bool);
6b02a499 337
1c4a429a 338/* In cgraphunit.c */
6b00c969 339void cgraph_finalize_function (tree, bool);
f0c882ab 340void cgraph_mark_if_needed (tree);
439f7bc3 341void cgraph_finalize_compilation_unit (void);
439f7bc3 342void cgraph_optimize (void);
8dafba3c
RH
343void cgraph_mark_needed_node (struct cgraph_node *);
344void cgraph_mark_reachable_node (struct cgraph_node *);
18c6ada9
JH
345bool cgraph_inline_p (struct cgraph_edge *, const char **reason);
346bool cgraph_preserve_function_body_p (tree);
347void verify_cgraph (void);
348void verify_cgraph_node (struct cgraph_node *);
35b6fdcf 349void cgraph_build_static_cdtor (char which, tree body, int priority);
6674a6ce 350void cgraph_reset_static_var_maps (void);
9b3e897d 351void init_cgraph (void);
57fb5341 352struct cgraph_node *cgraph_function_versioning (struct cgraph_node *,
c22cacf3 353 VEC(cgraph_edge_p,heap)*,
b2c0ad40 354 varray_type);
953ff289 355void cgraph_analyze_function (struct cgraph_node *);
ea99e0be 356struct cgraph_node *save_inline_function_body (struct cgraph_node *);
8a4a83ed 357void record_references_in_initializer (tree);
f45e0ad1 358bool cgraph_process_new_functions (void);
1c4a429a 359
9088c1cc
MJ
360typedef void (*cgraph_edge_hook)(struct cgraph_edge *, void *);
361typedef void (*cgraph_node_hook)(struct cgraph_node *, void *);
362typedef void (*cgraph_2edge_hook)(struct cgraph_edge *, struct cgraph_edge *,
363 void *);
364typedef void (*cgraph_2node_hook)(struct cgraph_node *, struct cgraph_node *,
365 void *);
366struct cgraph_edge_hook_list;
367struct cgraph_node_hook_list;
368struct cgraph_2edge_hook_list;
369struct cgraph_2node_hook_list;
370struct cgraph_edge_hook_list *cgraph_add_edge_removal_hook (cgraph_edge_hook, void *);
371void cgraph_remove_edge_removal_hook (struct cgraph_edge_hook_list *);
372struct cgraph_node_hook_list *cgraph_add_node_removal_hook (cgraph_node_hook,
373 void *);
374void cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *);
375struct cgraph_2edge_hook_list *cgraph_add_edge_duplication_hook (cgraph_2edge_hook, void *);
376void cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *);
377struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook (cgraph_2node_hook, void *);
378void cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *);
379
917948d3
ZD
380/* In cgraphbuild.c */
381unsigned int rebuild_cgraph_edges (void);
3e293154 382int compute_call_stmt_bb_frequency (basic_block bb);
917948d3 383
ca31b95f
JH
384/* In ipa.c */
385bool cgraph_remove_unreachable_nodes (bool, FILE *);
386int cgraph_postorder (struct cgraph_node **);
387
8a4a83ed
JH
388/* In varpool.c */
389
390extern GTY(()) struct varpool_node *varpool_nodes_queue;
391extern GTY(()) struct varpool_node *varpool_nodes;
392
393struct varpool_node *varpool_node (tree);
394struct varpool_node *varpool_node_for_asm (tree asmname);
395void varpool_mark_needed_node (struct varpool_node *);
396void dump_varpool (FILE *);
397void dump_varpool_node (FILE *, struct varpool_node *);
398
399void varpool_finalize_decl (tree);
400bool decide_is_variable_needed (struct varpool_node *, tree);
401enum availability cgraph_variable_initializer_availability (struct varpool_node *);
402
403bool varpool_assemble_pending_decls (void);
404bool varpool_assemble_decl (struct varpool_node *node);
405bool varpool_analyze_pending_decls (void);
406void varpool_output_debug_info (void);
407void varpool_remove_unreferenced_decls (void);
7386e3ee 408void varpool_empty_needed_queue (void);
8a4a83ed 409
68e56cc4
JH
410/* Walk all reachable static variables. */
411#define FOR_EACH_STATIC_VARIABLE(node) \
412 for ((node) = varpool_nodes_queue; (node); (node) = (node)->next_needed)
413
414/* Return first reachable static variable with initializer. */
415static inline struct varpool_node *
416varpool_first_static_initializer (void)
417{
418 struct varpool_node *node;
419 for (node = varpool_nodes_queue; node; node = node->next_needed)
420 {
421 gcc_assert (TREE_CODE (node->decl) == VAR_DECL);
422 if (DECL_INITIAL (node->decl))
423 return node;
424 }
425 return NULL;
426}
427
428/* Return next reachable static variable with initializer after NODE. */
429static inline struct varpool_node *
430varpool_next_static_initializer (struct varpool_node *node)
431{
432 for (node = node->next_needed; node; node = node->next_needed)
433 {
434 gcc_assert (TREE_CODE (node->decl) == VAR_DECL);
435 if (DECL_INITIAL (node->decl))
436 return node;
437 }
438 return NULL;
439}
440
441/* Walk all static variables with initializer set. */
442#define FOR_EACH_STATIC_INITIALIZER(node) \
443 for ((node) = varpool_first_static_initializer (); (node); \
444 (node) = varpool_next_static_initializer (node))
445
ca31b95f 446/* In ipa-inline.c */
06191a23
JH
447void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool, bool);
448void cgraph_mark_inline_edge (struct cgraph_edge *, bool);
9de21a23 449bool cgraph_default_inline_p (struct cgraph_node *, const char **);
1920df6c 450unsigned int compute_inline_parameters (struct cgraph_node *);
43d861a5
RL
451
452
453/* Create a new static variable of type TYPE. */
454tree add_new_static_var (tree type);
455
1c4a429a 456#endif /* GCC_CGRAPH_H */