]> gcc.gnu.org Git - gcc.git/blame - gcc/cgraph.h
builtins.c: Fix comment typo(s).
[gcc.git] / gcc / cgraph.h
CommitLineData
1c4a429a 1/* Callgraph handling code.
ad616de1 2 Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
1c4a429a
JH
3 Contributed by Jan Hubicka
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING. If not, write to the Free
366ccddb
KC
19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2002110-1301, USA. */
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
dafc5b82 49/* Information about the function collected locally.
25c84396 50 Available after function is analyzed. */
dafc5b82 51
ed2df68b 52struct cgraph_local_info GTY(())
dafc5b82 53{
95c755e9
JH
54 /* Size of the function before inlining. */
55 int self_insns;
6674a6ce 56
e0bb17a8 57 /* Set when function function is visible in current compilation unit only
e2209b03 58 and its address is never taken. */
dafc5b82 59 bool local;
6674a6ce 60
e7d6beb0
JH
61 /* Set when function is visible by other units. */
62 bool externally_visible;
63
f6981e16
JH
64 /* Set once it has been finalized so we consider it to be output. */
65 bool finalized;
b58b1157 66
b3c3af2f 67 /* False when there something makes inlining impossible (such as va_arg). */
b58b1157 68 bool inlinable;
6674a6ce 69
e2209b03 70 /* True when function should be inlined independently on its size. */
b3c3af2f 71 bool disregard_inline_limits;
6674a6ce 72
95c755e9
JH
73 /* True when the function has been originally extern inline, but it is
74 redefined now. */
75 bool redefined_extern_inline;
6674a6ce
KZ
76
77 /* True if statics_read_for_function and
78 statics_written_for_function contain valid data. */
79 bool for_functions_valid;
8634c649
JJ
80
81 /* True if the function is going to be emitted in some other translation
82 unit, referenced from vtable. */
83 bool vtable_method;
dafc5b82
JH
84};
85
86/* Information about the function that needs to be computed globally
87 once compilation is finished. Available only with -funit-at-time. */
88
ed2df68b 89struct cgraph_global_info GTY(())
dafc5b82 90{
18c6ada9
JH
91 /* For inline clones this points to the function they will be inlined into. */
92 struct cgraph_node *inlined_to;
93
b58b1157
JH
94 /* Estimated size of the function after inlining. */
95 int insns;
96
670cd5c5
JH
97 /* Estimated growth after inlining. INT_MIN if not computed. */
98 int estimated_growth;
99
18c6ada9 100 /* Set iff the function has been inlined at least once. */
1bb17c21 101 bool inlined;
dafc5b82
JH
102};
103
b255a036
JH
104/* Information about the function that is propagated by the RTL backend.
105 Available only for functions that has been already assembled. */
106
ed2df68b 107struct cgraph_rtl_info GTY(())
b255a036 108{
6de9cd9a 109 int preferred_incoming_stack_boundary;
b255a036
JH
110};
111
ba228239 112/* The cgraph data structure.
e0bb17a8 113 Each function decl has assigned cgraph_node listing callees and callers. */
1c4a429a 114
d1bd0ded 115struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous")))
1c4a429a
JH
116{
117 tree decl;
118 struct cgraph_edge *callees;
119 struct cgraph_edge *callers;
ed2df68b
JH
120 struct cgraph_node *next;
121 struct cgraph_node *previous;
1c4a429a
JH
122 /* For nested functions points to function the node is nested in. */
123 struct cgraph_node *origin;
124 /* Points to first nested function, if any. */
125 struct cgraph_node *nested;
126 /* Pointer to the next function with same origin, if any. */
127 struct cgraph_node *next_nested;
8bd87c4e
JH
128 /* Pointer to the next function in cgraph_nodes_queue. */
129 struct cgraph_node *next_needed;
18c6ada9
JH
130 /* Pointer to the next clone. */
131 struct cgraph_node *next_clone;
1655dc9d 132 struct cgraph_node *prev_clone;
6b02a499
JH
133 /* Pointer to a single unique cgraph node for this function. If the
134 function is to be output, this is the copy that will survive. */
135 struct cgraph_node *master_clone;
136
1431042e 137 PTR GTY ((skip)) aux;
1c4a429a 138
95c755e9
JH
139 struct cgraph_local_info local;
140 struct cgraph_global_info global;
141 struct cgraph_rtl_info rtl;
6674a6ce 142
e42922b1
JH
143 /* Expected number of executions: calculated in profile.c. */
144 gcov_type count;
95c755e9
JH
145 /* Unique id of the node. */
146 int uid;
1c4a429a 147 /* Set when function must be output - it is externally visible
e2209b03 148 or its address is taken. */
1c4a429a
JH
149 bool needed;
150 /* Set when function is reachable by call from other function
e0bb17a8 151 that is either reachable or needed. */
1c4a429a 152 bool reachable;
e21aff8a
SB
153 /* Set once the function is lowered (ie it's CFG is built). */
154 bool lowered;
25c84396
RH
155 /* Set once the function has been instantiated and its callee
156 lists created. */
157 bool analyzed;
1c4a429a
JH
158 /* Set when function is scheduled to be assembled. */
159 bool output;
ce91e74c
JH
160 /* Set when function is visible by other units. */
161 bool externally_visible;
12527dce
RH
162 /* Set for aliases once they got through assemble_alias. */
163 bool alias;
1c4a429a
JH
164};
165
2563c224 166struct cgraph_edge GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller")))
1c4a429a 167{
ed2df68b
JH
168 struct cgraph_node *caller;
169 struct cgraph_node *callee;
2563c224 170 struct cgraph_edge *prev_caller;
1c4a429a 171 struct cgraph_edge *next_caller;
2563c224 172 struct cgraph_edge *prev_callee;
1c4a429a 173 struct cgraph_edge *next_callee;
e0704a46 174 tree call_stmt;
18c6ada9 175 PTR GTY ((skip (""))) aux;
dc0bfe6a
JH
176 /* When NULL, inline this call. When non-NULL, points to the explanation
177 why function was not inlined. */
178 const char *inline_failed;
e42922b1
JH
179 /* Expected number of executions: calculated in profile.c. */
180 gcov_type count;
181 /* Depth of loop nest, 1 means no loop nest. */
182 int loop_nest;
1c4a429a
JH
183};
184
ba228239 185/* The cgraph_varpool data structure.
e69529cd
JH
186 Each static variable decl has assigned cgraph_varpool_node. */
187
ed2df68b 188struct cgraph_varpool_node GTY(())
e69529cd
JH
189{
190 tree decl;
bedb9fc0
RH
191 /* Pointer to the next function in cgraph_varpool_nodes. */
192 struct cgraph_varpool_node *next;
8bd87c4e
JH
193 /* Pointer to the next function in cgraph_varpool_nodes_queue. */
194 struct cgraph_varpool_node *next_needed;
e69529cd
JH
195
196 /* Set when function must be output - it is externally visible
e2209b03 197 or its address is taken. */
e69529cd 198 bool needed;
cd9c7bd2
JH
199 /* Needed variables might become dead by optimization. This flag
200 forces the variable to be output even if it appears dead otherwise. */
201 bool force_output;
202 /* Set once the variable has been instantiated and its callee
203 lists created. */
204 bool analyzed;
e69529cd
JH
205 /* Set once it has been finalized so we consider it to be output. */
206 bool finalized;
6b02a499 207 /* Set when variable is scheduled to be assembled. */
e69529cd 208 bool output;
e7d6beb0
JH
209 /* Set when function is visible by other units. */
210 bool externally_visible;
1a612e0a
JJ
211 /* Set for aliases once they got through assemble_alias. */
212 bool alias;
e69529cd
JH
213};
214
ed2df68b
JH
215extern GTY(()) struct cgraph_node *cgraph_nodes;
216extern GTY(()) int cgraph_n_nodes;
b58b1157 217extern GTY(()) int cgraph_max_uid;
dafc5b82 218extern bool cgraph_global_info_ready;
e7d6beb0 219extern bool cgraph_function_flags_ready;
ed2df68b 220extern GTY(()) struct cgraph_node *cgraph_nodes_queue;
1c4a429a 221
cd9c7bd2 222extern GTY(()) struct cgraph_varpool_node *cgraph_varpool_first_unanalyzed_node;
ed2df68b 223extern GTY(()) struct cgraph_varpool_node *cgraph_varpool_nodes_queue;
e69529cd 224
1c4a429a 225/* In cgraph.c */
439f7bc3 226void dump_cgraph (FILE *);
18c6ada9 227void dump_cgraph_node (FILE *, struct cgraph_node *);
cd9c7bd2
JH
228void dump_varpool (FILE *);
229void dump_cgraph_varpool_node (FILE *, struct cgraph_varpool_node *);
18c6ada9 230void cgraph_remove_edge (struct cgraph_edge *);
439f7bc3 231void cgraph_remove_node (struct cgraph_node *);
2563c224 232void cgraph_node_remove_callees (struct cgraph_node *node);
18c6ada9
JH
233struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
234 struct cgraph_node *,
e42922b1
JH
235 tree, gcov_type, int);
236struct cgraph_node *cgraph_node (tree);
bedb9fc0 237struct cgraph_node *cgraph_node_for_asm (tree asmname);
e42922b1 238struct cgraph_edge *cgraph_edge (struct cgraph_node *, tree);
439f7bc3
AJ
239struct cgraph_local_info *cgraph_local_info (tree);
240struct cgraph_global_info *cgraph_global_info (tree);
241struct cgraph_rtl_info *cgraph_rtl_info (tree);
242const char * cgraph_node_name (struct cgraph_node *);
e42922b1
JH
243struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *, struct cgraph_node *, tree, int, int);
244struct cgraph_node * cgraph_clone_node (struct cgraph_node *, gcov_type, int);
1c4a429a 245
e42922b1 246struct cgraph_varpool_node *cgraph_varpool_node (tree);
bedb9fc0 247struct cgraph_varpool_node *cgraph_varpool_node_for_asm (tree asmname);
e69529cd
JH
248void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node *);
249void cgraph_varpool_finalize_decl (tree);
18c6ada9 250void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *);
e69529cd 251
1bb17c21 252bool cgraph_function_possibly_inlined_p (tree);
e42922b1 253void cgraph_unnest_node (struct cgraph_node *);
cd9c7bd2
JH
254void cgraph_varpool_enqueue_needed_node (struct cgraph_varpool_node *);
255void cgraph_varpool_reset_queue (void);
256bool decide_is_variable_needed (struct cgraph_varpool_node *, tree);
1bb17c21 257
6b02a499
JH
258enum availability cgraph_function_body_availability (struct cgraph_node *);
259enum availability cgraph_variable_initializer_availability (struct cgraph_varpool_node *);
260bool cgraph_is_master_clone (struct cgraph_node *);
261struct cgraph_node *cgraph_master_clone (struct cgraph_node *);
262
1c4a429a 263/* In cgraphunit.c */
f6d1b84a 264bool cgraph_assemble_pending_functions (void);
cd9c7bd2 265bool cgraph_varpool_assemble_pending_decls (void);
6b00c969 266void cgraph_finalize_function (tree, bool);
e21aff8a 267void cgraph_lower_function (struct cgraph_node *);
439f7bc3 268void cgraph_finalize_compilation_unit (void);
439f7bc3 269void cgraph_optimize (void);
8dafba3c
RH
270void cgraph_mark_needed_node (struct cgraph_node *);
271void cgraph_mark_reachable_node (struct cgraph_node *);
18c6ada9
JH
272bool cgraph_inline_p (struct cgraph_edge *, const char **reason);
273bool cgraph_preserve_function_body_p (tree);
274void verify_cgraph (void);
275void verify_cgraph_node (struct cgraph_node *);
276void cgraph_mark_inline_edge (struct cgraph_edge *e);
277void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate);
35b6fdcf 278void cgraph_build_static_cdtor (char which, tree body, int priority);
6674a6ce 279void cgraph_reset_static_var_maps (void);
9b3e897d 280void init_cgraph (void);
1c4a429a 281
ca31b95f
JH
282/* In ipa.c */
283bool cgraph_remove_unreachable_nodes (bool, FILE *);
284int cgraph_postorder (struct cgraph_node **);
285
286/* In ipa-inline.c */
d63db217 287bool cgraph_decide_inlining_incrementally (struct cgraph_node *, bool);
ca31b95f
JH
288void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool);
289void cgraph_mark_inline_edge (struct cgraph_edge *);
290bool cgraph_default_inline_p (struct cgraph_node *);
1c4a429a 291#endif /* GCC_CGRAPH_H */
This page took 0.672958 seconds and 5 git commands to generate.