1 /* Callgraph handling code.
2 Copyright (C) 2003 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
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
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
25 /* Information about the function collected locally.
26 Available after function is analyzed. */
28 struct cgraph_local_info
GTY(())
30 /* Set when function function is visible in current compilation unit only
31 and it's address is never taken. */
33 /* Set once it has been finalized so we consider it to be output. */
36 /* False when there something makes inlining impossible (such as va_arg). */
38 /* True when function should be inlined independently on it's size. */
39 bool disregard_inline_limits
;
40 /* Size of the function before inlining. */
44 /* Information about the function that needs to be computed globally
45 once compilation is finished. Available only with -funit-at-time. */
47 struct cgraph_global_info
GTY(())
49 /* Set when the function will be inlined exactly once. */
52 /* Estimated size of the function after inlining. */
55 /* Number of times given function will be cloned during output. */
58 /* Set to true for all reachable functions before inlining is decided.
59 Once we inline all calls to the function and the function is local,
60 it is set to false. */
63 /* Set iff at least one of the caller edges has inline_call flag set. */
67 /* Information about the function that is propagated by the RTL backend.
68 Available only for functions that has been already assembled. */
70 struct cgraph_rtl_info
GTY(())
74 int preferred_incoming_stack_boundary
;
78 /* The cgraph data strutcture.
79 Each function decl has assigned cgraph_node listing callees and callers. */
81 struct cgraph_node
GTY((chain_next ("%h.next"), chain_prev ("%h.previous")))
84 struct cgraph_edge
*callees
;
85 struct cgraph_edge
*callers
;
86 struct cgraph_node
*next
;
87 struct cgraph_node
*previous
;
88 /* For nested functions points to function the node is nested in. */
89 struct cgraph_node
*origin
;
90 /* Points to first nested function, if any. */
91 struct cgraph_node
*nested
;
92 /* Pointer to the next function with same origin, if any. */
93 struct cgraph_node
*next_nested
;
94 /* Pointer to the next function in cgraph_nodes_queue. */
95 struct cgraph_node
*next_needed
;
96 /* Unique id of the node. */
98 PTR
GTY ((skip (""))) aux
;
100 /* Set when function must be output - it is externally visible
101 or it's address is taken. */
103 /* Set when function is reachable by call from other function
104 that is either reachable or needed. */
106 /* Set once the function has been instantiated and its callee
109 /* Set when function is scheduled to be assembled. */
111 struct cgraph_local_info local
;
112 struct cgraph_global_info global
;
113 struct cgraph_rtl_info rtl
;
116 struct cgraph_edge
GTY(())
118 struct cgraph_node
*caller
;
119 struct cgraph_node
*callee
;
120 struct cgraph_edge
*next_caller
;
121 struct cgraph_edge
*next_callee
;
125 /* The cgraph_varpool data strutcture.
126 Each static variable decl has assigned cgraph_varpool_node. */
128 struct cgraph_varpool_node
GTY(())
131 /* Pointer to the next function in cgraph_varpool_nodes_queue. */
132 struct cgraph_varpool_node
*next_needed
;
134 /* Set when function must be output - it is externally visible
135 or it's address is taken. */
137 /* Set once it has been finalized so we consider it to be output. */
139 /* Set when function is scheduled to be assembled. */
143 extern GTY(()) struct cgraph_node
*cgraph_nodes
;
144 extern GTY(()) int cgraph_n_nodes
;
145 extern GTY(()) int cgraph_max_uid
;
146 extern bool cgraph_global_info_ready
;
147 extern GTY(()) struct cgraph_node
*cgraph_nodes_queue
;
148 extern FILE *cgraph_dump_file
;
150 extern GTY(()) int cgraph_varpool_n_nodes
;
151 extern GTY(()) struct cgraph_varpool_node
*cgraph_varpool_nodes_queue
;
155 void dump_cgraph (FILE *);
156 void cgraph_remove_edge (struct cgraph_node
*, struct cgraph_node
*);
157 void cgraph_remove_call (tree
, tree
);
158 void cgraph_remove_node (struct cgraph_node
*);
159 struct cgraph_edge
*cgraph_record_call (tree
, tree
);
160 struct cgraph_node
*cgraph_node (tree decl
);
161 struct cgraph_node
*cgraph_node_for_identifier (tree id
);
162 bool cgraph_calls_p (tree
, tree
);
163 struct cgraph_local_info
*cgraph_local_info (tree
);
164 struct cgraph_global_info
*cgraph_global_info (tree
);
165 struct cgraph_rtl_info
*cgraph_rtl_info (tree
);
166 const char * cgraph_node_name (struct cgraph_node
*);
168 struct cgraph_varpool_node
*cgraph_varpool_node (tree decl
);
169 struct cgraph_varpool_node
*cgraph_varpool_node_for_identifier (tree id
);
170 void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node
*);
171 void cgraph_varpool_finalize_decl (tree
);
172 bool cgraph_varpool_assemble_pending_decls (void);
174 bool cgraph_function_possibly_inlined_p (tree
);
176 /* In cgraphunit.c */
177 bool cgraph_assemble_pending_functions (void);
178 void cgraph_finalize_function (tree
, bool);
179 void cgraph_finalize_compilation_unit (void);
180 void cgraph_create_edges (tree
, tree
);
181 void cgraph_optimize (void);
182 void cgraph_mark_needed_node (struct cgraph_node
*);
183 void cgraph_mark_reachable_node (struct cgraph_node
*);
184 bool cgraph_inline_p (tree
, tree
);
186 #endif /* GCC_CGRAPH_H */