]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/cgraph.h
Factor unrelated declarations out of tree.h.
[thirdparty/gcc.git] / gcc / cgraph.h
1 /* Callgraph handling code.
2 Copyright (C) 2003-2013 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
4
5 This file is part of GCC.
6
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 3, or (at your option) any later
10 version.
11
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.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #ifndef GCC_CGRAPH_H
22 #define GCC_CGRAPH_H
23
24 #include "is-a.h"
25 #include "plugin-api.h"
26 #include "vec.h"
27 #include "basic-block.h"
28 #include "function.h"
29 #include "ipa-ref.h"
30
31 /* Symbol table consists of functions and variables.
32 TODO: add labels and CONST_DECLs. */
33 enum symtab_type
34 {
35 SYMTAB_SYMBOL,
36 SYMTAB_FUNCTION,
37 SYMTAB_VARIABLE
38 };
39
40 /* Base of all entries in the symbol table.
41 The symtab_node is inherited by cgraph and varpol nodes. */
42 class GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"),
43 chain_next ("%h.next"), chain_prev ("%h.previous")))
44 symtab_node
45 {
46 public:
47 /* Return name. */
48 const char *name () const;
49
50 /* Return asm name. */
51 const char * asm_name () const;
52
53 /* Type of the symbol. */
54 ENUM_BITFIELD (symtab_type) type : 8;
55
56 /* The symbols resolution. */
57 ENUM_BITFIELD (ld_plugin_symbol_resolution) resolution : 8;
58
59 /*** Flags representing the symbol type. ***/
60
61 /* True when symbol corresponds to a definition in current unit.
62 set via cgraph_finalize_function or varpool_finalize_decl */
63 unsigned definition : 1;
64 /* True when symbol is an alias.
65 Set by assemble_alias. */
66 unsigned alias : 1;
67 /* True when alias is a weakref. */
68 unsigned weakref : 1;
69 /* C++ frontend produce same body aliases and extra name aliases for
70 virtual functions and vtables that are obviously equivalent.
71 Those aliases are bit special, especially because C++ frontend
72 visibility code is so ugly it can not get them right at first time
73 and their visibility needs to be copied from their "masters" at
74 the end of parsing. */
75 unsigned cpp_implicit_alias : 1;
76 /* Set once the definition was analyzed. The list of references and
77 other properties are built during analysis. */
78 unsigned analyzed : 1;
79
80
81 /*** Visibility and linkage flags. ***/
82
83 /* Set when function is visible by other units. */
84 unsigned externally_visible : 1;
85 /* The symbol will be assumed to be used in an invisiable way (like
86 by an toplevel asm statement). */
87 unsigned force_output : 1;
88 /* Like FORCE_OUTPUT, but in the case it is ABI requiring the symbol to be
89 exported. Unlike FORCE_OUTPUT this flag gets cleared to symbols promoted
90 to static and it does not inhibit optimization. */
91 unsigned forced_by_abi : 1;
92 /* True when the name is known to be unique and thus it does not need mangling. */
93 unsigned unique_name : 1;
94
95
96 /*** WHOPR Partitioning flags.
97 These flags are used at ltrans stage when only part of the callgraph is
98 available. ***/
99
100 /* Set when variable is used from other LTRANS partition. */
101 unsigned used_from_other_partition : 1;
102 /* Set when function is available in the other LTRANS partition.
103 During WPA output it is used to mark nodes that are present in
104 multiple partitions. */
105 unsigned in_other_partition : 1;
106
107
108
109 /*** other flags. ***/
110
111 /* Set when symbol has address taken. */
112 unsigned address_taken : 1;
113
114
115 /* Ordering of all symtab entries. */
116 int order;
117
118 /* Declaration representing the symbol. */
119 tree decl;
120
121 /* Linked list of symbol table entries starting with symtab_nodes. */
122 symtab_node *next;
123 symtab_node *previous;
124
125 /* Linked list of symbols with the same asm name. There may be multiple
126 entries for single symbol name during LTO, because symbols are renamed
127 only after partitioning.
128
129 Because inline clones are kept in the assembler name has, they also produce
130 duplicate entries.
131
132 There are also several long standing bugs where frontends and builtin
133 code produce duplicated decls. */
134 symtab_node *next_sharing_asm_name;
135 symtab_node *previous_sharing_asm_name;
136
137 /* Circular list of nodes in the same comdat group if non-NULL. */
138 symtab_node *same_comdat_group;
139
140 /* Vectors of referring and referenced entities. */
141 struct ipa_ref_list ref_list;
142
143 /* Alias target. May be either DECL pointer or ASSEMBLER_NAME pointer
144 depending to what was known to frontend on the creation time.
145 Once alias is resolved, this pointer become NULL. */
146 tree alias_target;
147
148 /* File stream where this node is being written to. */
149 struct lto_file_decl_data * lto_file_data;
150
151 PTR GTY ((skip)) aux;
152 };
153
154 enum availability
155 {
156 /* Not yet set by cgraph_function_body_availability. */
157 AVAIL_UNSET,
158 /* Function body/variable initializer is unknown. */
159 AVAIL_NOT_AVAILABLE,
160 /* Function body/variable initializer is known but might be replaced
161 by a different one from other compilation unit and thus needs to
162 be dealt with a care. Like AVAIL_NOT_AVAILABLE it can have
163 arbitrary side effects on escaping variables and functions, while
164 like AVAILABLE it might access static variables. */
165 AVAIL_OVERWRITABLE,
166 /* Function body/variable initializer is known and will be used in final
167 program. */
168 AVAIL_AVAILABLE,
169 /* Function body/variable initializer is known and all it's uses are explicitly
170 visible within current unit (ie it's address is never taken and it is not
171 exported to other units).
172 Currently used only for functions. */
173 AVAIL_LOCAL
174 };
175
176 /* This is the information that is put into the cgraph local structure
177 to recover a function. */
178 struct lto_file_decl_data;
179
180 extern const char * const cgraph_availability_names[];
181 extern const char * const ld_plugin_symbol_resolution_names[];
182
183 /* Information about thunk, used only for same body aliases. */
184
185 struct GTY(()) cgraph_thunk_info {
186 /* Information about the thunk. */
187 HOST_WIDE_INT fixed_offset;
188 HOST_WIDE_INT virtual_value;
189 tree alias;
190 bool this_adjusting;
191 bool virtual_offset_p;
192 /* Set to true when alias node is thunk. */
193 bool thunk_p;
194 };
195
196 /* Information about the function collected locally.
197 Available after function is analyzed. */
198
199 struct GTY(()) cgraph_local_info {
200 /* Set when function function is visible in current compilation unit only
201 and its address is never taken. */
202 unsigned local : 1;
203
204 /* False when there is something makes versioning impossible. */
205 unsigned versionable : 1;
206
207 /* False when function calling convention and signature can not be changed.
208 This is the case when __builtin_apply_args is used. */
209 unsigned can_change_signature : 1;
210
211 /* True when the function has been originally extern inline, but it is
212 redefined now. */
213 unsigned redefined_extern_inline : 1;
214
215 /* True if the function may enter serial irrevocable mode. */
216 unsigned tm_may_enter_irr : 1;
217 };
218
219 /* Information about the function that needs to be computed globally
220 once compilation is finished. Available only with -funit-at-a-time. */
221
222 struct GTY(()) cgraph_global_info {
223 /* For inline clones this points to the function they will be
224 inlined into. */
225 struct cgraph_node *inlined_to;
226 };
227
228 /* Information about the function that is propagated by the RTL backend.
229 Available only for functions that has been already assembled. */
230
231 struct GTY(()) cgraph_rtl_info {
232 unsigned int preferred_incoming_stack_boundary;
233 };
234
235 /* Represent which DECL tree (or reference to such tree)
236 will be replaced by another tree while versioning. */
237 struct GTY(()) ipa_replace_map
238 {
239 /* The tree that will be replaced. */
240 tree old_tree;
241 /* The new (replacing) tree. */
242 tree new_tree;
243 /* Parameter number to replace, when old_tree is NULL. */
244 int parm_num;
245 /* True when a substitution should be done, false otherwise. */
246 bool replace_p;
247 /* True when we replace a reference to old_tree. */
248 bool ref_p;
249 };
250 typedef struct ipa_replace_map *ipa_replace_map_p;
251
252 struct GTY(()) cgraph_clone_info
253 {
254 vec<ipa_replace_map_p, va_gc> *tree_map;
255 bitmap args_to_skip;
256 bitmap combined_args_to_skip;
257 };
258
259
260 /* The cgraph data structure.
261 Each function decl has assigned cgraph_node listing callees and callers. */
262
263 struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node {
264 public:
265 struct cgraph_edge *callees;
266 struct cgraph_edge *callers;
267 /* List of edges representing indirect calls with a yet undetermined
268 callee. */
269 struct cgraph_edge *indirect_calls;
270 /* For nested functions points to function the node is nested in. */
271 struct cgraph_node *origin;
272 /* Points to first nested function, if any. */
273 struct cgraph_node *nested;
274 /* Pointer to the next function with same origin, if any. */
275 struct cgraph_node *next_nested;
276 /* Pointer to the next clone. */
277 struct cgraph_node *next_sibling_clone;
278 struct cgraph_node *prev_sibling_clone;
279 struct cgraph_node *clones;
280 struct cgraph_node *clone_of;
281 /* For functions with many calls sites it holds map from call expression
282 to the edge to speed up cgraph_edge function. */
283 htab_t GTY((param_is (struct cgraph_edge))) call_site_hash;
284 /* Declaration node used to be clone of. */
285 tree former_clone_of;
286
287 /* Interprocedural passes scheduled to have their transform functions
288 applied next time we execute local pass on them. We maintain it
289 per-function in order to allow IPA passes to introduce new functions. */
290 vec<ipa_opt_pass> GTY((skip)) ipa_transforms_to_apply;
291
292 struct cgraph_local_info local;
293 struct cgraph_global_info global;
294 struct cgraph_rtl_info rtl;
295 struct cgraph_clone_info clone;
296 struct cgraph_thunk_info thunk;
297
298 /* Expected number of executions: calculated in profile.c. */
299 gcov_type count;
300 /* How to scale counts at materialization time; used to merge
301 LTO units with different number of profile runs. */
302 int count_materialization_scale;
303 /* Unique id of the node. */
304 int uid;
305 /* ID assigned by the profiling. */
306 unsigned int profile_id;
307 /* Time profiler: first run of function. */
308 int tp_first_run;
309
310 /* Set when decl is an abstract function pointed to by the
311 ABSTRACT_DECL_ORIGIN of a reachable function. */
312 unsigned used_as_abstract_origin : 1;
313 /* Set once the function is lowered (i.e. its CFG is built). */
314 unsigned lowered : 1;
315 /* Set once the function has been instantiated and its callee
316 lists created. */
317 unsigned process : 1;
318 /* How commonly executed the node is. Initialized during branch
319 probabilities pass. */
320 ENUM_BITFIELD (node_frequency) frequency : 2;
321 /* True when function can only be called at startup (from static ctor). */
322 unsigned only_called_at_startup : 1;
323 /* True when function can only be called at startup (from static dtor). */
324 unsigned only_called_at_exit : 1;
325 /* True when function is the transactional clone of a function which
326 is called only from inside transactions. */
327 /* ?? We should be able to remove this. We have enough bits in
328 cgraph to calculate it. */
329 unsigned tm_clone : 1;
330 /* True if this decl is a dispatcher for function versions. */
331 unsigned dispatcher_function : 1;
332 };
333
334
335 typedef struct cgraph_node *cgraph_node_ptr;
336
337
338 /* Function Multiversioning info. */
339 struct GTY(()) cgraph_function_version_info {
340 /* The cgraph_node for which the function version info is stored. */
341 struct cgraph_node *this_node;
342 /* Chains all the semantically identical function versions. The
343 first function in this chain is the version_info node of the
344 default function. */
345 struct cgraph_function_version_info *prev;
346 /* If this version node corresponds to a dispatcher for function
347 versions, this points to the version info node of the default
348 function, the first node in the chain. */
349 struct cgraph_function_version_info *next;
350 /* If this node corresponds to a function version, this points
351 to the dispatcher function decl, which is the function that must
352 be called to execute the right function version at run-time.
353
354 If this cgraph node is a dispatcher (if dispatcher_function is
355 true, in the cgraph_node struct) for function versions, this
356 points to resolver function, which holds the function body of the
357 dispatcher. The dispatcher decl is an alias to the resolver
358 function decl. */
359 tree dispatcher_resolver;
360 };
361
362 /* Get the cgraph_function_version_info node corresponding to node. */
363 struct cgraph_function_version_info *
364 get_cgraph_node_version (struct cgraph_node *node);
365
366 /* Insert a new cgraph_function_version_info node into cgraph_fnver_htab
367 corresponding to cgraph_node NODE. */
368 struct cgraph_function_version_info *
369 insert_new_cgraph_node_version (struct cgraph_node *node);
370
371 /* Record that DECL1 and DECL2 are semantically identical function
372 versions. */
373 void record_function_versions (tree decl1, tree decl2);
374
375 /* Remove the cgraph_function_version_info and cgraph_node for DECL. This
376 DECL is a duplicate declaration. */
377 void delete_function_version (tree decl);
378
379 /* A cgraph node set is a collection of cgraph nodes. A cgraph node
380 can appear in multiple sets. */
381 struct cgraph_node_set_def
382 {
383 struct pointer_map_t *map;
384 vec<cgraph_node_ptr> nodes;
385 };
386
387 typedef struct varpool_node *varpool_node_ptr;
388
389
390 /* A varpool node set is a collection of varpool nodes. A varpool node
391 can appear in multiple sets. */
392 struct varpool_node_set_def
393 {
394 struct pointer_map_t * map;
395 vec<varpool_node_ptr> nodes;
396 };
397
398 typedef struct cgraph_node_set_def *cgraph_node_set;
399
400
401 typedef struct varpool_node_set_def *varpool_node_set;
402
403
404 /* Iterator structure for cgraph node sets. */
405 typedef struct
406 {
407 cgraph_node_set set;
408 unsigned index;
409 } cgraph_node_set_iterator;
410
411 /* Iterator structure for varpool node sets. */
412 typedef struct
413 {
414 varpool_node_set set;
415 unsigned index;
416 } varpool_node_set_iterator;
417
418 #define DEFCIFCODE(code, string) CIF_ ## code,
419 /* Reasons for inlining failures. */
420 typedef enum cgraph_inline_failed_enum {
421 #include "cif-code.def"
422 CIF_N_REASONS
423 } cgraph_inline_failed_t;
424
425 /* Structure containing additional information about an indirect call. */
426
427 struct GTY(()) cgraph_indirect_call_info
428 {
429 /* When polymorphic is set, this field contains offset where the object which
430 was actually used in the polymorphic resides within a larger structure.
431 If agg_contents is set, the field contains the offset within the aggregate
432 from which the address to call was loaded. */
433 HOST_WIDE_INT offset;
434 /* OBJ_TYPE_REF_TOKEN of a polymorphic call (if polymorphic is set). */
435 HOST_WIDE_INT otr_token;
436 /* Type of the object from OBJ_TYPE_REF_OBJECT. */
437 tree otr_type, outer_type;
438 /* Index of the parameter that is called. */
439 int param_index;
440 /* ECF flags determined from the caller. */
441 int ecf_flags;
442 /* Profile_id of common target obtrained from profile. */
443 int common_target_id;
444 /* Probability that call will land in function with COMMON_TARGET_ID. */
445 int common_target_probability;
446
447 /* Set when the call is a virtual call with the parameter being the
448 associated object pointer rather than a simple direct call. */
449 unsigned polymorphic : 1;
450 /* Set when the call is a call of a pointer loaded from contents of an
451 aggregate at offset. */
452 unsigned agg_contents : 1;
453 /* Set when this is a call through a member pointer. */
454 unsigned member_ptr : 1;
455 /* When the previous bit is set, this one determines whether the destination
456 is loaded from a parameter passed by reference. */
457 unsigned by_ref : 1;
458 unsigned int maybe_in_construction : 1;
459 unsigned int maybe_derived_type : 1;
460 };
461
462 struct GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"))) cgraph_edge {
463 /* Expected number of executions: calculated in profile.c. */
464 gcov_type count;
465 struct cgraph_node *caller;
466 struct cgraph_node *callee;
467 struct cgraph_edge *prev_caller;
468 struct cgraph_edge *next_caller;
469 struct cgraph_edge *prev_callee;
470 struct cgraph_edge *next_callee;
471 gimple call_stmt;
472 /* Additional information about an indirect call. Not cleared when an edge
473 becomes direct. */
474 struct cgraph_indirect_call_info *indirect_info;
475 PTR GTY ((skip (""))) aux;
476 /* When equal to CIF_OK, inline this call. Otherwise, points to the
477 explanation why function was not inlined. */
478 cgraph_inline_failed_t inline_failed;
479 /* The stmt_uid of call_stmt. This is used by LTO to recover the call_stmt
480 when the function is serialized in. */
481 unsigned int lto_stmt_uid;
482 /* Expected frequency of executions within the function.
483 When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
484 per function call. The range is 0 to CGRAPH_FREQ_MAX. */
485 int frequency;
486 /* Unique id of the edge. */
487 int uid;
488 /* Whether this edge was made direct by indirect inlining. */
489 unsigned int indirect_inlining_edge : 1;
490 /* Whether this edge describes an indirect call with an undetermined
491 callee. */
492 unsigned int indirect_unknown_callee : 1;
493 /* Whether this edge is still a dangling */
494 /* True if the corresponding CALL stmt cannot be inlined. */
495 unsigned int call_stmt_cannot_inline_p : 1;
496 /* Can this call throw externally? */
497 unsigned int can_throw_external : 1;
498 /* Edges with SPECULATIVE flag represents indirect calls that was
499 speculatively turned into direct (i.e. by profile feedback).
500 The final code sequence will have form:
501
502 if (call_target == expected_fn)
503 expected_fn ();
504 else
505 call_target ();
506
507 Every speculative call is represented by three components attached
508 to a same call statement:
509 1) a direct call (to expected_fn)
510 2) an indirect call (to call_target)
511 3) a IPA_REF_ADDR refrence to expected_fn.
512
513 Optimizers may later redirect direct call to clone, so 1) and 3)
514 do not need to necesarily agree with destination. */
515 unsigned int speculative : 1;
516 };
517
518 #define CGRAPH_FREQ_BASE 1000
519 #define CGRAPH_FREQ_MAX 100000
520
521 typedef struct cgraph_edge *cgraph_edge_p;
522
523
524 /* The varpool data structure.
525 Each static variable decl has assigned varpool_node. */
526
527 class GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node {
528 public:
529 /* Set when variable is scheduled to be assembled. */
530 unsigned output : 1;
531 };
532
533 /* Every top level asm statement is put into a asm_node. */
534
535 struct GTY(()) asm_node {
536 /* Next asm node. */
537 struct asm_node *next;
538 /* String for this asm node. */
539 tree asm_str;
540 /* Ordering of all cgraph nodes. */
541 int order;
542 };
543
544 /* Report whether or not THIS symtab node is a function, aka cgraph_node. */
545
546 template <>
547 template <>
548 inline bool
549 is_a_helper <cgraph_node>::test (symtab_node *p)
550 {
551 return p->type == SYMTAB_FUNCTION;
552 }
553
554 /* Report whether or not THIS symtab node is a vriable, aka varpool_node. */
555
556 template <>
557 template <>
558 inline bool
559 is_a_helper <varpool_node>::test (symtab_node *p)
560 {
561 return p->type == SYMTAB_VARIABLE;
562 }
563
564 extern GTY(()) symtab_node *symtab_nodes;
565 extern GTY(()) int cgraph_n_nodes;
566 extern GTY(()) int cgraph_max_uid;
567 extern GTY(()) int cgraph_edge_max_uid;
568 extern bool cgraph_global_info_ready;
569 enum cgraph_state
570 {
571 /* Frontend is parsing and finalizing functions. */
572 CGRAPH_STATE_PARSING,
573 /* Callgraph is being constructed. It is safe to add new functions. */
574 CGRAPH_STATE_CONSTRUCTION,
575 /* Callgraph is being at LTO time. */
576 CGRAPH_LTO_STREAMING,
577 /* Callgraph is built and IPA passes are being run. */
578 CGRAPH_STATE_IPA,
579 /* Callgraph is built and all functions are transformed to SSA form. */
580 CGRAPH_STATE_IPA_SSA,
581 /* Functions are now ordered and being passed to RTL expanders. */
582 CGRAPH_STATE_EXPANSION,
583 /* All cgraph expansion is done. */
584 CGRAPH_STATE_FINISHED
585 };
586 extern enum cgraph_state cgraph_state;
587 extern bool cgraph_function_flags_ready;
588 extern cgraph_node_set cgraph_new_nodes;
589
590 extern GTY(()) struct asm_node *asm_nodes;
591 extern GTY(()) int symtab_order;
592 extern bool cpp_implicit_aliases_done;
593
594 /* In symtab.c */
595 void symtab_register_node (symtab_node *);
596 void symtab_unregister_node (symtab_node *);
597 void symtab_remove_node (symtab_node *);
598 symtab_node *symtab_get_node (const_tree);
599 symtab_node *symtab_node_for_asm (const_tree asmname);
600 void symtab_insert_node_to_hashtable (symtab_node *);
601 void symtab_add_to_same_comdat_group (symtab_node *, symtab_node *);
602 void symtab_dissolve_same_comdat_group_list (symtab_node *node);
603 void dump_symtab (FILE *);
604 void debug_symtab (void);
605 void dump_symtab_node (FILE *, symtab_node *);
606 void debug_symtab_node (symtab_node *);
607 void dump_symtab_base (FILE *, symtab_node *);
608 void verify_symtab (void);
609 void verify_symtab_node (symtab_node *);
610 bool verify_symtab_base (symtab_node *);
611 bool symtab_used_from_object_file_p (symtab_node *);
612 void symtab_make_decl_local (tree);
613 symtab_node *symtab_alias_ultimate_target (symtab_node *,
614 enum availability *avail = NULL);
615 bool symtab_resolve_alias (symtab_node *node, symtab_node *target);
616 void fixup_same_cpp_alias_visibility (symtab_node *node, symtab_node *target);
617 bool symtab_for_node_and_aliases (symtab_node *,
618 bool (*) (symtab_node *, void *),
619 void *,
620 bool);
621 symtab_node *symtab_nonoverwritable_alias (symtab_node *);
622 enum availability symtab_node_availability (symtab_node *);
623 bool symtab_semantically_equivalent_p (symtab_node *, symtab_node *);
624
625 /* In cgraph.c */
626 void dump_cgraph (FILE *);
627 void debug_cgraph (void);
628 void dump_cgraph_node (FILE *, struct cgraph_node *);
629 void debug_cgraph_node (struct cgraph_node *);
630 void cgraph_remove_edge (struct cgraph_edge *);
631 void cgraph_remove_node (struct cgraph_node *);
632 void cgraph_release_function_body (struct cgraph_node *);
633 void release_function_body (tree);
634 void cgraph_node_remove_callees (struct cgraph_node *node);
635 struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
636 struct cgraph_node *,
637 gimple, gcov_type, int);
638 struct cgraph_edge *cgraph_create_indirect_edge (struct cgraph_node *, gimple,
639 int, gcov_type, int);
640 struct cgraph_indirect_call_info *cgraph_allocate_init_indirect_info (void);
641 struct cgraph_node * cgraph_create_node (tree);
642 struct cgraph_node * cgraph_create_empty_node (void);
643 struct cgraph_node * cgraph_get_create_node (tree);
644 struct cgraph_node * cgraph_same_body_alias (struct cgraph_node *, tree, tree);
645 struct cgraph_node * cgraph_add_thunk (struct cgraph_node *, tree, tree, bool, HOST_WIDE_INT,
646 HOST_WIDE_INT, tree, tree);
647 struct cgraph_node *cgraph_node_for_asm (tree);
648 struct cgraph_edge *cgraph_edge (struct cgraph_node *, gimple);
649 void cgraph_set_call_stmt (struct cgraph_edge *, gimple, bool update_speculative = true);
650 void cgraph_update_edges_for_call_stmt (gimple, tree, gimple);
651 struct cgraph_local_info *cgraph_local_info (tree);
652 struct cgraph_global_info *cgraph_global_info (tree);
653 struct cgraph_rtl_info *cgraph_rtl_info (tree);
654 struct cgraph_node *cgraph_create_function_alias (tree, tree);
655 void cgraph_call_node_duplication_hooks (struct cgraph_node *,
656 struct cgraph_node *);
657 void cgraph_call_edge_duplication_hooks (struct cgraph_edge *,
658 struct cgraph_edge *);
659
660 void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *);
661 struct cgraph_edge *cgraph_make_edge_direct (struct cgraph_edge *, struct cgraph_node *);
662 bool cgraph_only_called_directly_p (struct cgraph_node *);
663
664 bool cgraph_function_possibly_inlined_p (tree);
665 void cgraph_unnest_node (struct cgraph_node *);
666
667 enum availability cgraph_function_body_availability (struct cgraph_node *);
668 void cgraph_add_new_function (tree, bool);
669 const char* cgraph_inline_failed_string (cgraph_inline_failed_t);
670
671 void cgraph_set_nothrow_flag (struct cgraph_node *, bool);
672 void cgraph_set_const_flag (struct cgraph_node *, bool, bool);
673 void cgraph_set_pure_flag (struct cgraph_node *, bool, bool);
674 bool cgraph_node_cannot_return (struct cgraph_node *);
675 bool cgraph_edge_cannot_lead_to_return (struct cgraph_edge *);
676 bool cgraph_will_be_removed_from_program_if_no_direct_calls
677 (struct cgraph_node *node);
678 bool cgraph_can_remove_if_no_direct_calls_and_refs_p
679 (struct cgraph_node *node);
680 bool cgraph_can_remove_if_no_direct_calls_p (struct cgraph_node *node);
681 bool resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution);
682 bool cgraph_for_node_thunks_and_aliases (struct cgraph_node *,
683 bool (*) (struct cgraph_node *, void *),
684 void *,
685 bool);
686 bool cgraph_for_node_and_aliases (struct cgraph_node *,
687 bool (*) (struct cgraph_node *, void *),
688 void *, bool);
689 vec<cgraph_edge_p> collect_callers_of_node (struct cgraph_node *node);
690 void verify_cgraph (void);
691 void verify_cgraph_node (struct cgraph_node *);
692 void cgraph_mark_address_taken_node (struct cgraph_node *);
693
694 typedef void (*cgraph_edge_hook)(struct cgraph_edge *, void *);
695 typedef void (*cgraph_node_hook)(struct cgraph_node *, void *);
696 typedef void (*varpool_node_hook)(struct varpool_node *, void *);
697 typedef void (*cgraph_2edge_hook)(struct cgraph_edge *, struct cgraph_edge *,
698 void *);
699 typedef void (*cgraph_2node_hook)(struct cgraph_node *, struct cgraph_node *,
700 void *);
701 struct cgraph_edge_hook_list;
702 struct cgraph_node_hook_list;
703 struct varpool_node_hook_list;
704 struct cgraph_2edge_hook_list;
705 struct cgraph_2node_hook_list;
706 struct cgraph_edge_hook_list *cgraph_add_edge_removal_hook (cgraph_edge_hook, void *);
707 void cgraph_remove_edge_removal_hook (struct cgraph_edge_hook_list *);
708 struct cgraph_node_hook_list *cgraph_add_node_removal_hook (cgraph_node_hook,
709 void *);
710 void cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *);
711 struct varpool_node_hook_list *varpool_add_node_removal_hook (varpool_node_hook,
712 void *);
713 void varpool_remove_node_removal_hook (struct varpool_node_hook_list *);
714 struct cgraph_node_hook_list *cgraph_add_function_insertion_hook (cgraph_node_hook,
715 void *);
716 void cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *);
717 struct varpool_node_hook_list *varpool_add_variable_insertion_hook (varpool_node_hook,
718 void *);
719 void varpool_remove_variable_insertion_hook (struct varpool_node_hook_list *);
720 void cgraph_call_function_insertion_hooks (struct cgraph_node *node);
721 struct cgraph_2edge_hook_list *cgraph_add_edge_duplication_hook (cgraph_2edge_hook, void *);
722 void cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *);
723 struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook (cgraph_2node_hook, void *);
724 void cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *);
725 gimple cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *);
726 struct cgraph_node * cgraph_function_node (struct cgraph_node *,
727 enum availability *avail = NULL);
728 bool cgraph_get_body (struct cgraph_node *node);
729 struct cgraph_edge *
730 cgraph_turn_edge_to_speculative (struct cgraph_edge *,
731 struct cgraph_node *,
732 gcov_type, int);
733 void cgraph_speculative_call_info (struct cgraph_edge *,
734 struct cgraph_edge *&,
735 struct cgraph_edge *&,
736 struct ipa_ref *&);
737 extern bool gimple_check_call_matching_types (gimple, tree, bool);
738
739 /* In cgraphunit.c */
740 struct asm_node *add_asm_node (tree);
741 extern FILE *cgraph_dump_file;
742 void cgraph_finalize_function (tree, bool);
743 void finalize_compilation_unit (void);
744 void compile (void);
745 void init_cgraph (void);
746 bool cgraph_process_new_functions (void);
747 void cgraph_process_same_body_aliases (void);
748 void fixup_same_cpp_alias_visibility (symtab_node *, symtab_node *target, tree);
749 /* Initialize datastructures so DECL is a function in lowered gimple form.
750 IN_SSA is true if the gimple is in SSA. */
751 basic_block init_lowered_empty_function (tree, bool);
752 void cgraph_reset_node (struct cgraph_node *);
753 bool expand_thunk (struct cgraph_node *, bool);
754
755 /* In cgraphclones.c */
756
757 struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *,
758 struct cgraph_node *, gimple,
759 unsigned, gcov_type, int, bool);
760 struct cgraph_node * cgraph_clone_node (struct cgraph_node *, tree, gcov_type,
761 int, bool, vec<cgraph_edge_p>,
762 bool, struct cgraph_node *);
763 tree clone_function_name (tree decl, const char *);
764 struct cgraph_node * cgraph_create_virtual_clone (struct cgraph_node *old_node,
765 vec<cgraph_edge_p>,
766 vec<ipa_replace_map_p, va_gc> *tree_map,
767 bitmap args_to_skip,
768 const char *clone_name);
769 struct cgraph_node *cgraph_find_replacement_node (struct cgraph_node *);
770 bool cgraph_remove_node_and_inline_clones (struct cgraph_node *, struct cgraph_node *);
771 void cgraph_set_call_stmt_including_clones (struct cgraph_node *, gimple, gimple,
772 bool update_speculative = true);
773 void cgraph_create_edge_including_clones (struct cgraph_node *,
774 struct cgraph_node *,
775 gimple, gimple, gcov_type, int,
776 cgraph_inline_failed_t);
777 void cgraph_materialize_all_clones (void);
778 struct cgraph_node * cgraph_copy_node_for_versioning (struct cgraph_node *,
779 tree, vec<cgraph_edge_p>, bitmap);
780 struct cgraph_node *cgraph_function_versioning (struct cgraph_node *,
781 vec<cgraph_edge_p>,
782 vec<ipa_replace_map_p, va_gc> *,
783 bitmap, bool, bitmap,
784 basic_block, const char *);
785 void tree_function_versioning (tree, tree, vec<ipa_replace_map_p, va_gc> *,
786 bool, bitmap, bool, bitmap, basic_block);
787 struct cgraph_edge *cgraph_resolve_speculation (struct cgraph_edge *, tree);
788
789 /* In cgraphbuild.c */
790 unsigned int rebuild_cgraph_edges (void);
791 void cgraph_rebuild_references (void);
792 int compute_call_stmt_bb_frequency (tree, basic_block bb);
793 void record_references_in_initializer (tree, bool);
794 void ipa_record_stmt_references (struct cgraph_node *, gimple);
795
796 /* In ipa.c */
797 bool symtab_remove_unreachable_nodes (bool, FILE *);
798 cgraph_node_set cgraph_node_set_new (void);
799 cgraph_node_set_iterator cgraph_node_set_find (cgraph_node_set,
800 struct cgraph_node *);
801 void cgraph_node_set_add (cgraph_node_set, struct cgraph_node *);
802 void cgraph_node_set_remove (cgraph_node_set, struct cgraph_node *);
803 void dump_cgraph_node_set (FILE *, cgraph_node_set);
804 void debug_cgraph_node_set (cgraph_node_set);
805 void free_cgraph_node_set (cgraph_node_set);
806 void cgraph_build_static_cdtor (char which, tree body, int priority);
807
808 varpool_node_set varpool_node_set_new (void);
809 varpool_node_set_iterator varpool_node_set_find (varpool_node_set,
810 struct varpool_node *);
811 void varpool_node_set_add (varpool_node_set, struct varpool_node *);
812 void varpool_node_set_remove (varpool_node_set, struct varpool_node *);
813 void dump_varpool_node_set (FILE *, varpool_node_set);
814 void debug_varpool_node_set (varpool_node_set);
815 void free_varpool_node_set (varpool_node_set);
816 void ipa_discover_readonly_nonaddressable_vars (void);
817 bool varpool_externally_visible_p (struct varpool_node *);
818
819 /* In predict.c */
820 bool cgraph_maybe_hot_edge_p (struct cgraph_edge *e);
821 bool cgraph_optimize_for_size_p (struct cgraph_node *);
822
823 /* In varpool.c */
824 struct varpool_node *varpool_create_empty_node (void);
825 struct varpool_node *varpool_node_for_decl (tree);
826 struct varpool_node *varpool_node_for_asm (tree asmname);
827 void varpool_mark_needed_node (struct varpool_node *);
828 void debug_varpool (void);
829 void dump_varpool (FILE *);
830 void dump_varpool_node (FILE *, struct varpool_node *);
831
832 void varpool_finalize_decl (tree);
833 enum availability cgraph_variable_initializer_availability (struct varpool_node *);
834 void cgraph_make_node_local (struct cgraph_node *);
835 bool cgraph_node_can_be_local_p (struct cgraph_node *);
836
837
838 void varpool_remove_node (struct varpool_node *node);
839 void varpool_finalize_named_section_flags (struct varpool_node *node);
840 bool varpool_output_variables (void);
841 bool varpool_assemble_decl (struct varpool_node *node);
842 void varpool_analyze_node (struct varpool_node *);
843 struct varpool_node * varpool_extra_name_alias (tree, tree);
844 struct varpool_node * varpool_create_variable_alias (tree, tree);
845 void varpool_reset_queue (void);
846 tree ctor_for_folding (tree);
847 bool varpool_for_node_and_aliases (struct varpool_node *,
848 bool (*) (struct varpool_node *, void *),
849 void *, bool);
850 void varpool_add_new_variable (tree);
851 void symtab_initialize_asm_name_hash (void);
852 void symtab_prevail_in_asm_name_hash (symtab_node *node);
853 void varpool_remove_initializer (struct varpool_node *);
854
855 /* In cgraph.c */
856 extern void change_decl_assembler_name (tree, tree);
857
858 /* Return callgraph node for given symbol and check it is a function. */
859 static inline struct cgraph_node *
860 cgraph (symtab_node *node)
861 {
862 gcc_checking_assert (!node || node->type == SYMTAB_FUNCTION);
863 return (struct cgraph_node *)node;
864 }
865
866 /* Return varpool node for given symbol and check it is a variable. */
867 static inline struct varpool_node *
868 varpool (symtab_node *node)
869 {
870 gcc_checking_assert (!node || node->type == SYMTAB_VARIABLE);
871 return (struct varpool_node *)node;
872 }
873
874 /* Return callgraph node for given symbol and check it is a function. */
875 static inline struct cgraph_node *
876 cgraph_get_node (const_tree decl)
877 {
878 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL);
879 return cgraph (symtab_get_node (decl));
880 }
881
882 /* Return varpool node for given symbol and check it is a function. */
883 static inline struct varpool_node *
884 varpool_get_node (const_tree decl)
885 {
886 gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
887 return varpool (symtab_get_node (decl));
888 }
889
890 /* Walk all symbols. */
891 #define FOR_EACH_SYMBOL(node) \
892 for ((node) = symtab_nodes; (node); (node) = (node)->next)
893
894
895 /* Return first variable. */
896 static inline struct varpool_node *
897 varpool_first_variable (void)
898 {
899 symtab_node *node;
900 for (node = symtab_nodes; node; node = node->next)
901 if (varpool_node *vnode = dyn_cast <varpool_node> (node))
902 return vnode;
903 return NULL;
904 }
905
906 /* Return next variable after NODE. */
907 static inline struct varpool_node *
908 varpool_next_variable (struct varpool_node *node)
909 {
910 symtab_node *node1 = node->next;
911 for (; node1; node1 = node1->next)
912 if (varpool_node *vnode1 = dyn_cast <varpool_node> (node1))
913 return vnode1;
914 return NULL;
915 }
916 /* Walk all variables. */
917 #define FOR_EACH_VARIABLE(node) \
918 for ((node) = varpool_first_variable (); \
919 (node); \
920 (node) = varpool_next_variable ((node)))
921
922 /* Return first reachable static variable with initializer. */
923 static inline struct varpool_node *
924 varpool_first_static_initializer (void)
925 {
926 symtab_node *node;
927 for (node = symtab_nodes; node; node = node->next)
928 {
929 varpool_node *vnode = dyn_cast <varpool_node> (node);
930 if (vnode && DECL_INITIAL (node->decl))
931 return vnode;
932 }
933 return NULL;
934 }
935
936 /* Return next reachable static variable with initializer after NODE. */
937 static inline struct varpool_node *
938 varpool_next_static_initializer (struct varpool_node *node)
939 {
940 symtab_node *node1 = node->next;
941 for (; node1; node1 = node1->next)
942 {
943 varpool_node *vnode1 = dyn_cast <varpool_node> (node1);
944 if (vnode1 && DECL_INITIAL (node1->decl))
945 return vnode1;
946 }
947 return NULL;
948 }
949
950 /* Walk all static variables with initializer set. */
951 #define FOR_EACH_STATIC_INITIALIZER(node) \
952 for ((node) = varpool_first_static_initializer (); (node); \
953 (node) = varpool_next_static_initializer (node))
954
955 /* Return first reachable static variable with initializer. */
956 static inline struct varpool_node *
957 varpool_first_defined_variable (void)
958 {
959 symtab_node *node;
960 for (node = symtab_nodes; node; node = node->next)
961 {
962 varpool_node *vnode = dyn_cast <varpool_node> (node);
963 if (vnode && vnode->definition)
964 return vnode;
965 }
966 return NULL;
967 }
968
969 /* Return next reachable static variable with initializer after NODE. */
970 static inline struct varpool_node *
971 varpool_next_defined_variable (struct varpool_node *node)
972 {
973 symtab_node *node1 = node->next;
974 for (; node1; node1 = node1->next)
975 {
976 varpool_node *vnode1 = dyn_cast <varpool_node> (node1);
977 if (vnode1 && vnode1->definition)
978 return vnode1;
979 }
980 return NULL;
981 }
982 /* Walk all variables with definitions in current unit. */
983 #define FOR_EACH_DEFINED_VARIABLE(node) \
984 for ((node) = varpool_first_defined_variable (); (node); \
985 (node) = varpool_next_defined_variable (node))
986
987 /* Return first function with body defined. */
988 static inline struct cgraph_node *
989 cgraph_first_defined_function (void)
990 {
991 symtab_node *node;
992 for (node = symtab_nodes; node; node = node->next)
993 {
994 cgraph_node *cn = dyn_cast <cgraph_node> (node);
995 if (cn && cn->definition)
996 return cn;
997 }
998 return NULL;
999 }
1000
1001 /* Return next function with body defined after NODE. */
1002 static inline struct cgraph_node *
1003 cgraph_next_defined_function (struct cgraph_node *node)
1004 {
1005 symtab_node *node1 = node->next;
1006 for (; node1; node1 = node1->next)
1007 {
1008 cgraph_node *cn1 = dyn_cast <cgraph_node> (node1);
1009 if (cn1 && cn1->definition)
1010 return cn1;
1011 }
1012 return NULL;
1013 }
1014
1015 /* Walk all functions with body defined. */
1016 #define FOR_EACH_DEFINED_FUNCTION(node) \
1017 for ((node) = cgraph_first_defined_function (); (node); \
1018 (node) = cgraph_next_defined_function ((node)))
1019
1020 /* Return first function. */
1021 static inline struct cgraph_node *
1022 cgraph_first_function (void)
1023 {
1024 symtab_node *node;
1025 for (node = symtab_nodes; node; node = node->next)
1026 if (cgraph_node *cn = dyn_cast <cgraph_node> (node))
1027 return cn;
1028 return NULL;
1029 }
1030
1031 /* Return next function. */
1032 static inline struct cgraph_node *
1033 cgraph_next_function (struct cgraph_node *node)
1034 {
1035 symtab_node *node1 = node->next;
1036 for (; node1; node1 = node1->next)
1037 if (cgraph_node *cn1 = dyn_cast <cgraph_node> (node1))
1038 return cn1;
1039 return NULL;
1040 }
1041 /* Walk all functions. */
1042 #define FOR_EACH_FUNCTION(node) \
1043 for ((node) = cgraph_first_function (); (node); \
1044 (node) = cgraph_next_function ((node)))
1045
1046 /* Return true when NODE is a function with Gimple body defined
1047 in current unit. Functions can also be define externally or they
1048 can be thunks with no Gimple representation.
1049
1050 Note that at WPA stage, the function body may not be present in memory. */
1051
1052 static inline bool
1053 cgraph_function_with_gimple_body_p (struct cgraph_node *node)
1054 {
1055 return node->definition && !node->thunk.thunk_p && !node->alias;
1056 }
1057
1058 /* Return first function with body defined. */
1059 static inline struct cgraph_node *
1060 cgraph_first_function_with_gimple_body (void)
1061 {
1062 symtab_node *node;
1063 for (node = symtab_nodes; node; node = node->next)
1064 {
1065 cgraph_node *cn = dyn_cast <cgraph_node> (node);
1066 if (cn && cgraph_function_with_gimple_body_p (cn))
1067 return cn;
1068 }
1069 return NULL;
1070 }
1071
1072 /* Return next reachable static variable with initializer after NODE. */
1073 static inline struct cgraph_node *
1074 cgraph_next_function_with_gimple_body (struct cgraph_node *node)
1075 {
1076 symtab_node *node1 = node->next;
1077 for (; node1; node1 = node1->next)
1078 {
1079 cgraph_node *cn1 = dyn_cast <cgraph_node> (node1);
1080 if (cn1 && cgraph_function_with_gimple_body_p (cn1))
1081 return cn1;
1082 }
1083 return NULL;
1084 }
1085
1086 /* Walk all functions with body defined. */
1087 #define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \
1088 for ((node) = cgraph_first_function_with_gimple_body (); (node); \
1089 (node) = cgraph_next_function_with_gimple_body (node))
1090
1091 /* Create a new static variable of type TYPE. */
1092 tree add_new_static_var (tree type);
1093
1094 /* Return true if iterator CSI points to nothing. */
1095 static inline bool
1096 csi_end_p (cgraph_node_set_iterator csi)
1097 {
1098 return csi.index >= csi.set->nodes.length ();
1099 }
1100
1101 /* Advance iterator CSI. */
1102 static inline void
1103 csi_next (cgraph_node_set_iterator *csi)
1104 {
1105 csi->index++;
1106 }
1107
1108 /* Return the node pointed to by CSI. */
1109 static inline struct cgraph_node *
1110 csi_node (cgraph_node_set_iterator csi)
1111 {
1112 return csi.set->nodes[csi.index];
1113 }
1114
1115 /* Return an iterator to the first node in SET. */
1116 static inline cgraph_node_set_iterator
1117 csi_start (cgraph_node_set set)
1118 {
1119 cgraph_node_set_iterator csi;
1120
1121 csi.set = set;
1122 csi.index = 0;
1123 return csi;
1124 }
1125
1126 /* Return true if SET contains NODE. */
1127 static inline bool
1128 cgraph_node_in_set_p (struct cgraph_node *node, cgraph_node_set set)
1129 {
1130 cgraph_node_set_iterator csi;
1131 csi = cgraph_node_set_find (set, node);
1132 return !csi_end_p (csi);
1133 }
1134
1135 /* Return number of nodes in SET. */
1136 static inline size_t
1137 cgraph_node_set_size (cgraph_node_set set)
1138 {
1139 return set->nodes.length ();
1140 }
1141
1142 /* Return true if iterator VSI points to nothing. */
1143 static inline bool
1144 vsi_end_p (varpool_node_set_iterator vsi)
1145 {
1146 return vsi.index >= vsi.set->nodes.length ();
1147 }
1148
1149 /* Advance iterator VSI. */
1150 static inline void
1151 vsi_next (varpool_node_set_iterator *vsi)
1152 {
1153 vsi->index++;
1154 }
1155
1156 /* Return the node pointed to by VSI. */
1157 static inline struct varpool_node *
1158 vsi_node (varpool_node_set_iterator vsi)
1159 {
1160 return vsi.set->nodes[vsi.index];
1161 }
1162
1163 /* Return an iterator to the first node in SET. */
1164 static inline varpool_node_set_iterator
1165 vsi_start (varpool_node_set set)
1166 {
1167 varpool_node_set_iterator vsi;
1168
1169 vsi.set = set;
1170 vsi.index = 0;
1171 return vsi;
1172 }
1173
1174 /* Return true if SET contains NODE. */
1175 static inline bool
1176 varpool_node_in_set_p (struct varpool_node *node, varpool_node_set set)
1177 {
1178 varpool_node_set_iterator vsi;
1179 vsi = varpool_node_set_find (set, node);
1180 return !vsi_end_p (vsi);
1181 }
1182
1183 /* Return number of nodes in SET. */
1184 static inline size_t
1185 varpool_node_set_size (varpool_node_set set)
1186 {
1187 return set->nodes.length ();
1188 }
1189
1190 /* Uniquize all constants that appear in memory.
1191 Each constant in memory thus far output is recorded
1192 in `const_desc_table'. */
1193
1194 struct GTY(()) constant_descriptor_tree {
1195 /* A MEM for the constant. */
1196 rtx rtl;
1197
1198 /* The value of the constant. */
1199 tree value;
1200
1201 /* Hash of value. Computing the hash from value each time
1202 hashfn is called can't work properly, as that means recursive
1203 use of the hash table during hash table expansion. */
1204 hashval_t hash;
1205 };
1206
1207 /* Return true if set is nonempty. */
1208 static inline bool
1209 cgraph_node_set_nonempty_p (cgraph_node_set set)
1210 {
1211 return !set->nodes.is_empty ();
1212 }
1213
1214 /* Return true if set is nonempty. */
1215 static inline bool
1216 varpool_node_set_nonempty_p (varpool_node_set set)
1217 {
1218 return !set->nodes.is_empty ();
1219 }
1220
1221 /* Return true when function NODE is only called directly or it has alias.
1222 i.e. it is not externally visible, address was not taken and
1223 it is not used in any other non-standard way. */
1224
1225 static inline bool
1226 cgraph_only_called_directly_or_aliased_p (struct cgraph_node *node)
1227 {
1228 gcc_assert (!node->global.inlined_to);
1229 return (!node->force_output && !node->address_taken
1230 && !node->used_from_other_partition
1231 && !DECL_VIRTUAL_P (node->decl)
1232 && !DECL_STATIC_CONSTRUCTOR (node->decl)
1233 && !DECL_STATIC_DESTRUCTOR (node->decl)
1234 && !node->externally_visible);
1235 }
1236
1237 /* Return true when function NODE can be removed from callgraph
1238 if all direct calls are eliminated. */
1239
1240 static inline bool
1241 varpool_can_remove_if_no_refs (struct varpool_node *node)
1242 {
1243 if (DECL_EXTERNAL (node->decl))
1244 return true;
1245 return (!node->force_output && !node->used_from_other_partition
1246 && ((DECL_COMDAT (node->decl)
1247 && !node->forced_by_abi
1248 && !symtab_used_from_object_file_p (node))
1249 || !node->externally_visible
1250 || DECL_HAS_VALUE_EXPR_P (node->decl)));
1251 }
1252
1253 /* Return true when all references to VNODE must be visible in ipa_ref_list.
1254 i.e. if the variable is not externally visible or not used in some magic
1255 way (asm statement or such).
1256 The magic uses are all summarized in force_output flag. */
1257
1258 static inline bool
1259 varpool_all_refs_explicit_p (struct varpool_node *vnode)
1260 {
1261 return (vnode->definition
1262 && !vnode->externally_visible
1263 && !vnode->used_from_other_partition
1264 && !vnode->force_output);
1265 }
1266
1267 /* Constant pool accessor function. */
1268 htab_t constant_pool_htab (void);
1269
1270 /* FIXME: inappropriate dependency of cgraph on IPA. */
1271 #include "ipa-ref-inline.h"
1272
1273 /* Return node that alias N is aliasing. */
1274
1275 static inline symtab_node *
1276 symtab_alias_target (symtab_node *n)
1277 {
1278 struct ipa_ref *ref;
1279 ipa_ref_list_reference_iterate (&n->ref_list, 0, ref);
1280 gcc_checking_assert (ref->use == IPA_REF_ALIAS);
1281 return ref->referred;
1282 }
1283
1284 static inline struct cgraph_node *
1285 cgraph_alias_target (struct cgraph_node *n)
1286 {
1287 return dyn_cast <cgraph_node> (symtab_alias_target (n));
1288 }
1289
1290 static inline struct varpool_node *
1291 varpool_alias_target (struct varpool_node *n)
1292 {
1293 return dyn_cast <varpool_node> (symtab_alias_target (n));
1294 }
1295
1296 /* Given NODE, walk the alias chain to return the function NODE is alias of.
1297 Do not walk through thunks.
1298 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
1299
1300 static inline struct cgraph_node *
1301 cgraph_function_or_thunk_node (struct cgraph_node *node,
1302 enum availability *availability = NULL)
1303 {
1304 struct cgraph_node *n;
1305
1306 n = dyn_cast <cgraph_node> (symtab_alias_ultimate_target (node,
1307 availability));
1308 if (!n && availability)
1309 *availability = AVAIL_NOT_AVAILABLE;
1310 return n;
1311 }
1312 /* Given NODE, walk the alias chain to return the function NODE is alias of.
1313 Do not walk through thunks.
1314 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
1315
1316 static inline struct varpool_node *
1317 varpool_variable_node (struct varpool_node *node,
1318 enum availability *availability = NULL)
1319 {
1320 struct varpool_node *n;
1321
1322 n = dyn_cast <varpool_node> (symtab_alias_ultimate_target (node,
1323 availability));
1324 if (!n && availability)
1325 *availability = AVAIL_NOT_AVAILABLE;
1326 return n;
1327 }
1328
1329 /* Return true when the edge E represents a direct recursion. */
1330 static inline bool
1331 cgraph_edge_recursive_p (struct cgraph_edge *e)
1332 {
1333 struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
1334 if (e->caller->global.inlined_to)
1335 return e->caller->global.inlined_to->decl == callee->decl;
1336 else
1337 return e->caller->decl == callee->decl;
1338 }
1339
1340 /* Return true if the TM_CLONE bit is set for a given FNDECL. */
1341 static inline bool
1342 decl_is_tm_clone (const_tree fndecl)
1343 {
1344 struct cgraph_node *n = cgraph_get_node (fndecl);
1345 if (n)
1346 return n->tm_clone;
1347 return false;
1348 }
1349
1350 /* Likewise indicate that a node is needed, i.e. reachable via some
1351 external means. */
1352
1353 static inline void
1354 cgraph_mark_force_output_node (struct cgraph_node *node)
1355 {
1356 node->force_output = 1;
1357 gcc_checking_assert (!node->global.inlined_to);
1358 }
1359
1360 /* Return true when the symbol is real symbol, i.e. it is not inline clone
1361 or abstract function kept for debug info purposes only. */
1362
1363 static inline bool
1364 symtab_real_symbol_p (symtab_node *node)
1365 {
1366 struct cgraph_node *cnode;
1367
1368 if (DECL_ABSTRACT (node->decl))
1369 return false;
1370 if (!is_a <cgraph_node> (node))
1371 return true;
1372 cnode = cgraph (node);
1373 if (cnode->global.inlined_to)
1374 return false;
1375 return true;
1376 }
1377
1378 /* Return true if NODE can be discarded by linker from the binary. */
1379
1380 static inline bool
1381 symtab_can_be_discarded (symtab_node *node)
1382 {
1383 return (DECL_EXTERNAL (node->decl)
1384 || (DECL_ONE_ONLY (node->decl)
1385 && node->resolution != LDPR_PREVAILING_DEF
1386 && node->resolution != LDPR_PREVAILING_DEF_IRONLY
1387 && node->resolution != LDPR_PREVAILING_DEF_IRONLY_EXP));
1388 }
1389 #endif /* GCC_CGRAPH_H */