2015-02-22 Arnaud Charlet <charlet@adacore.com>
[official-gcc.git] / gcc / cgraph.h
blobec3cccda866eb31dbc95f072850f431b068fc299
1 /* Callgraph handling code.
2 Copyright (C) 2003-2015 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #ifndef GCC_CGRAPH_H
22 #define GCC_CGRAPH_H
25 /* Symbol table consists of functions and variables.
26 TODO: add labels and CONST_DECLs. */
27 enum symtab_type
29 SYMTAB_SYMBOL,
30 SYMTAB_FUNCTION,
31 SYMTAB_VARIABLE
34 /* Section names are stored as reference counted strings in GGC safe hashtable
35 (to make them survive through PCH). */
37 struct GTY((for_user)) section_hash_entry_d
39 int ref_count;
40 char *name; /* As long as this datastructure stays in GGC, we can not put
41 string at the tail of structure of GGC dies in horrible
42 way */
45 typedef struct section_hash_entry_d section_hash_entry;
47 struct section_name_hasher : ggc_hasher<section_hash_entry *>
49 typedef const char *compare_type;
51 static hashval_t hash (section_hash_entry *);
52 static bool equal (section_hash_entry *, const char *);
55 enum availability
57 /* Not yet set by cgraph_function_body_availability. */
58 AVAIL_UNSET,
59 /* Function body/variable initializer is unknown. */
60 AVAIL_NOT_AVAILABLE,
61 /* Function body/variable initializer is known but might be replaced
62 by a different one from other compilation unit and thus needs to
63 be dealt with a care. Like AVAIL_NOT_AVAILABLE it can have
64 arbitrary side effects on escaping variables and functions, while
65 like AVAILABLE it might access static variables. */
66 AVAIL_INTERPOSABLE,
67 /* Function body/variable initializer is known and will be used in final
68 program. */
69 AVAIL_AVAILABLE,
70 /* Function body/variable initializer is known and all it's uses are
71 explicitly visible within current unit (ie it's address is never taken and
72 it is not exported to other units). Currently used only for functions. */
73 AVAIL_LOCAL
76 /* Classification of symbols WRT partitioning. */
77 enum symbol_partitioning_class
79 /* External declarations are ignored by partitioning algorithms and they are
80 added into the boundary later via compute_ltrans_boundary. */
81 SYMBOL_EXTERNAL,
82 /* Partitioned symbols are pur into one of partitions. */
83 SYMBOL_PARTITION,
84 /* Duplicated symbols (such as comdat or constant pool references) are
85 copied into every node needing them via add_symbol_to_partition. */
86 SYMBOL_DUPLICATE
89 /* Base of all entries in the symbol table.
90 The symtab_node is inherited by cgraph and varpol nodes. */
91 class GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"),
92 chain_next ("%h.next"), chain_prev ("%h.previous")))
93 symtab_node
95 public:
96 /* Return name. */
97 const char *name () const;
99 /* Return asm name. */
100 const char * asm_name () const;
102 /* Add node into symbol table. This function is not used directly, but via
103 cgraph/varpool node creation routines. */
104 void register_symbol (void);
106 /* Remove symbol from symbol table. */
107 void remove (void);
109 /* Dump symtab node to F. */
110 void dump (FILE *f);
112 /* Dump symtab node to stderr. */
113 void DEBUG_FUNCTION debug (void);
115 /* Verify consistency of node. */
116 void DEBUG_FUNCTION verify (void);
118 /* Return ipa reference from this symtab_node to
119 REFERED_NODE or REFERED_VARPOOL_NODE. USE_TYPE specify type
120 of the use and STMT the statement (if it exists). */
121 ipa_ref *create_reference (symtab_node *referred_node,
122 enum ipa_ref_use use_type);
124 /* Return ipa reference from this symtab_node to
125 REFERED_NODE or REFERED_VARPOOL_NODE. USE_TYPE specify type
126 of the use and STMT the statement (if it exists). */
127 ipa_ref *create_reference (symtab_node *referred_node,
128 enum ipa_ref_use use_type, gimple stmt);
130 /* If VAL is a reference to a function or a variable, add a reference from
131 this symtab_node to the corresponding symbol table node. USE_TYPE specify
132 type of the use and STMT the statement (if it exists). Return the new
133 reference or NULL if none was created. */
134 ipa_ref *maybe_create_reference (tree val, enum ipa_ref_use use_type,
135 gimple stmt);
137 /* Clone all references from symtab NODE to this symtab_node. */
138 void clone_references (symtab_node *node);
140 /* Remove all stmt references in non-speculative references.
141 Those are not maintained during inlining & clonning.
142 The exception are speculative references that are updated along
143 with callgraph edges associated with them. */
144 void clone_referring (symtab_node *node);
146 /* Clone reference REF to this symtab_node and set its stmt to STMT. */
147 ipa_ref *clone_reference (ipa_ref *ref, gimple stmt);
149 /* Find the structure describing a reference to REFERRED_NODE
150 and associated with statement STMT. */
151 ipa_ref *find_reference (symtab_node *referred_node, gimple stmt,
152 unsigned int lto_stmt_uid);
154 /* Remove all references that are associated with statement STMT. */
155 void remove_stmt_references (gimple stmt);
157 /* Remove all stmt references in non-speculative references.
158 Those are not maintained during inlining & clonning.
159 The exception are speculative references that are updated along
160 with callgraph edges associated with them. */
161 void clear_stmts_in_references (void);
163 /* Remove all references in ref list. */
164 void remove_all_references (void);
166 /* Remove all referring items in ref list. */
167 void remove_all_referring (void);
169 /* Dump references in ref list to FILE. */
170 void dump_references (FILE *file);
172 /* Dump referring in list to FILE. */
173 void dump_referring (FILE *);
175 /* Get number of references for this node. */
176 inline unsigned num_references (void)
178 return ref_list.references ? ref_list.references->length () : 0;
181 /* Iterates I-th reference in the list, REF is also set. */
182 ipa_ref *iterate_reference (unsigned i, ipa_ref *&ref);
184 /* Iterates I-th referring item in the list, REF is also set. */
185 ipa_ref *iterate_referring (unsigned i, ipa_ref *&ref);
187 /* Iterates I-th referring alias item in the list, REF is also set. */
188 ipa_ref *iterate_direct_aliases (unsigned i, ipa_ref *&ref);
190 /* Return true if symtab node and TARGET represents
191 semantically equivalent symbols. */
192 bool semantically_equivalent_p (symtab_node *target);
194 /* Classify symbol symtab node for partitioning. */
195 enum symbol_partitioning_class get_partitioning_class (void);
197 /* Return comdat group. */
198 tree get_comdat_group ()
200 return x_comdat_group;
203 /* Return comdat group as identifier_node. */
204 tree get_comdat_group_id ()
206 if (x_comdat_group && TREE_CODE (x_comdat_group) != IDENTIFIER_NODE)
207 x_comdat_group = DECL_ASSEMBLER_NAME (x_comdat_group);
208 return x_comdat_group;
211 /* Set comdat group. */
212 void set_comdat_group (tree group)
214 gcc_checking_assert (!group || TREE_CODE (group) == IDENTIFIER_NODE
215 || DECL_P (group));
216 x_comdat_group = group;
219 /* Return section as string. */
220 const char * get_section ()
222 if (!x_section)
223 return NULL;
224 return x_section->name;
227 /* Remove node from same comdat group. */
228 void remove_from_same_comdat_group (void);
230 /* Add this symtab_node to the same comdat group that OLD is in. */
231 void add_to_same_comdat_group (symtab_node *old_node);
233 /* Dissolve the same_comdat_group list in which NODE resides. */
234 void dissolve_same_comdat_group_list (void);
236 /* Return true when symtab_node is known to be used from other (non-LTO)
237 object file. Known only when doing LTO via linker plugin. */
238 bool used_from_object_file_p (void);
240 /* Walk the alias chain to return the symbol NODE is alias of.
241 If NODE is not an alias, return NODE.
242 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
243 symtab_node *ultimate_alias_target (enum availability *avail = NULL);
245 /* Return next reachable static symbol with initializer after NODE. */
246 inline symtab_node *next_defined_symbol (void);
248 /* Add reference recording that symtab node is alias of TARGET.
249 The function can fail in the case of aliasing cycles; in this case
250 it returns false. */
251 bool resolve_alias (symtab_node *target);
253 /* C++ FE sometimes change linkage flags after producing same
254 body aliases. */
255 void fixup_same_cpp_alias_visibility (symtab_node *target);
257 /* Call callback on symtab node and aliases associated to this node.
258 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
259 skipped. */
260 bool call_for_symbol_and_aliases (bool (*callback) (symtab_node *, void *),
261 void *data,
262 bool include_overwrite);
264 /* If node can not be interposable by static or dynamic linker to point to
265 different definition, return this symbol. Otherwise look for alias with
266 such property and if none exists, introduce new one. */
267 symtab_node *noninterposable_alias (void);
269 /* Return node that alias is aliasing. */
270 inline symtab_node *get_alias_target (void);
272 /* Set section for symbol and its aliases. */
273 void set_section (const char *section);
275 /* Set section, do not recurse into aliases.
276 When one wants to change section of symbol and its aliases,
277 use set_section. */
278 void set_section_for_node (const char *section);
280 /* Set initialization priority to PRIORITY. */
281 void set_init_priority (priority_type priority);
283 /* Return the initialization priority. */
284 priority_type get_init_priority ();
286 /* Return availability of NODE. */
287 enum availability get_availability (void);
289 /* Make DECL local. */
290 void make_decl_local (void);
292 /* Return true if list contains an alias. */
293 bool has_aliases_p (void);
295 /* Return true when the symbol is real symbol, i.e. it is not inline clone
296 or abstract function kept for debug info purposes only. */
297 bool real_symbol_p (void);
299 /* Determine if symbol declaration is needed. That is, visible to something
300 either outside this translation unit, something magic in the system
301 configury. This function is used just during symbol creation. */
302 bool needed_p (void);
304 /* Return true when there are references to the node. */
305 bool referred_to_p (void);
307 /* Return true if NODE can be discarded by linker from the binary. */
308 inline bool
309 can_be_discarded_p (void)
311 return (DECL_EXTERNAL (decl)
312 || (get_comdat_group ()
313 && resolution != LDPR_PREVAILING_DEF
314 && resolution != LDPR_PREVAILING_DEF_IRONLY
315 && resolution != LDPR_PREVAILING_DEF_IRONLY_EXP));
318 /* Return true if NODE is local to a particular COMDAT group, and must not
319 be named from outside the COMDAT. This is used for C++ decloned
320 constructors. */
321 inline bool comdat_local_p (void)
323 return (same_comdat_group && !TREE_PUBLIC (decl));
326 /* Return true if ONE and TWO are part of the same COMDAT group. */
327 inline bool in_same_comdat_group_p (symtab_node *target);
329 /* Return true when there is a reference to node and it is not vtable. */
330 bool address_taken_from_non_vtable_p (void);
332 /* Return true if symbol is known to be nonzero. */
333 bool nonzero_address ();
335 /* Return 0 if symbol is known to have different address than S2,
336 Return 1 if symbol is known to have same address as S2,
337 return 2 otherwise. */
338 int equal_address_to (symtab_node *s2);
340 /* Return symbol table node associated with DECL, if any,
341 and NULL otherwise. */
342 static inline symtab_node *get (const_tree decl)
344 #ifdef ENABLE_CHECKING
345 /* Check that we are called for sane type of object - functions
346 and static or external variables. */
347 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL
348 || (TREE_CODE (decl) == VAR_DECL
349 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
350 || in_lto_p)));
351 /* Check that the mapping is sane - perhaps this check can go away,
352 but at the moment frontends tends to corrupt the mapping by calling
353 memcpy/memset on the tree nodes. */
354 gcc_checking_assert (!decl->decl_with_vis.symtab_node
355 || decl->decl_with_vis.symtab_node->decl == decl);
356 #endif
357 return decl->decl_with_vis.symtab_node;
360 /* Try to find a symtab node for declaration DECL and if it does not
361 exist or if it corresponds to an inline clone, create a new one. */
362 static inline symtab_node * get_create (tree node);
364 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
365 Return NULL if there's no such node. */
366 static symtab_node *get_for_asmname (const_tree asmname);
368 /* Dump symbol table to F. */
369 static void dump_table (FILE *);
371 /* Dump symbol table to stderr. */
372 static inline DEBUG_FUNCTION void debug_symtab (void)
374 dump_table (stderr);
377 /* Verify symbol table for internal consistency. */
378 static DEBUG_FUNCTION void verify_symtab_nodes (void);
380 /* Type of the symbol. */
381 ENUM_BITFIELD (symtab_type) type : 8;
383 /* The symbols resolution. */
384 ENUM_BITFIELD (ld_plugin_symbol_resolution) resolution : 8;
386 /*** Flags representing the symbol type. ***/
388 /* True when symbol corresponds to a definition in current unit.
389 set via finalize_function or finalize_decl */
390 unsigned definition : 1;
391 /* True when symbol is an alias.
392 Set by ssemble_alias. */
393 unsigned alias : 1;
394 /* True when alias is a weakref. */
395 unsigned weakref : 1;
396 /* C++ frontend produce same body aliases and extra name aliases for
397 virtual functions and vtables that are obviously equivalent.
398 Those aliases are bit special, especially because C++ frontend
399 visibility code is so ugly it can not get them right at first time
400 and their visibility needs to be copied from their "masters" at
401 the end of parsing. */
402 unsigned cpp_implicit_alias : 1;
403 /* Set once the definition was analyzed. The list of references and
404 other properties are built during analysis. */
405 unsigned analyzed : 1;
406 /* Set for write-only variables. */
407 unsigned writeonly : 1;
408 /* Visibility of symbol was used for further optimization; do not
409 permit further changes. */
410 unsigned refuse_visibility_changes : 1;
412 /*** Visibility and linkage flags. ***/
414 /* Set when function is visible by other units. */
415 unsigned externally_visible : 1;
416 /* Don't reorder to other symbols having this set. */
417 unsigned no_reorder : 1;
418 /* The symbol will be assumed to be used in an invisible way (like
419 by an toplevel asm statement). */
420 unsigned force_output : 1;
421 /* Like FORCE_OUTPUT, but in the case it is ABI requiring the symbol to be
422 exported. Unlike FORCE_OUTPUT this flag gets cleared to symbols promoted
423 to static and it does not inhibit optimization. */
424 unsigned forced_by_abi : 1;
425 /* True when the name is known to be unique and thus it does not need mangling. */
426 unsigned unique_name : 1;
427 /* Specify whether the section was set by user or by
428 compiler via -ffunction-sections. */
429 unsigned implicit_section : 1;
430 /* True when body and other characteristics have been removed by
431 symtab_remove_unreachable_nodes. */
432 unsigned body_removed : 1;
434 /*** WHOPR Partitioning flags.
435 These flags are used at ltrans stage when only part of the callgraph is
436 available. ***/
438 /* Set when variable is used from other LTRANS partition. */
439 unsigned used_from_other_partition : 1;
440 /* Set when function is available in the other LTRANS partition.
441 During WPA output it is used to mark nodes that are present in
442 multiple partitions. */
443 unsigned in_other_partition : 1;
447 /*** other flags. ***/
449 /* Set when symbol has address taken. */
450 unsigned address_taken : 1;
451 /* Set when init priority is set. */
452 unsigned in_init_priority_hash : 1;
454 /* Set when symbol needs to be streamed into LTO bytecode for LTO, or in case
455 of offloading, for separate compilation for a different target. */
456 unsigned need_lto_streaming : 1;
458 /* Set when symbol can be streamed into bytecode for offloading. */
459 unsigned offloadable : 1;
462 /* Ordering of all symtab entries. */
463 int order;
465 /* Declaration representing the symbol. */
466 tree decl;
468 /* Linked list of symbol table entries starting with symtab_nodes. */
469 symtab_node *next;
470 symtab_node *previous;
472 /* Linked list of symbols with the same asm name. There may be multiple
473 entries for single symbol name during LTO, because symbols are renamed
474 only after partitioning.
476 Because inline clones are kept in the assembler name has, they also produce
477 duplicate entries.
479 There are also several long standing bugs where frontends and builtin
480 code produce duplicated decls. */
481 symtab_node *next_sharing_asm_name;
482 symtab_node *previous_sharing_asm_name;
484 /* Circular list of nodes in the same comdat group if non-NULL. */
485 symtab_node *same_comdat_group;
487 /* Vectors of referring and referenced entities. */
488 ipa_ref_list ref_list;
490 /* Alias target. May be either DECL pointer or ASSEMBLER_NAME pointer
491 depending to what was known to frontend on the creation time.
492 Once alias is resolved, this pointer become NULL. */
493 tree alias_target;
495 /* File stream where this node is being written to. */
496 struct lto_file_decl_data * lto_file_data;
498 PTR GTY ((skip)) aux;
500 /* Comdat group the symbol is in. Can be private if GGC allowed that. */
501 tree x_comdat_group;
503 /* Section name. Again can be private, if allowed. */
504 section_hash_entry *x_section;
506 protected:
507 /* Dump base fields of symtab nodes to F. Not to be used directly. */
508 void dump_base (FILE *);
510 /* Verify common part of symtab node. */
511 bool DEBUG_FUNCTION verify_base (void);
513 /* Remove node from symbol table. This function is not used directly, but via
514 cgraph/varpool node removal routines. */
515 void unregister (void);
517 /* Return the initialization and finalization priority information for
518 DECL. If there is no previous priority information, a freshly
519 allocated structure is returned. */
520 struct symbol_priority_map *priority_info (void);
522 /* Worker for call_for_symbol_and_aliases_1. */
523 bool call_for_symbol_and_aliases_1 (bool (*callback) (symtab_node *, void *),
524 void *data,
525 bool include_overwrite);
526 private:
527 /* Worker for set_section. */
528 static bool set_section (symtab_node *n, void *s);
530 /* Worker for symtab_resolve_alias. */
531 static bool set_implicit_section (symtab_node *n, void *);
533 /* Worker searching noninterposable alias. */
534 static bool noninterposable_alias (symtab_node *node, void *data);
536 /* Worker for ultimate_alias_target. */
537 symtab_node *ultimate_alias_target_1 (enum availability *avail = NULL);
540 /* Walk all aliases for NODE. */
541 #define FOR_EACH_ALIAS(node, alias) \
542 for (unsigned x_i = 0; node->iterate_direct_aliases (x_i, alias); x_i++)
544 /* This is the information that is put into the cgraph local structure
545 to recover a function. */
546 struct lto_file_decl_data;
548 extern const char * const cgraph_availability_names[];
549 extern const char * const ld_plugin_symbol_resolution_names[];
550 extern const char * const tls_model_names[];
552 /* Information about thunk, used only for same body aliases. */
554 struct GTY(()) cgraph_thunk_info {
555 /* Information about the thunk. */
556 HOST_WIDE_INT fixed_offset;
557 HOST_WIDE_INT virtual_value;
558 tree alias;
559 bool this_adjusting;
560 bool virtual_offset_p;
561 bool add_pointer_bounds_args;
562 /* Set to true when alias node is thunk. */
563 bool thunk_p;
566 /* Information about the function collected locally.
567 Available after function is analyzed. */
569 struct GTY(()) cgraph_local_info {
570 /* Set when function function is visible in current compilation unit only
571 and its address is never taken. */
572 unsigned local : 1;
574 /* False when there is something makes versioning impossible. */
575 unsigned versionable : 1;
577 /* False when function calling convention and signature can not be changed.
578 This is the case when __builtin_apply_args is used. */
579 unsigned can_change_signature : 1;
581 /* True when the function has been originally extern inline, but it is
582 redefined now. */
583 unsigned redefined_extern_inline : 1;
585 /* True if the function may enter serial irrevocable mode. */
586 unsigned tm_may_enter_irr : 1;
589 /* Information about the function that needs to be computed globally
590 once compilation is finished. Available only with -funit-at-a-time. */
592 struct GTY(()) cgraph_global_info {
593 /* For inline clones this points to the function they will be
594 inlined into. */
595 cgraph_node *inlined_to;
598 /* Information about the function that is propagated by the RTL backend.
599 Available only for functions that has been already assembled. */
601 struct GTY(()) cgraph_rtl_info {
602 unsigned int preferred_incoming_stack_boundary;
604 /* Call unsaved hard registers really used by the corresponding
605 function (including ones used by functions called by the
606 function). */
607 HARD_REG_SET function_used_regs;
608 /* Set if function_used_regs is valid. */
609 unsigned function_used_regs_valid: 1;
612 /* Represent which DECL tree (or reference to such tree)
613 will be replaced by another tree while versioning. */
614 struct GTY(()) ipa_replace_map
616 /* The tree that will be replaced. */
617 tree old_tree;
618 /* The new (replacing) tree. */
619 tree new_tree;
620 /* Parameter number to replace, when old_tree is NULL. */
621 int parm_num;
622 /* True when a substitution should be done, false otherwise. */
623 bool replace_p;
624 /* True when we replace a reference to old_tree. */
625 bool ref_p;
628 struct GTY(()) cgraph_clone_info
630 vec<ipa_replace_map *, va_gc> *tree_map;
631 bitmap args_to_skip;
632 bitmap combined_args_to_skip;
635 enum cgraph_simd_clone_arg_type
637 SIMD_CLONE_ARG_TYPE_VECTOR,
638 SIMD_CLONE_ARG_TYPE_UNIFORM,
639 SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP,
640 SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP,
641 SIMD_CLONE_ARG_TYPE_MASK
644 /* Function arguments in the original function of a SIMD clone.
645 Supplementary data for `struct simd_clone'. */
647 struct GTY(()) cgraph_simd_clone_arg {
648 /* Original function argument as it originally existed in
649 DECL_ARGUMENTS. */
650 tree orig_arg;
652 /* orig_arg's function (or for extern functions type from
653 TYPE_ARG_TYPES). */
654 tree orig_type;
656 /* If argument is a vector, this holds the vector version of
657 orig_arg that after adjusting the argument types will live in
658 DECL_ARGUMENTS. Otherwise, this is NULL.
660 This basically holds:
661 vector(simdlen) __typeof__(orig_arg) new_arg. */
662 tree vector_arg;
664 /* vector_arg's type (or for extern functions new vector type. */
665 tree vector_type;
667 /* If argument is a vector, this holds the array where the simd
668 argument is held while executing the simd clone function. This
669 is a local variable in the cloned function. Its content is
670 copied from vector_arg upon entry to the clone.
672 This basically holds:
673 __typeof__(orig_arg) simd_array[simdlen]. */
674 tree simd_array;
676 /* A SIMD clone's argument can be either linear (constant or
677 variable), uniform, or vector. */
678 enum cgraph_simd_clone_arg_type arg_type;
680 /* For arg_type SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP this is
681 the constant linear step, if arg_type is
682 SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP, this is index of
683 the uniform argument holding the step, otherwise 0. */
684 HOST_WIDE_INT linear_step;
686 /* Variable alignment if available, otherwise 0. */
687 unsigned int alignment;
690 /* Specific data for a SIMD function clone. */
692 struct GTY(()) cgraph_simd_clone {
693 /* Number of words in the SIMD lane associated with this clone. */
694 unsigned int simdlen;
696 /* Number of annotated function arguments in `args'. This is
697 usually the number of named arguments in FNDECL. */
698 unsigned int nargs;
700 /* Max hardware vector size in bits for integral vectors. */
701 unsigned int vecsize_int;
703 /* Max hardware vector size in bits for floating point vectors. */
704 unsigned int vecsize_float;
706 /* The mangling character for a given vector size. This is is used
707 to determine the ISA mangling bit as specified in the Intel
708 Vector ABI. */
709 unsigned char vecsize_mangle;
711 /* True if this is the masked, in-branch version of the clone,
712 otherwise false. */
713 unsigned int inbranch : 1;
715 /* True if this is a Cilk Plus variant. */
716 unsigned int cilk_elemental : 1;
718 /* Doubly linked list of SIMD clones. */
719 cgraph_node *prev_clone, *next_clone;
721 /* Original cgraph node the SIMD clones were created for. */
722 cgraph_node *origin;
724 /* Annotated function arguments for the original function. */
725 cgraph_simd_clone_arg GTY((length ("%h.nargs"))) args[1];
728 /* Function Multiversioning info. */
729 struct GTY((for_user)) cgraph_function_version_info {
730 /* The cgraph_node for which the function version info is stored. */
731 cgraph_node *this_node;
732 /* Chains all the semantically identical function versions. The
733 first function in this chain is the version_info node of the
734 default function. */
735 cgraph_function_version_info *prev;
736 /* If this version node corresponds to a dispatcher for function
737 versions, this points to the version info node of the default
738 function, the first node in the chain. */
739 cgraph_function_version_info *next;
740 /* If this node corresponds to a function version, this points
741 to the dispatcher function decl, which is the function that must
742 be called to execute the right function version at run-time.
744 If this cgraph node is a dispatcher (if dispatcher_function is
745 true, in the cgraph_node struct) for function versions, this
746 points to resolver function, which holds the function body of the
747 dispatcher. The dispatcher decl is an alias to the resolver
748 function decl. */
749 tree dispatcher_resolver;
752 #define DEFCIFCODE(code, type, string) CIF_ ## code,
753 /* Reasons for inlining failures. */
755 enum cgraph_inline_failed_t {
756 #include "cif-code.def"
757 CIF_N_REASONS
760 enum cgraph_inline_failed_type_t
762 CIF_FINAL_NORMAL = 0,
763 CIF_FINAL_ERROR
766 struct cgraph_edge;
768 struct cgraph_edge_hasher : ggc_hasher<cgraph_edge *>
770 typedef gimple compare_type;
772 static hashval_t hash (cgraph_edge *);
773 static bool equal (cgraph_edge *, gimple);
776 /* The cgraph data structure.
777 Each function decl has assigned cgraph_node listing callees and callers. */
779 struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node {
780 public:
781 /* Remove the node from cgraph and all inline clones inlined into it.
782 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
783 removed. This allows to call the function from outer loop walking clone
784 tree. */
785 bool remove_symbol_and_inline_clones (cgraph_node *forbidden_node = NULL);
787 /* Record all references from cgraph_node that are taken
788 in statement STMT. */
789 void record_stmt_references (gimple stmt);
791 /* Like cgraph_set_call_stmt but walk the clone tree and update all
792 clones sharing the same function body.
793 When WHOLE_SPECULATIVE_EDGES is true, all three components of
794 speculative edge gets updated. Otherwise we update only direct
795 call. */
796 void set_call_stmt_including_clones (gimple old_stmt, gcall *new_stmt,
797 bool update_speculative = true);
799 /* Walk the alias chain to return the function cgraph_node is alias of.
800 Walk through thunk, too.
801 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
802 cgraph_node *function_symbol (enum availability *avail = NULL);
804 /* Walk the alias chain to return the function cgraph_node is alias of.
805 Walk through non virtual thunks, too. Thus we return either a function
806 or a virtual thunk node.
807 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
808 cgraph_node *function_or_virtual_thunk_symbol
809 (enum availability *avail = NULL);
811 /* Create node representing clone of N executed COUNT times. Decrease
812 the execution counts from original node too.
813 The new clone will have decl set to DECL that may or may not be the same
814 as decl of N.
816 When UPDATE_ORIGINAL is true, the counts are subtracted from the original
817 function's profile to reflect the fact that part of execution is handled
818 by node.
819 When CALL_DUPLICATOIN_HOOK is true, the ipa passes are acknowledged about
820 the new clone. Otherwise the caller is responsible for doing so later.
822 If the new node is being inlined into another one, NEW_INLINED_TO should be
823 the outline function the new one is (even indirectly) inlined to.
824 All hooks will see this in node's global.inlined_to, when invoked.
825 Can be NULL if the node is not inlined. */
826 cgraph_node *create_clone (tree decl, gcov_type count, int freq,
827 bool update_original,
828 vec<cgraph_edge *> redirect_callers,
829 bool call_duplication_hook,
830 cgraph_node *new_inlined_to,
831 bitmap args_to_skip);
833 /* Create callgraph node clone with new declaration. The actual body will
834 be copied later at compilation stage. */
835 cgraph_node *create_virtual_clone (vec<cgraph_edge *> redirect_callers,
836 vec<ipa_replace_map *, va_gc> *tree_map,
837 bitmap args_to_skip, const char * suffix);
839 /* cgraph node being removed from symbol table; see if its entry can be
840 replaced by other inline clone. */
841 cgraph_node *find_replacement (void);
843 /* Create a new cgraph node which is the new version of
844 callgraph node. REDIRECT_CALLERS holds the callers
845 edges which should be redirected to point to
846 NEW_VERSION. ALL the callees edges of the node
847 are cloned to the new version node. Return the new
848 version node.
850 If non-NULL BLOCK_TO_COPY determine what basic blocks
851 was copied to prevent duplications of calls that are dead
852 in the clone. */
854 cgraph_node *create_version_clone (tree new_decl,
855 vec<cgraph_edge *> redirect_callers,
856 bitmap bbs_to_copy);
858 /* Perform function versioning.
859 Function versioning includes copying of the tree and
860 a callgraph update (creating a new cgraph node and updating
861 its callees and callers).
863 REDIRECT_CALLERS varray includes the edges to be redirected
864 to the new version.
866 TREE_MAP is a mapping of tree nodes we want to replace with
867 new ones (according to results of prior analysis).
869 If non-NULL ARGS_TO_SKIP determine function parameters to remove
870 from new version.
871 If SKIP_RETURN is true, the new version will return void.
872 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
873 If non_NULL NEW_ENTRY determine new entry BB of the clone.
875 Return the new version's cgraph node. */
876 cgraph_node *create_version_clone_with_body
877 (vec<cgraph_edge *> redirect_callers,
878 vec<ipa_replace_map *, va_gc> *tree_map, bitmap args_to_skip,
879 bool skip_return, bitmap bbs_to_copy, basic_block new_entry_block,
880 const char *clone_name);
882 /* Insert a new cgraph_function_version_info node into cgraph_fnver_htab
883 corresponding to cgraph_node. */
884 cgraph_function_version_info *insert_new_function_version (void);
886 /* Get the cgraph_function_version_info node corresponding to node. */
887 cgraph_function_version_info *function_version (void);
889 /* Discover all functions and variables that are trivially needed, analyze
890 them as well as all functions and variables referred by them */
891 void analyze (void);
893 /* Add thunk alias into callgraph. The alias declaration is ALIAS and it
894 aliases DECL with an adjustments made into the first parameter.
895 See comments in thunk_adjust for detail on the parameters. */
896 cgraph_node * create_thunk (tree alias, tree, bool this_adjusting,
897 HOST_WIDE_INT fixed_offset,
898 HOST_WIDE_INT virtual_value,
899 tree virtual_offset,
900 tree real_alias);
903 /* Return node that alias is aliasing. */
904 inline cgraph_node *get_alias_target (void);
906 /* Given function symbol, walk the alias chain to return the function node
907 is alias of. Do not walk through thunks.
908 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
910 cgraph_node *ultimate_alias_target (availability *availability = NULL);
912 /* Expand thunk NODE to gimple if possible.
913 When FORCE_GIMPLE_THUNK is true, gimple thunk is created and
914 no assembler is produced.
915 When OUTPUT_ASM_THUNK is true, also produce assembler for
916 thunks that are not lowered. */
917 bool expand_thunk (bool output_asm_thunks, bool force_gimple_thunk);
919 /* Call expand_thunk on all callers that are thunks and analyze those
920 nodes that were expanded. */
921 void expand_all_artificial_thunks ();
923 /* Assemble thunks and aliases associated to node. */
924 void assemble_thunks_and_aliases (void);
926 /* Expand function specified by node. */
927 void expand (void);
929 /* As an GCC extension we allow redefinition of the function. The
930 semantics when both copies of bodies differ is not well defined.
931 We replace the old body with new body so in unit at a time mode
932 we always use new body, while in normal mode we may end up with
933 old body inlined into some functions and new body expanded and
934 inlined in others. */
935 void reset (void);
937 /* Creates a wrapper from cgraph_node to TARGET node. Thunk is used for this
938 kind of wrapper method. */
939 void create_wrapper (cgraph_node *target);
941 /* Verify cgraph nodes of the cgraph node. */
942 void DEBUG_FUNCTION verify_node (void);
944 /* Remove function from symbol table. */
945 void remove (void);
947 /* Dump call graph node to file F. */
948 void dump (FILE *f);
950 /* Dump call graph node to stderr. */
951 void DEBUG_FUNCTION debug (void);
953 /* When doing LTO, read cgraph_node's body from disk if it is not already
954 present. */
955 bool get_untransformed_body (void);
957 /* Prepare function body. When doing LTO, read cgraph_node's body from disk
958 if it is not already present. When some IPA transformations are scheduled,
959 apply them. */
960 bool get_body (void);
962 /* Release memory used to represent body of function.
963 Use this only for functions that are released before being translated to
964 target code (i.e. RTL). Functions that are compiled to RTL and beyond
965 are free'd in final.c via free_after_compilation(). */
966 void release_body (bool keep_arguments = false);
968 /* Return the DECL_STRUCT_FUNCTION of the function. */
969 struct function *get_fun (void);
971 /* cgraph_node is no longer nested function; update cgraph accordingly. */
972 void unnest (void);
974 /* Bring cgraph node local. */
975 void make_local (void);
977 /* Likewise indicate that a node is having address taken. */
978 void mark_address_taken (void);
980 /* Set fialization priority to PRIORITY. */
981 void set_fini_priority (priority_type priority);
983 /* Return the finalization priority. */
984 priority_type get_fini_priority (void);
986 /* Create edge from a given function to CALLEE in the cgraph. */
987 cgraph_edge *create_edge (cgraph_node *callee,
988 gcall *call_stmt, gcov_type count,
989 int freq);
991 /* Create an indirect edge with a yet-undetermined callee where the call
992 statement destination is a formal parameter of the caller with index
993 PARAM_INDEX. */
994 cgraph_edge *create_indirect_edge (gcall *call_stmt, int ecf_flags,
995 gcov_type count, int freq,
996 bool compute_indirect_info = true);
998 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
999 same function body. If clones already have edge for OLD_STMT; only
1000 update the edge same way as cgraph_set_call_stmt_including_clones does. */
1001 void create_edge_including_clones (cgraph_node *callee,
1002 gimple old_stmt, gcall *stmt,
1003 gcov_type count,
1004 int freq,
1005 cgraph_inline_failed_t reason);
1007 /* Return the callgraph edge representing the GIMPLE_CALL statement
1008 CALL_STMT. */
1009 cgraph_edge *get_edge (gimple call_stmt);
1011 /* Collect all callers of cgraph_node and its aliases that are known to lead
1012 to NODE (i.e. are not overwritable). */
1013 vec<cgraph_edge *> collect_callers (void);
1015 /* Remove all callers from the node. */
1016 void remove_callers (void);
1018 /* Remove all callees from the node. */
1019 void remove_callees (void);
1021 /* Return function availability. See cgraph.h for description of individual
1022 return values. */
1023 enum availability get_availability (void);
1025 /* Set TREE_NOTHROW on cgraph_node's decl and on aliases of the node
1026 if any to NOTHROW. */
1027 void set_nothrow_flag (bool nothrow);
1029 /* Set TREE_READONLY on cgraph_node's decl and on aliases of the node
1030 if any to READONLY. */
1031 void set_const_flag (bool readonly, bool looping);
1033 /* Set DECL_PURE_P on cgraph_node's decl and on aliases of the node
1034 if any to PURE. */
1035 void set_pure_flag (bool pure, bool looping);
1037 /* Call callback on function and aliases associated to the function.
1038 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
1039 skipped. */
1041 bool call_for_symbol_and_aliases (bool (*callback) (cgraph_node *,
1042 void *),
1043 void *data, bool include_overwritable);
1045 /* Call callback on cgraph_node, thunks and aliases associated to NODE.
1046 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
1047 skipped. When EXCLUDE_VIRTUAL_THUNKS is true, virtual thunks are
1048 skipped. */
1049 bool call_for_symbol_thunks_and_aliases (bool (*callback) (cgraph_node *node,
1050 void *data),
1051 void *data,
1052 bool include_overwritable,
1053 bool exclude_virtual_thunks = false);
1055 /* Likewise indicate that a node is needed, i.e. reachable via some
1056 external means. */
1057 inline void mark_force_output (void);
1059 /* Return true when function can be marked local. */
1060 bool local_p (void);
1062 /* Return true if cgraph_node can be made local for API change.
1063 Extern inline functions and C++ COMDAT functions can be made local
1064 at the expense of possible code size growth if function is used in multiple
1065 compilation units. */
1066 bool can_be_local_p (void);
1068 /* Return true when cgraph_node can not return or throw and thus
1069 it is safe to ignore its side effects for IPA analysis. */
1070 bool cannot_return_p (void);
1072 /* Return true when function cgraph_node and all its aliases are only called
1073 directly.
1074 i.e. it is not externally visible, address was not taken and
1075 it is not used in any other non-standard way. */
1076 bool only_called_directly_p (void);
1078 /* Return true when function is only called directly or it has alias.
1079 i.e. it is not externally visible, address was not taken and
1080 it is not used in any other non-standard way. */
1081 inline bool only_called_directly_or_aliased_p (void);
1083 /* Return true when function cgraph_node can be expected to be removed
1084 from program when direct calls in this compilation unit are removed.
1086 As a special case COMDAT functions are
1087 cgraph_can_remove_if_no_direct_calls_p while the are not
1088 cgraph_only_called_directly_p (it is possible they are called from other
1089 unit)
1091 This function behaves as cgraph_only_called_directly_p because eliminating
1092 all uses of COMDAT function does not make it necessarily disappear from
1093 the program unless we are compiling whole program or we do LTO. In this
1094 case we know we win since dynamic linking will not really discard the
1095 linkonce section. */
1096 bool will_be_removed_from_program_if_no_direct_calls_p (void);
1098 /* Return true when function can be removed from callgraph
1099 if all direct calls are eliminated. */
1100 bool can_remove_if_no_direct_calls_and_refs_p (void);
1102 /* Return true when function cgraph_node and its aliases can be removed from
1103 callgraph if all direct calls are eliminated. */
1104 bool can_remove_if_no_direct_calls_p (void);
1106 /* Return true when callgraph node is a function with Gimple body defined
1107 in current unit. Functions can also be define externally or they
1108 can be thunks with no Gimple representation.
1110 Note that at WPA stage, the function body may not be present in memory. */
1111 inline bool has_gimple_body_p (void);
1113 /* Return true if function should be optimized for size. */
1114 bool optimize_for_size_p (void);
1116 /* Dump the callgraph to file F. */
1117 static void dump_cgraph (FILE *f);
1119 /* Dump the call graph to stderr. */
1120 static inline
1121 void debug_cgraph (void)
1123 dump_cgraph (stderr);
1126 /* Record that DECL1 and DECL2 are semantically identical function
1127 versions. */
1128 static void record_function_versions (tree decl1, tree decl2);
1130 /* Remove the cgraph_function_version_info and cgraph_node for DECL. This
1131 DECL is a duplicate declaration. */
1132 static void delete_function_version (tree decl);
1134 /* Add the function FNDECL to the call graph.
1135 Unlike finalize_function, this function is intended to be used
1136 by middle end and allows insertion of new function at arbitrary point
1137 of compilation. The function can be either in high, low or SSA form
1138 GIMPLE.
1140 The function is assumed to be reachable and have address taken (so no
1141 API breaking optimizations are performed on it).
1143 Main work done by this function is to enqueue the function for later
1144 processing to avoid need the passes to be re-entrant. */
1145 static void add_new_function (tree fndecl, bool lowered);
1147 /* Return callgraph node for given symbol and check it is a function. */
1148 static inline cgraph_node *get (const_tree decl)
1150 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL);
1151 return dyn_cast <cgraph_node *> (symtab_node::get (decl));
1154 /* DECL has been parsed. Take it, queue it, compile it at the whim of the
1155 logic in effect. If NO_COLLECT is true, then our caller cannot stand to
1156 have the garbage collector run at the moment. We would need to either
1157 create a new GC context, or just not compile right now. */
1158 static void finalize_function (tree, bool);
1160 /* Return cgraph node assigned to DECL. Create new one when needed. */
1161 static cgraph_node * create (tree decl);
1163 /* Try to find a call graph node for declaration DECL and if it does not
1164 exist or if it corresponds to an inline clone, create a new one. */
1165 static cgraph_node * get_create (tree);
1167 /* Return local info for the compiled function. */
1168 static cgraph_local_info *local_info (tree decl);
1170 /* Return local info for the compiled function. */
1171 static cgraph_rtl_info *rtl_info (tree);
1173 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
1174 Return NULL if there's no such node. */
1175 static cgraph_node *get_for_asmname (tree asmname);
1177 /* Attempt to mark ALIAS as an alias to DECL. Return alias node if
1178 successful and NULL otherwise.
1179 Same body aliases are output whenever the body of DECL is output,
1180 and cgraph_node::get (ALIAS) transparently
1181 returns cgraph_node::get (DECL). */
1182 static cgraph_node * create_same_body_alias (tree alias, tree decl);
1184 /* Worker for cgraph_can_remove_if_no_direct_calls_p. */
1185 static bool used_from_object_file_p_worker (cgraph_node *node, void *)
1187 return node->used_from_object_file_p ();
1190 /* Verify whole cgraph structure. */
1191 static void DEBUG_FUNCTION verify_cgraph_nodes (void);
1193 /* Worker to bring NODE local. */
1194 static bool make_local (cgraph_node *node, void *);
1196 /* Mark ALIAS as an alias to DECL. DECL_NODE is cgraph node representing
1197 the function body is associated
1198 with (not necessarily cgraph_node (DECL). */
1199 static cgraph_node *create_alias (tree alias, tree target);
1201 cgraph_edge *callees;
1202 cgraph_edge *callers;
1203 /* List of edges representing indirect calls with a yet undetermined
1204 callee. */
1205 cgraph_edge *indirect_calls;
1206 /* For nested functions points to function the node is nested in. */
1207 cgraph_node *origin;
1208 /* Points to first nested function, if any. */
1209 cgraph_node *nested;
1210 /* Pointer to the next function with same origin, if any. */
1211 cgraph_node *next_nested;
1212 /* Pointer to the next clone. */
1213 cgraph_node *next_sibling_clone;
1214 cgraph_node *prev_sibling_clone;
1215 cgraph_node *clones;
1216 cgraph_node *clone_of;
1217 /* If instrumentation_clone is 1 then instrumented_version points
1218 to the original function used to make instrumented version.
1219 Otherwise points to instrumented version of the function. */
1220 cgraph_node *instrumented_version;
1221 /* If instrumentation_clone is 1 then orig_decl is the original
1222 function declaration. */
1223 tree orig_decl;
1224 /* For functions with many calls sites it holds map from call expression
1225 to the edge to speed up cgraph_edge function. */
1226 hash_table<cgraph_edge_hasher> *GTY(()) call_site_hash;
1227 /* Declaration node used to be clone of. */
1228 tree former_clone_of;
1230 /* If this is a SIMD clone, this points to the SIMD specific
1231 information for it. */
1232 cgraph_simd_clone *simdclone;
1233 /* If this function has SIMD clones, this points to the first clone. */
1234 cgraph_node *simd_clones;
1236 /* Interprocedural passes scheduled to have their transform functions
1237 applied next time we execute local pass on them. We maintain it
1238 per-function in order to allow IPA passes to introduce new functions. */
1239 vec<ipa_opt_pass> GTY((skip)) ipa_transforms_to_apply;
1241 cgraph_local_info local;
1242 cgraph_global_info global;
1243 cgraph_rtl_info rtl;
1244 cgraph_clone_info clone;
1245 cgraph_thunk_info thunk;
1247 /* Expected number of executions: calculated in profile.c. */
1248 gcov_type count;
1249 /* How to scale counts at materialization time; used to merge
1250 LTO units with different number of profile runs. */
1251 int count_materialization_scale;
1252 /* Unique id of the node. */
1253 int uid;
1254 /* Summary unique id of the node. */
1255 int summary_uid;
1256 /* ID assigned by the profiling. */
1257 unsigned int profile_id;
1258 /* Time profiler: first run of function. */
1259 int tp_first_run;
1261 /* Set when decl is an abstract function pointed to by the
1262 ABSTRACT_DECL_ORIGIN of a reachable function. */
1263 unsigned used_as_abstract_origin : 1;
1264 /* Set once the function is lowered (i.e. its CFG is built). */
1265 unsigned lowered : 1;
1266 /* Set once the function has been instantiated and its callee
1267 lists created. */
1268 unsigned process : 1;
1269 /* How commonly executed the node is. Initialized during branch
1270 probabilities pass. */
1271 ENUM_BITFIELD (node_frequency) frequency : 2;
1272 /* True when function can only be called at startup (from static ctor). */
1273 unsigned only_called_at_startup : 1;
1274 /* True when function can only be called at startup (from static dtor). */
1275 unsigned only_called_at_exit : 1;
1276 /* True when function is the transactional clone of a function which
1277 is called only from inside transactions. */
1278 /* ?? We should be able to remove this. We have enough bits in
1279 cgraph to calculate it. */
1280 unsigned tm_clone : 1;
1281 /* True if this decl is a dispatcher for function versions. */
1282 unsigned dispatcher_function : 1;
1283 /* True if this decl calls a COMDAT-local function. This is set up in
1284 compute_inline_parameters and inline_call. */
1285 unsigned calls_comdat_local : 1;
1286 /* True if node has been created by merge operation in IPA-ICF. */
1287 unsigned icf_merged: 1;
1288 /* True when function is clone created for Pointer Bounds Checker
1289 instrumentation. */
1290 unsigned instrumentation_clone : 1;
1291 /* True if call to node can't result in a call to free, munmap or
1292 other operation that could make previously non-trapping memory
1293 accesses trapping. */
1294 unsigned nonfreeing_fn : 1;
1295 /* True if there was multiple COMDAT bodies merged by lto-symtab. */
1296 unsigned merged : 1;
1298 private:
1299 /* Worker for call_for_symbol_and_aliases. */
1300 bool call_for_symbol_and_aliases_1 (bool (*callback) (cgraph_node *,
1301 void *),
1302 void *data, bool include_overwritable);
1305 /* A cgraph node set is a collection of cgraph nodes. A cgraph node
1306 can appear in multiple sets. */
1307 struct cgraph_node_set_def
1309 hash_map<cgraph_node *, size_t> *map;
1310 vec<cgraph_node *> nodes;
1313 typedef cgraph_node_set_def *cgraph_node_set;
1314 typedef struct varpool_node_set_def *varpool_node_set;
1316 class varpool_node;
1318 /* A varpool node set is a collection of varpool nodes. A varpool node
1319 can appear in multiple sets. */
1320 struct varpool_node_set_def
1322 hash_map<varpool_node *, size_t> * map;
1323 vec<varpool_node *> nodes;
1326 /* Iterator structure for cgraph node sets. */
1327 struct cgraph_node_set_iterator
1329 cgraph_node_set set;
1330 unsigned index;
1333 /* Iterator structure for varpool node sets. */
1334 struct varpool_node_set_iterator
1336 varpool_node_set set;
1337 unsigned index;
1340 /* Context of polymorphic call. It represent information about the type of
1341 instance that may reach the call. This is used by ipa-devirt walkers of the
1342 type inheritance graph. */
1344 class GTY(()) ipa_polymorphic_call_context {
1345 public:
1346 /* The called object appears in an object of type OUTER_TYPE
1347 at offset OFFSET. When information is not 100% reliable, we
1348 use SPECULATIVE_OUTER_TYPE and SPECULATIVE_OFFSET. */
1349 HOST_WIDE_INT offset;
1350 HOST_WIDE_INT speculative_offset;
1351 tree outer_type;
1352 tree speculative_outer_type;
1353 /* True if outer object may be in construction or destruction. */
1354 unsigned maybe_in_construction : 1;
1355 /* True if outer object may be of derived type. */
1356 unsigned maybe_derived_type : 1;
1357 /* True if speculative outer object may be of derived type. We always
1358 speculate that construction does not happen. */
1359 unsigned speculative_maybe_derived_type : 1;
1360 /* True if the context is invalid and all calls should be redirected
1361 to BUILTIN_UNREACHABLE. */
1362 unsigned invalid : 1;
1363 /* True if the outer type is dynamic. */
1364 unsigned dynamic : 1;
1366 /* Build empty "I know nothing" context. */
1367 ipa_polymorphic_call_context ();
1368 /* Build polymorphic call context for indirect call E. */
1369 ipa_polymorphic_call_context (cgraph_edge *e);
1370 /* Build polymorphic call context for IP invariant CST.
1371 If specified, OTR_TYPE specify the type of polymorphic call
1372 that takes CST+OFFSET as a prameter. */
1373 ipa_polymorphic_call_context (tree cst, tree otr_type = NULL,
1374 HOST_WIDE_INT offset = 0);
1375 /* Build context for pointer REF contained in FNDECL at statement STMT.
1376 if INSTANCE is non-NULL, return pointer to the object described by
1377 the context. */
1378 ipa_polymorphic_call_context (tree fndecl, tree ref, gimple stmt,
1379 tree *instance = NULL);
1381 /* Look for vtable stores or constructor calls to work out dynamic type
1382 of memory location. */
1383 bool get_dynamic_type (tree, tree, tree, gimple);
1385 /* Make context non-speculative. */
1386 void clear_speculation ();
1388 /* Produce context specifying all derrived types of OTR_TYPE. If OTR_TYPE is
1389 NULL, the context is set to dummy "I know nothing" setting. */
1390 void clear_outer_type (tree otr_type = NULL);
1392 /* Walk container types and modify context to point to actual class
1393 containing OTR_TYPE (if non-NULL) as base class.
1394 Return true if resulting context is valid.
1396 When CONSIDER_PLACEMENT_NEW is false, reject contexts that may be made
1397 valid only via alocation of new polymorphic type inside by means
1398 of placement new.
1400 When CONSIDER_BASES is false, only look for actual fields, not base types
1401 of TYPE. */
1402 bool restrict_to_inner_class (tree otr_type,
1403 bool consider_placement_new = true,
1404 bool consider_bases = true);
1406 /* Adjust all offsets in contexts by given number of bits. */
1407 void offset_by (HOST_WIDE_INT);
1408 /* Use when we can not track dynamic type change. This speculatively assume
1409 type change is not happening. */
1410 void possible_dynamic_type_change (bool, tree otr_type = NULL);
1411 /* Assume that both THIS and a given context is valid and strenghten THIS
1412 if possible. Return true if any strenghtening was made.
1413 If actual type the context is being used in is known, OTR_TYPE should be
1414 set accordingly. This improves quality of combined result. */
1415 bool combine_with (ipa_polymorphic_call_context, tree otr_type = NULL);
1416 bool meet_with (ipa_polymorphic_call_context, tree otr_type = NULL);
1418 /* Return TRUE if context is fully useless. */
1419 bool useless_p () const;
1420 /* Return TRUE if this context conveys the same information as X. */
1421 bool equal_to (const ipa_polymorphic_call_context &x) const;
1423 /* Dump human readable context to F. If NEWLINE is true, it will be
1424 terminated by a newline. */
1425 void dump (FILE *f, bool newline = true) const;
1426 void DEBUG_FUNCTION debug () const;
1428 /* LTO streaming. */
1429 void stream_out (struct output_block *) const;
1430 void stream_in (struct lto_input_block *, struct data_in *data_in);
1432 private:
1433 bool combine_speculation_with (tree, HOST_WIDE_INT, bool, tree);
1434 bool meet_speculation_with (tree, HOST_WIDE_INT, bool, tree);
1435 void set_by_decl (tree, HOST_WIDE_INT);
1436 bool set_by_invariant (tree, tree, HOST_WIDE_INT);
1437 bool speculation_consistent_p (tree, HOST_WIDE_INT, bool, tree) const;
1438 void make_speculative (tree otr_type = NULL);
1441 /* Structure containing additional information about an indirect call. */
1443 struct GTY(()) cgraph_indirect_call_info
1445 /* When agg_content is set, an offset where the call pointer is located
1446 within the aggregate. */
1447 HOST_WIDE_INT offset;
1448 /* Context of the polymorphic call; use only when POLYMORPHIC flag is set. */
1449 ipa_polymorphic_call_context context;
1450 /* OBJ_TYPE_REF_TOKEN of a polymorphic call (if polymorphic is set). */
1451 HOST_WIDE_INT otr_token;
1452 /* Type of the object from OBJ_TYPE_REF_OBJECT. */
1453 tree otr_type;
1454 /* Index of the parameter that is called. */
1455 int param_index;
1456 /* ECF flags determined from the caller. */
1457 int ecf_flags;
1458 /* Profile_id of common target obtrained from profile. */
1459 int common_target_id;
1460 /* Probability that call will land in function with COMMON_TARGET_ID. */
1461 int common_target_probability;
1463 /* Set when the call is a virtual call with the parameter being the
1464 associated object pointer rather than a simple direct call. */
1465 unsigned polymorphic : 1;
1466 /* Set when the call is a call of a pointer loaded from contents of an
1467 aggregate at offset. */
1468 unsigned agg_contents : 1;
1469 /* Set when this is a call through a member pointer. */
1470 unsigned member_ptr : 1;
1471 /* When the previous bit is set, this one determines whether the destination
1472 is loaded from a parameter passed by reference. */
1473 unsigned by_ref : 1;
1474 /* For polymorphic calls this specify whether the virtual table pointer
1475 may have changed in between function entry and the call. */
1476 unsigned vptr_changed : 1;
1479 struct GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"),
1480 for_user)) cgraph_edge {
1481 friend class cgraph_node;
1483 /* Remove the edge in the cgraph. */
1484 void remove (void);
1486 /* Change field call_stmt of edge to NEW_STMT.
1487 If UPDATE_SPECULATIVE and E is any component of speculative
1488 edge, then update all components. */
1489 void set_call_stmt (gcall *new_stmt, bool update_speculative = true);
1491 /* Redirect callee of the edge to N. The function does not update underlying
1492 call expression. */
1493 void redirect_callee (cgraph_node *n);
1495 /* If the edge does not lead to a thunk, simply redirect it to N. Otherwise
1496 create one or more equivalent thunks for N and redirect E to the first in
1497 the chain. Note that it is then necessary to call
1498 n->expand_all_artificial_thunks once all callers are redirected. */
1499 void redirect_callee_duplicating_thunks (cgraph_node *n);
1501 /* Make an indirect edge with an unknown callee an ordinary edge leading to
1502 CALLEE. DELTA is an integer constant that is to be added to the this
1503 pointer (first parameter) to compensate for skipping
1504 a thunk adjustment. */
1505 cgraph_edge *make_direct (cgraph_node *callee);
1507 /* Turn edge into speculative call calling N2. Update
1508 the profile so the direct call is taken COUNT times
1509 with FREQUENCY. */
1510 cgraph_edge *make_speculative (cgraph_node *n2, gcov_type direct_count,
1511 int direct_frequency);
1513 /* Given speculative call edge, return all three components. */
1514 void speculative_call_info (cgraph_edge *&direct, cgraph_edge *&indirect,
1515 ipa_ref *&reference);
1517 /* Speculative call edge turned out to be direct call to CALLE_DECL.
1518 Remove the speculative call sequence and return edge representing the call.
1519 It is up to caller to redirect the call as appropriate. */
1520 cgraph_edge *resolve_speculation (tree callee_decl = NULL);
1522 /* If necessary, change the function declaration in the call statement
1523 associated with the edge so that it corresponds to the edge callee. */
1524 gimple redirect_call_stmt_to_callee (void);
1526 /* Create clone of edge in the node N represented
1527 by CALL_EXPR the callgraph. */
1528 cgraph_edge * clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid,
1529 gcov_type count_scale, int freq_scale, bool update_original);
1531 /* Verify edge count and frequency. */
1532 bool verify_count_and_frequency ();
1534 /* Return true when call of edge can not lead to return from caller
1535 and thus it is safe to ignore its side effects for IPA analysis
1536 when computing side effects of the caller. */
1537 bool cannot_lead_to_return_p (void);
1539 /* Return true when the edge represents a direct recursion. */
1540 bool recursive_p (void);
1542 /* Return true if the call can be hot. */
1543 bool maybe_hot_p (void);
1545 /* Rebuild cgraph edges for current function node. This needs to be run after
1546 passes that don't update the cgraph. */
1547 static unsigned int rebuild_edges (void);
1549 /* Rebuild cgraph references for current function node. This needs to be run
1550 after passes that don't update the cgraph. */
1551 static void rebuild_references (void);
1553 /* Expected number of executions: calculated in profile.c. */
1554 gcov_type count;
1555 cgraph_node *caller;
1556 cgraph_node *callee;
1557 cgraph_edge *prev_caller;
1558 cgraph_edge *next_caller;
1559 cgraph_edge *prev_callee;
1560 cgraph_edge *next_callee;
1561 gcall *call_stmt;
1562 /* Additional information about an indirect call. Not cleared when an edge
1563 becomes direct. */
1564 cgraph_indirect_call_info *indirect_info;
1565 PTR GTY ((skip (""))) aux;
1566 /* When equal to CIF_OK, inline this call. Otherwise, points to the
1567 explanation why function was not inlined. */
1568 enum cgraph_inline_failed_t inline_failed;
1569 /* The stmt_uid of call_stmt. This is used by LTO to recover the call_stmt
1570 when the function is serialized in. */
1571 unsigned int lto_stmt_uid;
1572 /* Expected frequency of executions within the function.
1573 When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
1574 per function call. The range is 0 to CGRAPH_FREQ_MAX. */
1575 int frequency;
1576 /* Unique id of the edge. */
1577 int uid;
1578 /* Whether this edge was made direct by indirect inlining. */
1579 unsigned int indirect_inlining_edge : 1;
1580 /* Whether this edge describes an indirect call with an undetermined
1581 callee. */
1582 unsigned int indirect_unknown_callee : 1;
1583 /* Whether this edge is still a dangling */
1584 /* True if the corresponding CALL stmt cannot be inlined. */
1585 unsigned int call_stmt_cannot_inline_p : 1;
1586 /* Can this call throw externally? */
1587 unsigned int can_throw_external : 1;
1588 /* Edges with SPECULATIVE flag represents indirect calls that was
1589 speculatively turned into direct (i.e. by profile feedback).
1590 The final code sequence will have form:
1592 if (call_target == expected_fn)
1593 expected_fn ();
1594 else
1595 call_target ();
1597 Every speculative call is represented by three components attached
1598 to a same call statement:
1599 1) a direct call (to expected_fn)
1600 2) an indirect call (to call_target)
1601 3) a IPA_REF_ADDR refrence to expected_fn.
1603 Optimizers may later redirect direct call to clone, so 1) and 3)
1604 do not need to necesarily agree with destination. */
1605 unsigned int speculative : 1;
1606 /* Set to true when caller is a constructor or destructor of polymorphic
1607 type. */
1608 unsigned in_polymorphic_cdtor : 1;
1610 private:
1611 /* Remove the edge from the list of the callers of the callee. */
1612 void remove_caller (void);
1614 /* Remove the edge from the list of the callees of the caller. */
1615 void remove_callee (void);
1617 /* Set callee N of call graph edge and add it to the corresponding set of
1618 callers. */
1619 void set_callee (cgraph_node *n);
1621 /* Output flags of edge to a file F. */
1622 void dump_edge_flags (FILE *f);
1624 /* Verify that call graph edge corresponds to DECL from the associated
1625 statement. Return true if the verification should fail. */
1626 bool verify_corresponds_to_fndecl (tree decl);
1629 #define CGRAPH_FREQ_BASE 1000
1630 #define CGRAPH_FREQ_MAX 100000
1632 /* The varpool data structure.
1633 Each static variable decl has assigned varpool_node. */
1635 class GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node {
1636 public:
1637 /* Dump given varpool node to F. */
1638 void dump (FILE *f);
1640 /* Dump given varpool node to stderr. */
1641 void DEBUG_FUNCTION debug (void);
1643 /* Remove variable from symbol table. */
1644 void remove (void);
1646 /* Remove node initializer when it is no longer needed. */
1647 void remove_initializer (void);
1649 void analyze (void);
1651 /* Return variable availability. */
1652 availability get_availability (void);
1654 /* When doing LTO, read variable's constructor from disk if
1655 it is not already present. */
1656 tree get_constructor (void);
1658 /* Return true if variable has constructor that can be used for folding. */
1659 bool ctor_useable_for_folding_p (void);
1661 /* For given variable pool node, walk the alias chain to return the function
1662 the variable is alias of. Do not walk through thunks.
1663 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
1664 inline varpool_node *ultimate_alias_target
1665 (availability *availability = NULL);
1667 /* Return node that alias is aliasing. */
1668 inline varpool_node *get_alias_target (void);
1670 /* Output one variable, if necessary. Return whether we output it. */
1671 bool assemble_decl (void);
1673 /* For variables in named sections make sure get_variable_section
1674 is called before we switch to those sections. Then section
1675 conflicts between read-only and read-only requiring relocations
1676 sections can be resolved. */
1677 void finalize_named_section_flags (void);
1679 /* Call calback on varpool symbol and aliases associated to varpool symbol.
1680 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
1681 skipped. */
1682 bool call_for_symbol_and_aliases (bool (*callback) (varpool_node *, void *),
1683 void *data,
1684 bool include_overwritable);
1686 /* Return true when variable should be considered externally visible. */
1687 bool externally_visible_p (void);
1689 /* Return true when all references to variable must be visible
1690 in ipa_ref_list.
1691 i.e. if the variable is not externally visible or not used in some magic
1692 way (asm statement or such).
1693 The magic uses are all summarized in force_output flag. */
1694 inline bool all_refs_explicit_p ();
1696 /* Return true when variable can be removed from variable pool
1697 if all direct calls are eliminated. */
1698 inline bool can_remove_if_no_refs_p (void);
1700 /* Add the variable DECL to the varpool.
1701 Unlike finalize_decl function is intended to be used
1702 by middle end and allows insertion of new variable at arbitrary point
1703 of compilation. */
1704 static void add (tree decl);
1706 /* Return varpool node for given symbol and check it is a function. */
1707 static inline varpool_node *get (const_tree decl);
1709 /* Mark DECL as finalized. By finalizing the declaration, frontend instruct
1710 the middle end to output the variable to asm file, if needed or externally
1711 visible. */
1712 static void finalize_decl (tree decl);
1714 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
1715 Extra name aliases are output whenever DECL is output. */
1716 static varpool_node * create_extra_name_alias (tree alias, tree decl);
1718 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
1719 Extra name aliases are output whenever DECL is output. */
1720 static varpool_node * create_alias (tree, tree);
1722 /* Dump the variable pool to F. */
1723 static void dump_varpool (FILE *f);
1725 /* Dump the variable pool to stderr. */
1726 static void DEBUG_FUNCTION debug_varpool (void);
1728 /* Allocate new callgraph node and insert it into basic data structures. */
1729 static varpool_node *create_empty (void);
1731 /* Return varpool node assigned to DECL. Create new one when needed. */
1732 static varpool_node *get_create (tree decl);
1734 /* Given an assembler name, lookup node. */
1735 static varpool_node *get_for_asmname (tree asmname);
1737 /* Set when variable is scheduled to be assembled. */
1738 unsigned output : 1;
1740 /* Set when variable has statically initialized pointer
1741 or is a static bounds variable and needs initalization. */
1742 unsigned need_bounds_init : 1;
1744 /* Set if the variable is dynamically initialized, except for
1745 function local statics. */
1746 unsigned dynamically_initialized : 1;
1748 ENUM_BITFIELD(tls_model) tls_model : 3;
1750 /* Set if the variable is known to be used by single function only.
1751 This is computed by ipa_signle_use pass and used by late optimizations
1752 in places where optimization would be valid for local static variable
1753 if we did not do any inter-procedural code movement. */
1754 unsigned used_by_single_function : 1;
1756 private:
1757 /* Assemble thunks and aliases associated to varpool node. */
1758 void assemble_aliases (void);
1760 /* Worker for call_for_node_and_aliases. */
1761 bool call_for_symbol_and_aliases_1 (bool (*callback) (varpool_node *, void *),
1762 void *data,
1763 bool include_overwritable);
1766 /* Every top level asm statement is put into a asm_node. */
1768 struct GTY(()) asm_node {
1771 /* Next asm node. */
1772 asm_node *next;
1773 /* String for this asm node. */
1774 tree asm_str;
1775 /* Ordering of all cgraph nodes. */
1776 int order;
1779 /* Report whether or not THIS symtab node is a function, aka cgraph_node. */
1781 template <>
1782 template <>
1783 inline bool
1784 is_a_helper <cgraph_node *>::test (symtab_node *p)
1786 return p && p->type == SYMTAB_FUNCTION;
1789 /* Report whether or not THIS symtab node is a vriable, aka varpool_node. */
1791 template <>
1792 template <>
1793 inline bool
1794 is_a_helper <varpool_node *>::test (symtab_node *p)
1796 return p && p->type == SYMTAB_VARIABLE;
1799 /* Macros to access the next item in the list of free cgraph nodes and
1800 edges. */
1801 #define NEXT_FREE_NODE(NODE) dyn_cast<cgraph_node *> ((NODE)->next)
1802 #define SET_NEXT_FREE_NODE(NODE,NODE2) ((NODE))->next = NODE2
1803 #define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
1805 typedef void (*cgraph_edge_hook)(cgraph_edge *, void *);
1806 typedef void (*cgraph_node_hook)(cgraph_node *, void *);
1807 typedef void (*varpool_node_hook)(varpool_node *, void *);
1808 typedef void (*cgraph_2edge_hook)(cgraph_edge *, cgraph_edge *, void *);
1809 typedef void (*cgraph_2node_hook)(cgraph_node *, cgraph_node *, void *);
1811 struct cgraph_edge_hook_list;
1812 struct cgraph_node_hook_list;
1813 struct varpool_node_hook_list;
1814 struct cgraph_2edge_hook_list;
1815 struct cgraph_2node_hook_list;
1817 /* Map from a symbol to initialization/finalization priorities. */
1818 struct GTY(()) symbol_priority_map {
1819 priority_type init;
1820 priority_type fini;
1823 enum symtab_state
1825 /* Frontend is parsing and finalizing functions. */
1826 PARSING,
1827 /* Callgraph is being constructed. It is safe to add new functions. */
1828 CONSTRUCTION,
1829 /* Callgraph is being streamed-in at LTO time. */
1830 LTO_STREAMING,
1831 /* Callgraph is built and early IPA passes are being run. */
1832 IPA,
1833 /* Callgraph is built and all functions are transformed to SSA form. */
1834 IPA_SSA,
1835 /* All inline decisions are done; it is now possible to remove extern inline
1836 functions and virtual call targets. */
1837 IPA_SSA_AFTER_INLINING,
1838 /* Functions are now ordered and being passed to RTL expanders. */
1839 EXPANSION,
1840 /* All cgraph expansion is done. */
1841 FINISHED
1844 struct asmname_hasher
1846 typedef symtab_node *value_type;
1847 typedef const_tree compare_type;
1848 typedef int store_values_directly;
1850 static hashval_t hash (symtab_node *n);
1851 static bool equal (symtab_node *n, const_tree t);
1852 static void ggc_mx (symtab_node *n);
1853 static void pch_nx (symtab_node *&);
1854 static void pch_nx (symtab_node *&, gt_pointer_operator, void *);
1855 static void remove (symtab_node *) {}
1858 class GTY((tag ("SYMTAB"))) symbol_table
1860 public:
1861 friend class symtab_node;
1862 friend class cgraph_node;
1863 friend class cgraph_edge;
1865 symbol_table (): cgraph_max_summary_uid (1)
1869 /* Initialize callgraph dump file. */
1870 void initialize (void);
1872 /* Register a top-level asm statement ASM_STR. */
1873 inline asm_node *finalize_toplevel_asm (tree asm_str);
1875 /* Analyze the whole compilation unit once it is parsed completely. */
1876 void finalize_compilation_unit (void);
1878 /* C++ frontend produce same body aliases all over the place, even before PCH
1879 gets streamed out. It relies on us linking the aliases with their function
1880 in order to do the fixups, but ipa-ref is not PCH safe. Consequentely we
1881 first produce aliases without links, but once C++ FE is sure he won't sream
1882 PCH we build the links via this function. */
1883 void process_same_body_aliases (void);
1885 /* Perform simple optimizations based on callgraph. */
1886 void compile (void);
1888 /* Process CGRAPH_NEW_FUNCTIONS and perform actions necessary to add these
1889 functions into callgraph in a way so they look like ordinary reachable
1890 functions inserted into callgraph already at construction time. */
1891 void process_new_functions (void);
1893 /* Once all functions from compilation unit are in memory, produce all clones
1894 and update all calls. We might also do this on demand if we don't want to
1895 bring all functions to memory prior compilation, but current WHOPR
1896 implementation does that and it is is bit easier to keep everything right
1897 in this order. */
1898 void materialize_all_clones (void);
1900 /* Register a symbol NODE. */
1901 inline void register_symbol (symtab_node *node);
1903 inline void
1904 clear_asm_symbols (void)
1906 asmnodes = NULL;
1907 asm_last_node = NULL;
1910 /* Perform reachability analysis and reclaim all unreachable nodes. */
1911 bool remove_unreachable_nodes (FILE *file);
1913 /* Optimization of function bodies might've rendered some variables as
1914 unnecessary so we want to avoid these from being compiled. Re-do
1915 reachability starting from variables that are either externally visible
1916 or was referred from the asm output routines. */
1917 void remove_unreferenced_decls (void);
1919 /* Unregister a symbol NODE. */
1920 inline void unregister (symtab_node *node);
1922 /* Allocate new callgraph node and insert it into basic data structures. */
1923 cgraph_node *create_empty (void);
1925 /* Release a callgraph NODE with UID and put in to the list
1926 of free nodes. */
1927 void release_symbol (cgraph_node *node, int uid);
1929 /* Output all variables enqueued to be assembled. */
1930 bool output_variables (void);
1932 /* Weakrefs may be associated to external decls and thus not output
1933 at expansion time. Emit all necessary aliases. */
1934 void output_weakrefs (void);
1936 /* Return first static symbol with definition. */
1937 inline symtab_node *first_symbol (void);
1939 /* Return first assembler symbol. */
1940 inline asm_node *
1941 first_asm_symbol (void)
1943 return asmnodes;
1946 /* Return first static symbol with definition. */
1947 inline symtab_node *first_defined_symbol (void);
1949 /* Return first variable. */
1950 inline varpool_node *first_variable (void);
1952 /* Return next variable after NODE. */
1953 inline varpool_node *next_variable (varpool_node *node);
1955 /* Return first static variable with initializer. */
1956 inline varpool_node *first_static_initializer (void);
1958 /* Return next static variable with initializer after NODE. */
1959 inline varpool_node *next_static_initializer (varpool_node *node);
1961 /* Return first static variable with definition. */
1962 inline varpool_node *first_defined_variable (void);
1964 /* Return next static variable with definition after NODE. */
1965 inline varpool_node *next_defined_variable (varpool_node *node);
1967 /* Return first function with body defined. */
1968 inline cgraph_node *first_defined_function (void);
1970 /* Return next function with body defined after NODE. */
1971 inline cgraph_node *next_defined_function (cgraph_node *node);
1973 /* Return first function. */
1974 inline cgraph_node *first_function (void);
1976 /* Return next function. */
1977 inline cgraph_node *next_function (cgraph_node *node);
1979 /* Return first function with body defined. */
1980 cgraph_node *first_function_with_gimple_body (void);
1982 /* Return next reachable static variable with initializer after NODE. */
1983 inline cgraph_node *next_function_with_gimple_body (cgraph_node *node);
1985 /* Register HOOK to be called with DATA on each removed edge. */
1986 cgraph_edge_hook_list *add_edge_removal_hook (cgraph_edge_hook hook,
1987 void *data);
1989 /* Remove ENTRY from the list of hooks called on removing edges. */
1990 void remove_edge_removal_hook (cgraph_edge_hook_list *entry);
1992 /* Register HOOK to be called with DATA on each removed node. */
1993 cgraph_node_hook_list *add_cgraph_removal_hook (cgraph_node_hook hook,
1994 void *data);
1996 /* Remove ENTRY from the list of hooks called on removing nodes. */
1997 void remove_cgraph_removal_hook (cgraph_node_hook_list *entry);
1999 /* Register HOOK to be called with DATA on each removed node. */
2000 varpool_node_hook_list *add_varpool_removal_hook (varpool_node_hook hook,
2001 void *data);
2003 /* Remove ENTRY from the list of hooks called on removing nodes. */
2004 void remove_varpool_removal_hook (varpool_node_hook_list *entry);
2006 /* Register HOOK to be called with DATA on each inserted node. */
2007 cgraph_node_hook_list *add_cgraph_insertion_hook (cgraph_node_hook hook,
2008 void *data);
2010 /* Remove ENTRY from the list of hooks called on inserted nodes. */
2011 void remove_cgraph_insertion_hook (cgraph_node_hook_list *entry);
2013 /* Register HOOK to be called with DATA on each inserted node. */
2014 varpool_node_hook_list *add_varpool_insertion_hook (varpool_node_hook hook,
2015 void *data);
2017 /* Remove ENTRY from the list of hooks called on inserted nodes. */
2018 void remove_varpool_insertion_hook (varpool_node_hook_list *entry);
2020 /* Register HOOK to be called with DATA on each duplicated edge. */
2021 cgraph_2edge_hook_list *add_edge_duplication_hook (cgraph_2edge_hook hook,
2022 void *data);
2023 /* Remove ENTRY from the list of hooks called on duplicating edges. */
2024 void remove_edge_duplication_hook (cgraph_2edge_hook_list *entry);
2026 /* Register HOOK to be called with DATA on each duplicated node. */
2027 cgraph_2node_hook_list *add_cgraph_duplication_hook (cgraph_2node_hook hook,
2028 void *data);
2030 /* Remove ENTRY from the list of hooks called on duplicating nodes. */
2031 void remove_cgraph_duplication_hook (cgraph_2node_hook_list *entry);
2033 /* Call all edge removal hooks. */
2034 void call_edge_removal_hooks (cgraph_edge *e);
2036 /* Call all node insertion hooks. */
2037 void call_cgraph_insertion_hooks (cgraph_node *node);
2039 /* Call all node removal hooks. */
2040 void call_cgraph_removal_hooks (cgraph_node *node);
2042 /* Call all node duplication hooks. */
2043 void call_cgraph_duplication_hooks (cgraph_node *node, cgraph_node *node2);
2045 /* Call all edge duplication hooks. */
2046 void call_edge_duplication_hooks (cgraph_edge *cs1, cgraph_edge *cs2);
2048 /* Call all node removal hooks. */
2049 void call_varpool_removal_hooks (varpool_node *node);
2051 /* Call all node insertion hooks. */
2052 void call_varpool_insertion_hooks (varpool_node *node);
2054 /* Arrange node to be first in its entry of assembler_name_hash. */
2055 void symtab_prevail_in_asm_name_hash (symtab_node *node);
2057 /* Initalize asm name hash unless. */
2058 void symtab_initialize_asm_name_hash (void);
2060 /* Set the DECL_ASSEMBLER_NAME and update symtab hashtables. */
2061 void change_decl_assembler_name (tree decl, tree name);
2063 int cgraph_count;
2064 int cgraph_max_uid;
2065 int cgraph_max_summary_uid;
2067 int edges_count;
2068 int edges_max_uid;
2070 symtab_node* GTY(()) nodes;
2071 asm_node* GTY(()) asmnodes;
2072 asm_node* GTY(()) asm_last_node;
2073 cgraph_node* GTY(()) free_nodes;
2075 /* Head of a linked list of unused (freed) call graph edges.
2076 Do not GTY((delete)) this list so UIDs gets reliably recycled. */
2077 cgraph_edge * GTY(()) free_edges;
2079 /* The order index of the next symtab node to be created. This is
2080 used so that we can sort the cgraph nodes in order by when we saw
2081 them, to support -fno-toplevel-reorder. */
2082 int order;
2084 /* Set when whole unit has been analyzed so we can access global info. */
2085 bool global_info_ready;
2086 /* What state callgraph is in right now. */
2087 enum symtab_state state;
2088 /* Set when the cgraph is fully build and the basic flags are computed. */
2089 bool function_flags_ready;
2091 bool cpp_implicit_aliases_done;
2093 /* Hash table used to hold sectoons. */
2094 hash_table<section_name_hasher> *GTY(()) section_hash;
2096 /* Hash table used to convert assembler names into nodes. */
2097 hash_table<asmname_hasher> *assembler_name_hash;
2099 /* Hash table used to hold init priorities. */
2100 hash_map<symtab_node *, symbol_priority_map> *init_priority_hash;
2102 FILE* GTY ((skip)) dump_file;
2104 private:
2105 /* Allocate new callgraph node. */
2106 inline cgraph_node * allocate_cgraph_symbol (void);
2108 /* Allocate a cgraph_edge structure and fill it with data according to the
2109 parameters of which only CALLEE can be NULL (when creating an indirect call
2110 edge). */
2111 cgraph_edge *create_edge (cgraph_node *caller, cgraph_node *callee,
2112 gcall *call_stmt, gcov_type count, int freq,
2113 bool indir_unknown_callee);
2115 /* Put the edge onto the free list. */
2116 void free_edge (cgraph_edge *e);
2118 /* Insert NODE to assembler name hash. */
2119 void insert_to_assembler_name_hash (symtab_node *node, bool with_clones);
2121 /* Remove NODE from assembler name hash. */
2122 void unlink_from_assembler_name_hash (symtab_node *node, bool with_clones);
2124 /* Hash asmnames ignoring the user specified marks. */
2125 static hashval_t decl_assembler_name_hash (const_tree asmname);
2127 /* Compare ASMNAME with the DECL_ASSEMBLER_NAME of DECL. */
2128 static bool decl_assembler_name_equal (tree decl, const_tree asmname);
2130 friend struct asmname_hasher;
2132 /* List of hooks triggered when an edge is removed. */
2133 cgraph_edge_hook_list * GTY((skip)) m_first_edge_removal_hook;
2134 /* List of hooks triggem_red when a cgraph node is removed. */
2135 cgraph_node_hook_list * GTY((skip)) m_first_cgraph_removal_hook;
2136 /* List of hooks triggered when an edge is duplicated. */
2137 cgraph_2edge_hook_list * GTY((skip)) m_first_edge_duplicated_hook;
2138 /* List of hooks triggered when a node is duplicated. */
2139 cgraph_2node_hook_list * GTY((skip)) m_first_cgraph_duplicated_hook;
2140 /* List of hooks triggered when an function is inserted. */
2141 cgraph_node_hook_list * GTY((skip)) m_first_cgraph_insertion_hook;
2142 /* List of hooks triggered when an variable is inserted. */
2143 varpool_node_hook_list * GTY((skip)) m_first_varpool_insertion_hook;
2144 /* List of hooks triggered when a node is removed. */
2145 varpool_node_hook_list * GTY((skip)) m_first_varpool_removal_hook;
2148 extern GTY(()) symbol_table *symtab;
2150 extern vec<cgraph_node *> cgraph_new_nodes;
2152 inline hashval_t
2153 asmname_hasher::hash (symtab_node *n)
2155 return symbol_table::decl_assembler_name_hash
2156 (DECL_ASSEMBLER_NAME (n->decl));
2159 inline bool
2160 asmname_hasher::equal (symtab_node *n, const_tree t)
2162 return symbol_table::decl_assembler_name_equal (n->decl, t);
2165 extern void gt_ggc_mx (symtab_node *&);
2167 inline void
2168 asmname_hasher::ggc_mx (symtab_node *n)
2170 gt_ggc_mx (n);
2173 extern void gt_pch_nx (symtab_node *&);
2175 inline void
2176 asmname_hasher::pch_nx (symtab_node *&n)
2178 gt_pch_nx (n);
2181 inline void
2182 asmname_hasher::pch_nx (symtab_node *&n, gt_pointer_operator op, void *cookie)
2184 op (&n, cookie);
2187 /* In cgraph.c */
2188 void cgraph_c_finalize (void);
2189 void release_function_body (tree);
2190 cgraph_indirect_call_info *cgraph_allocate_init_indirect_info (void);
2192 void cgraph_update_edges_for_call_stmt (gimple, tree, gimple);
2193 bool cgraph_function_possibly_inlined_p (tree);
2195 const char* cgraph_inline_failed_string (cgraph_inline_failed_t);
2196 cgraph_inline_failed_type_t cgraph_inline_failed_type (cgraph_inline_failed_t);
2198 extern bool gimple_check_call_matching_types (gimple, tree, bool);
2200 /* In cgraphunit.c */
2201 void cgraphunit_c_finalize (void);
2203 /* Initialize datastructures so DECL is a function in lowered gimple form.
2204 IN_SSA is true if the gimple is in SSA. */
2205 basic_block init_lowered_empty_function (tree, bool, gcov_type);
2207 /* In cgraphclones.c */
2209 tree clone_function_name_1 (const char *, const char *);
2210 tree clone_function_name (tree decl, const char *);
2212 void tree_function_versioning (tree, tree, vec<ipa_replace_map *, va_gc> *,
2213 bool, bitmap, bool, bitmap, basic_block);
2215 /* In cgraphbuild.c */
2216 int compute_call_stmt_bb_frequency (tree, basic_block bb);
2217 void record_references_in_initializer (tree, bool);
2219 /* In ipa.c */
2220 void cgraph_build_static_cdtor (char which, tree body, int priority);
2221 bool ipa_discover_readonly_nonaddressable_vars (void);
2223 /* In varpool.c */
2224 tree ctor_for_folding (tree);
2226 /* In tree-chkp.c */
2227 extern bool chkp_function_instrumented_p (tree fndecl);
2229 /* Return true when the symbol is real symbol, i.e. it is not inline clone
2230 or abstract function kept for debug info purposes only. */
2231 inline bool
2232 symtab_node::real_symbol_p (void)
2234 cgraph_node *cnode;
2236 if (DECL_ABSTRACT_P (decl))
2237 return false;
2238 if (!is_a <cgraph_node *> (this))
2239 return true;
2240 cnode = dyn_cast <cgraph_node *> (this);
2241 if (cnode->global.inlined_to)
2242 return false;
2243 return true;
2246 /* Return true if DECL should have entry in symbol table if used.
2247 Those are functions and static & external veriables*/
2249 static inline bool
2250 decl_in_symtab_p (const_tree decl)
2252 return (TREE_CODE (decl) == FUNCTION_DECL
2253 || (TREE_CODE (decl) == VAR_DECL
2254 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))));
2257 inline bool
2258 symtab_node::in_same_comdat_group_p (symtab_node *target)
2260 symtab_node *source = this;
2262 if (cgraph_node *cn = dyn_cast <cgraph_node *> (target))
2264 if (cn->global.inlined_to)
2265 source = cn->global.inlined_to;
2267 if (cgraph_node *cn = dyn_cast <cgraph_node *> (target))
2269 if (cn->global.inlined_to)
2270 target = cn->global.inlined_to;
2273 return source->get_comdat_group () == target->get_comdat_group ();
2276 /* Return node that alias is aliasing. */
2278 inline symtab_node *
2279 symtab_node::get_alias_target (void)
2281 ipa_ref *ref = NULL;
2282 iterate_reference (0, ref);
2283 if (ref->use == IPA_REF_CHKP)
2284 iterate_reference (1, ref);
2285 gcc_checking_assert (ref->use == IPA_REF_ALIAS);
2286 return ref->referred;
2289 /* Return next reachable static symbol with initializer after the node. */
2291 inline symtab_node *
2292 symtab_node::next_defined_symbol (void)
2294 symtab_node *node1 = next;
2296 for (; node1; node1 = node1->next)
2297 if (node1->definition)
2298 return node1;
2300 return NULL;
2303 /* Iterates I-th reference in the list, REF is also set. */
2305 inline ipa_ref *
2306 symtab_node::iterate_reference (unsigned i, ipa_ref *&ref)
2308 vec_safe_iterate (ref_list.references, i, &ref);
2310 return ref;
2313 /* Iterates I-th referring item in the list, REF is also set. */
2315 inline ipa_ref *
2316 symtab_node::iterate_referring (unsigned i, ipa_ref *&ref)
2318 ref_list.referring.iterate (i, &ref);
2320 return ref;
2323 /* Iterates I-th referring alias item in the list, REF is also set. */
2325 inline ipa_ref *
2326 symtab_node::iterate_direct_aliases (unsigned i, ipa_ref *&ref)
2328 ref_list.referring.iterate (i, &ref);
2330 if (ref && ref->use != IPA_REF_ALIAS)
2331 return NULL;
2333 return ref;
2336 /* Return true if list contains an alias. */
2338 inline bool
2339 symtab_node::has_aliases_p (void)
2341 ipa_ref *ref = NULL;
2343 return (iterate_direct_aliases (0, ref) != NULL);
2346 /* Return true when RESOLUTION indicate that linker will use
2347 the symbol from non-LTO object files. */
2349 inline bool
2350 resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution resolution)
2352 return (resolution == LDPR_PREVAILING_DEF
2353 || resolution == LDPR_PREEMPTED_REG
2354 || resolution == LDPR_RESOLVED_EXEC
2355 || resolution == LDPR_RESOLVED_DYN);
2358 /* Return true when symtab_node is known to be used from other (non-LTO)
2359 object file. Known only when doing LTO via linker plugin. */
2361 inline bool
2362 symtab_node::used_from_object_file_p (void)
2364 if (!TREE_PUBLIC (decl) || DECL_EXTERNAL (decl))
2365 return false;
2366 if (resolution_used_from_other_file_p (resolution))
2367 return true;
2368 return false;
2371 /* Return varpool node for given symbol and check it is a function. */
2373 inline varpool_node *
2374 varpool_node::get (const_tree decl)
2376 gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
2377 return dyn_cast<varpool_node *> (symtab_node::get (decl));
2380 /* Register a symbol NODE. */
2382 inline void
2383 symbol_table::register_symbol (symtab_node *node)
2385 node->next = nodes;
2386 node->previous = NULL;
2388 if (nodes)
2389 nodes->previous = node;
2390 nodes = node;
2392 node->order = order++;
2395 /* Register a top-level asm statement ASM_STR. */
2397 asm_node *
2398 symbol_table::finalize_toplevel_asm (tree asm_str)
2400 asm_node *node;
2402 node = ggc_cleared_alloc<asm_node> ();
2403 node->asm_str = asm_str;
2404 node->order = order++;
2405 node->next = NULL;
2407 if (asmnodes == NULL)
2408 asmnodes = node;
2409 else
2410 asm_last_node->next = node;
2412 asm_last_node = node;
2413 return node;
2416 /* Unregister a symbol NODE. */
2417 inline void
2418 symbol_table::unregister (symtab_node *node)
2420 if (node->previous)
2421 node->previous->next = node->next;
2422 else
2423 nodes = node->next;
2425 if (node->next)
2426 node->next->previous = node->previous;
2428 node->next = NULL;
2429 node->previous = NULL;
2432 /* Release a callgraph NODE with UID and put in to the list of free nodes. */
2434 inline void
2435 symbol_table::release_symbol (cgraph_node *node, int uid)
2437 cgraph_count--;
2439 /* Clear out the node to NULL all pointers and add the node to the free
2440 list. */
2441 memset (node, 0, sizeof (*node));
2442 node->type = SYMTAB_FUNCTION;
2443 node->uid = uid;
2444 SET_NEXT_FREE_NODE (node, free_nodes);
2445 free_nodes = node;
2448 /* Allocate new callgraph node. */
2450 inline cgraph_node *
2451 symbol_table::allocate_cgraph_symbol (void)
2453 cgraph_node *node;
2455 if (free_nodes)
2457 node = free_nodes;
2458 free_nodes = NEXT_FREE_NODE (node);
2460 else
2462 node = ggc_cleared_alloc<cgraph_node> ();
2463 node->uid = cgraph_max_uid++;
2466 node->summary_uid = cgraph_max_summary_uid++;
2467 return node;
2471 /* Return first static symbol with definition. */
2472 inline symtab_node *
2473 symbol_table::first_symbol (void)
2475 return nodes;
2478 /* Walk all symbols. */
2479 #define FOR_EACH_SYMBOL(node) \
2480 for ((node) = symtab->first_symbol (); (node); (node) = (node)->next)
2482 /* Return first static symbol with definition. */
2483 inline symtab_node *
2484 symbol_table::first_defined_symbol (void)
2486 symtab_node *node;
2488 for (node = nodes; node; node = node->next)
2489 if (node->definition)
2490 return node;
2492 return NULL;
2495 /* Walk all symbols with definitions in current unit. */
2496 #define FOR_EACH_DEFINED_SYMBOL(node) \
2497 for ((node) = symtab->first_defined_symbol (); (node); \
2498 (node) = node->next_defined_symbol ())
2500 /* Return first variable. */
2501 inline varpool_node *
2502 symbol_table::first_variable (void)
2504 symtab_node *node;
2505 for (node = nodes; node; node = node->next)
2506 if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
2507 return vnode;
2508 return NULL;
2511 /* Return next variable after NODE. */
2512 inline varpool_node *
2513 symbol_table::next_variable (varpool_node *node)
2515 symtab_node *node1 = node->next;
2516 for (; node1; node1 = node1->next)
2517 if (varpool_node *vnode1 = dyn_cast <varpool_node *> (node1))
2518 return vnode1;
2519 return NULL;
2521 /* Walk all variables. */
2522 #define FOR_EACH_VARIABLE(node) \
2523 for ((node) = symtab->first_variable (); \
2524 (node); \
2525 (node) = symtab->next_variable ((node)))
2527 /* Return first static variable with initializer. */
2528 inline varpool_node *
2529 symbol_table::first_static_initializer (void)
2531 symtab_node *node;
2532 for (node = nodes; node; node = node->next)
2534 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2535 if (vnode && DECL_INITIAL (node->decl))
2536 return vnode;
2538 return NULL;
2541 /* Return next static variable with initializer after NODE. */
2542 inline varpool_node *
2543 symbol_table::next_static_initializer (varpool_node *node)
2545 symtab_node *node1 = node->next;
2546 for (; node1; node1 = node1->next)
2548 varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
2549 if (vnode1 && DECL_INITIAL (node1->decl))
2550 return vnode1;
2552 return NULL;
2555 /* Walk all static variables with initializer set. */
2556 #define FOR_EACH_STATIC_INITIALIZER(node) \
2557 for ((node) = symtab->first_static_initializer (); (node); \
2558 (node) = symtab->next_static_initializer (node))
2560 /* Return first static variable with definition. */
2561 inline varpool_node *
2562 symbol_table::first_defined_variable (void)
2564 symtab_node *node;
2565 for (node = nodes; node; node = node->next)
2567 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2568 if (vnode && vnode->definition)
2569 return vnode;
2571 return NULL;
2574 /* Return next static variable with definition after NODE. */
2575 inline varpool_node *
2576 symbol_table::next_defined_variable (varpool_node *node)
2578 symtab_node *node1 = node->next;
2579 for (; node1; node1 = node1->next)
2581 varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
2582 if (vnode1 && vnode1->definition)
2583 return vnode1;
2585 return NULL;
2587 /* Walk all variables with definitions in current unit. */
2588 #define FOR_EACH_DEFINED_VARIABLE(node) \
2589 for ((node) = symtab->first_defined_variable (); (node); \
2590 (node) = symtab->next_defined_variable (node))
2592 /* Return first function with body defined. */
2593 inline cgraph_node *
2594 symbol_table::first_defined_function (void)
2596 symtab_node *node;
2597 for (node = nodes; node; node = node->next)
2599 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
2600 if (cn && cn->definition)
2601 return cn;
2603 return NULL;
2606 /* Return next function with body defined after NODE. */
2607 inline cgraph_node *
2608 symbol_table::next_defined_function (cgraph_node *node)
2610 symtab_node *node1 = node->next;
2611 for (; node1; node1 = node1->next)
2613 cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
2614 if (cn1 && cn1->definition)
2615 return cn1;
2617 return NULL;
2620 /* Walk all functions with body defined. */
2621 #define FOR_EACH_DEFINED_FUNCTION(node) \
2622 for ((node) = symtab->first_defined_function (); (node); \
2623 (node) = symtab->next_defined_function ((node)))
2625 /* Return first function. */
2626 inline cgraph_node *
2627 symbol_table::first_function (void)
2629 symtab_node *node;
2630 for (node = nodes; node; node = node->next)
2631 if (cgraph_node *cn = dyn_cast <cgraph_node *> (node))
2632 return cn;
2633 return NULL;
2636 /* Return next function. */
2637 inline cgraph_node *
2638 symbol_table::next_function (cgraph_node *node)
2640 symtab_node *node1 = node->next;
2641 for (; node1; node1 = node1->next)
2642 if (cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1))
2643 return cn1;
2644 return NULL;
2647 /* Return first function with body defined. */
2648 inline cgraph_node *
2649 symbol_table::first_function_with_gimple_body (void)
2651 symtab_node *node;
2652 for (node = nodes; node; node = node->next)
2654 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
2655 if (cn && cn->has_gimple_body_p ())
2656 return cn;
2658 return NULL;
2661 /* Return next reachable static variable with initializer after NODE. */
2662 inline cgraph_node *
2663 symbol_table::next_function_with_gimple_body (cgraph_node *node)
2665 symtab_node *node1 = node->next;
2666 for (; node1; node1 = node1->next)
2668 cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
2669 if (cn1 && cn1->has_gimple_body_p ())
2670 return cn1;
2672 return NULL;
2675 /* Walk all functions. */
2676 #define FOR_EACH_FUNCTION(node) \
2677 for ((node) = symtab->first_function (); (node); \
2678 (node) = symtab->next_function ((node)))
2680 /* Return true when callgraph node is a function with Gimple body defined
2681 in current unit. Functions can also be define externally or they
2682 can be thunks with no Gimple representation.
2684 Note that at WPA stage, the function body may not be present in memory. */
2686 inline bool
2687 cgraph_node::has_gimple_body_p (void)
2689 return definition && !thunk.thunk_p && !alias;
2692 /* Walk all functions with body defined. */
2693 #define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \
2694 for ((node) = symtab->first_function_with_gimple_body (); (node); \
2695 (node) = symtab->next_function_with_gimple_body (node))
2697 /* Create a new static variable of type TYPE. */
2698 tree add_new_static_var (tree type);
2700 /* Uniquize all constants that appear in memory.
2701 Each constant in memory thus far output is recorded
2702 in `const_desc_table'. */
2704 struct GTY((for_user)) constant_descriptor_tree {
2705 /* A MEM for the constant. */
2706 rtx rtl;
2708 /* The value of the constant. */
2709 tree value;
2711 /* Hash of value. Computing the hash from value each time
2712 hashfn is called can't work properly, as that means recursive
2713 use of the hash table during hash table expansion. */
2714 hashval_t hash;
2717 /* Return true when function is only called directly or it has alias.
2718 i.e. it is not externally visible, address was not taken and
2719 it is not used in any other non-standard way. */
2721 inline bool
2722 cgraph_node::only_called_directly_or_aliased_p (void)
2724 gcc_assert (!global.inlined_to);
2725 return (!force_output && !address_taken
2726 && !used_from_other_partition
2727 && !DECL_VIRTUAL_P (decl)
2728 && !DECL_STATIC_CONSTRUCTOR (decl)
2729 && !DECL_STATIC_DESTRUCTOR (decl)
2730 && !externally_visible);
2733 /* Return true when function can be removed from callgraph
2734 if all direct calls are eliminated. */
2736 inline bool
2737 cgraph_node::can_remove_if_no_direct_calls_and_refs_p (void)
2739 gcc_checking_assert (!global.inlined_to);
2740 /* Instrumentation clones should not be removed before
2741 instrumentation happens. New callers may appear after
2742 instrumentation. */
2743 if (instrumentation_clone
2744 && !chkp_function_instrumented_p (decl))
2745 return false;
2746 /* Extern inlines can always go, we will use the external definition. */
2747 if (DECL_EXTERNAL (decl))
2748 return true;
2749 /* When function is needed, we can not remove it. */
2750 if (force_output || used_from_other_partition)
2751 return false;
2752 if (DECL_STATIC_CONSTRUCTOR (decl)
2753 || DECL_STATIC_DESTRUCTOR (decl))
2754 return false;
2755 /* Only COMDAT functions can be removed if externally visible. */
2756 if (externally_visible
2757 && (!DECL_COMDAT (decl)
2758 || forced_by_abi
2759 || used_from_object_file_p ()))
2760 return false;
2761 return true;
2764 /* Return true when variable can be removed from variable pool
2765 if all direct calls are eliminated. */
2767 inline bool
2768 varpool_node::can_remove_if_no_refs_p (void)
2770 if (DECL_EXTERNAL (decl))
2771 return true;
2772 return (!force_output && !used_from_other_partition
2773 && ((DECL_COMDAT (decl)
2774 && !forced_by_abi
2775 && !used_from_object_file_p ())
2776 || !externally_visible
2777 || DECL_HAS_VALUE_EXPR_P (decl)));
2780 /* Return true when all references to variable must be visible in ipa_ref_list.
2781 i.e. if the variable is not externally visible or not used in some magic
2782 way (asm statement or such).
2783 The magic uses are all summarized in force_output flag. */
2785 inline bool
2786 varpool_node::all_refs_explicit_p ()
2788 return (definition
2789 && !externally_visible
2790 && !used_from_other_partition
2791 && !force_output);
2794 struct tree_descriptor_hasher : ggc_hasher<constant_descriptor_tree *>
2796 static hashval_t hash (constant_descriptor_tree *);
2797 static bool equal (constant_descriptor_tree *, constant_descriptor_tree *);
2800 /* Constant pool accessor function. */
2801 hash_table<tree_descriptor_hasher> *constant_pool_htab (void);
2803 /* Return node that alias is aliasing. */
2805 inline cgraph_node *
2806 cgraph_node::get_alias_target (void)
2808 return dyn_cast <cgraph_node *> (symtab_node::get_alias_target ());
2811 /* Return node that alias is aliasing. */
2813 inline varpool_node *
2814 varpool_node::get_alias_target (void)
2816 return dyn_cast <varpool_node *> (symtab_node::get_alias_target ());
2819 /* Walk the alias chain to return the symbol NODE is alias of.
2820 If NODE is not an alias, return NODE.
2821 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
2823 inline symtab_node *
2824 symtab_node::ultimate_alias_target (enum availability *availability)
2826 if (!alias)
2828 if (availability)
2829 *availability = get_availability ();
2830 return this;
2833 return ultimate_alias_target_1 (availability);
2836 /* Given function symbol, walk the alias chain to return the function node
2837 is alias of. Do not walk through thunks.
2838 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
2840 inline cgraph_node *
2841 cgraph_node::ultimate_alias_target (enum availability *availability)
2843 cgraph_node *n = dyn_cast <cgraph_node *>
2844 (symtab_node::ultimate_alias_target (availability));
2845 if (!n && availability)
2846 *availability = AVAIL_NOT_AVAILABLE;
2847 return n;
2850 /* For given variable pool node, walk the alias chain to return the function
2851 the variable is alias of. Do not walk through thunks.
2852 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
2854 inline varpool_node *
2855 varpool_node::ultimate_alias_target (availability *availability)
2857 varpool_node *n = dyn_cast <varpool_node *>
2858 (symtab_node::ultimate_alias_target (availability));
2860 if (!n && availability)
2861 *availability = AVAIL_NOT_AVAILABLE;
2862 return n;
2865 /* Set callee N of call graph edge and add it to the corresponding set of
2866 callers. */
2868 inline void
2869 cgraph_edge::set_callee (cgraph_node *n)
2871 prev_caller = NULL;
2872 if (n->callers)
2873 n->callers->prev_caller = this;
2874 next_caller = n->callers;
2875 n->callers = this;
2876 callee = n;
2879 /* Redirect callee of the edge to N. The function does not update underlying
2880 call expression. */
2882 inline void
2883 cgraph_edge::redirect_callee (cgraph_node *n)
2885 /* Remove from callers list of the current callee. */
2886 remove_callee ();
2888 /* Insert to callers list of the new callee. */
2889 set_callee (n);
2892 /* Return true when the edge represents a direct recursion. */
2894 inline bool
2895 cgraph_edge::recursive_p (void)
2897 cgraph_node *c = callee->ultimate_alias_target ();
2898 if (caller->global.inlined_to)
2899 return caller->global.inlined_to->decl == c->decl;
2900 else
2901 return caller->decl == c->decl;
2904 /* Remove the edge from the list of the callers of the callee. */
2906 inline void
2907 cgraph_edge::remove_callee (void)
2909 gcc_assert (!indirect_unknown_callee);
2910 if (prev_caller)
2911 prev_caller->next_caller = next_caller;
2912 if (next_caller)
2913 next_caller->prev_caller = prev_caller;
2914 if (!prev_caller)
2915 callee->callers = next_caller;
2918 /* Return true if the TM_CLONE bit is set for a given FNDECL. */
2919 static inline bool
2920 decl_is_tm_clone (const_tree fndecl)
2922 cgraph_node *n = cgraph_node::get (fndecl);
2923 if (n)
2924 return n->tm_clone;
2925 return false;
2928 /* Likewise indicate that a node is needed, i.e. reachable via some
2929 external means. */
2931 inline void
2932 cgraph_node::mark_force_output (void)
2934 force_output = 1;
2935 gcc_checking_assert (!global.inlined_to);
2938 /* Return true if function should be optimized for size. */
2940 inline bool
2941 cgraph_node::optimize_for_size_p (void)
2943 if (opt_for_fn (decl, optimize_size))
2944 return true;
2945 if (frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
2946 return true;
2947 else
2948 return false;
2951 /* Return symtab_node for NODE or create one if it is not present
2952 in symtab. */
2954 inline symtab_node *
2955 symtab_node::get_create (tree node)
2957 if (TREE_CODE (node) == VAR_DECL)
2958 return varpool_node::get_create (node);
2959 else
2960 return cgraph_node::get_create (node);
2963 /* Return availability of NODE. */
2965 inline enum availability
2966 symtab_node::get_availability (void)
2968 if (is_a <cgraph_node *> (this))
2969 return dyn_cast <cgraph_node *> (this)->get_availability ();
2970 else
2971 return dyn_cast <varpool_node *> (this)->get_availability ();;
2974 /* Call calback on symtab node and aliases associated to this node.
2975 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
2976 skipped. */
2978 inline bool
2979 symtab_node::call_for_symbol_and_aliases (bool (*callback) (symtab_node *,
2980 void *),
2981 void *data,
2982 bool include_overwritable)
2984 if (callback (this, data))
2985 return true;
2986 if (has_aliases_p ())
2987 return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
2988 return false;
2991 /* Call callback on function and aliases associated to the function.
2992 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
2993 skipped. */
2995 inline bool
2996 cgraph_node::call_for_symbol_and_aliases (bool (*callback) (cgraph_node *,
2997 void *),
2998 void *data,
2999 bool include_overwritable)
3001 if (callback (this, data))
3002 return true;
3003 if (has_aliases_p ())
3004 return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
3005 return false;
3008 /* Call calback on varpool symbol and aliases associated to varpool symbol.
3009 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
3010 skipped. */
3012 inline bool
3013 varpool_node::call_for_symbol_and_aliases (bool (*callback) (varpool_node *,
3014 void *),
3015 void *data,
3016 bool include_overwritable)
3018 if (callback (this, data))
3019 return true;
3020 if (has_aliases_p ())
3021 return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
3022 return false;
3025 /* Build polymorphic call context for indirect call E. */
3027 inline
3028 ipa_polymorphic_call_context::ipa_polymorphic_call_context (cgraph_edge *e)
3030 gcc_checking_assert (e->indirect_info->polymorphic);
3031 *this = e->indirect_info->context;
3034 /* Build empty "I know nothing" context. */
3036 inline
3037 ipa_polymorphic_call_context::ipa_polymorphic_call_context ()
3039 clear_speculation ();
3040 clear_outer_type ();
3041 invalid = false;
3044 /* Make context non-speculative. */
3046 inline void
3047 ipa_polymorphic_call_context::clear_speculation ()
3049 speculative_outer_type = NULL;
3050 speculative_offset = 0;
3051 speculative_maybe_derived_type = false;
3054 /* Produce context specifying all derrived types of OTR_TYPE. If OTR_TYPE is
3055 NULL, the context is set to dummy "I know nothing" setting. */
3057 inline void
3058 ipa_polymorphic_call_context::clear_outer_type (tree otr_type)
3060 outer_type = otr_type ? TYPE_MAIN_VARIANT (otr_type) : NULL;
3061 offset = 0;
3062 maybe_derived_type = true;
3063 maybe_in_construction = true;
3064 dynamic = true;
3067 /* Adjust all offsets in contexts by OFF bits. */
3069 inline void
3070 ipa_polymorphic_call_context::offset_by (HOST_WIDE_INT off)
3072 if (outer_type)
3073 offset += off;
3074 if (speculative_outer_type)
3075 speculative_offset += off;
3078 /* Return TRUE if context is fully useless. */
3080 inline bool
3081 ipa_polymorphic_call_context::useless_p () const
3083 return (!outer_type && !speculative_outer_type);
3086 /* Return true if NODE is local. Instrumentation clones are counted as local
3087 only when original function is local. */
3089 static inline bool
3090 cgraph_local_p (cgraph_node *node)
3092 if (!node->instrumentation_clone || !node->instrumented_version)
3093 return node->local.local;
3095 return node->local.local && node->instrumented_version->local.local;
3098 /* When using fprintf (or similar), problems can arise with
3099 transient generated strings. Many string-generation APIs
3100 only support one result being alive at once (e.g. by
3101 returning a pointer to a statically-allocated buffer).
3103 If there is more than one generated string within one
3104 fprintf call: the first string gets evicted or overwritten
3105 by the second, before fprintf is fully evaluated.
3106 See e.g. PR/53136.
3108 This function provides a workaround for this, by providing
3109 a simple way to create copies of these transient strings,
3110 without the need to have explicit cleanup:
3112 fprintf (dumpfile, "string 1: %s string 2:%s\n",
3113 xstrdup_for_dump (EXPR_1),
3114 xstrdup_for_dump (EXPR_2));
3116 This is actually a simple wrapper around ggc_strdup, but
3117 the name documents the intent. We require that no GC can occur
3118 within the fprintf call. */
3120 static inline const char *
3121 xstrdup_for_dump (const char *transient_str)
3123 return ggc_strdup (transient_str);
3126 #endif /* GCC_CGRAPH_H */