1 /* Callgraph handling code.
2 Copyright (C) 2003-2022 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #ifndef GCC_CGRAPH_H
22 #define GCC_CGRAPH_H
23
24 #include "profile-count.h"
25 #include "ipa-ref.h"
26 #include "plugin-api.h"
27 #include "ipa-param-manipulation.h"
28
29 extern void debuginfo_early_init (void);
30 extern void debuginfo_init (void);
31 extern void debuginfo_fini (void);
32 extern void debuginfo_start (void);
33 extern void debuginfo_stop (void);
34 extern void debuginfo_early_start (void);
35 extern void debuginfo_early_stop (void);
36
37 class ipa_opt_pass_d;
38 typedef ipa_opt_pass_d *ipa_opt_pass;
39
40 /* Symbol table consists of functions and variables.
41 TODO: add labels and CONST_DECLs. */
42 enum symtab_type
43 {
44 SYMTAB_SYMBOL,
45 SYMTAB_FUNCTION,
46 SYMTAB_VARIABLE
47 };
48
49 /* Section names are stored as reference counted strings in GGC safe hashtable
50 (to make them survive through PCH). */
51
52 struct GTY((for_user)) section_hash_entry
53 {
54 int ref_count;
55 char *name; /* As long as this datastructure stays in GGC, we cannot put
56 string at the tail of structure of GGC dies in horrible
57 way */
58 };
59
60 struct section_name_hasher : ggc_ptr_hash<section_hash_entry>
61 {
62 typedef const char *compare_type;
63
64 static hashval_t hash (section_hash_entry *);
65 static bool equal (section_hash_entry *, const char *);
66 };
67
68 enum availability
69 {
70 /* Not yet set by cgraph_function_body_availability. */
71 AVAIL_UNSET,
72 /* Function body/variable initializer is unknown. */
73 AVAIL_NOT_AVAILABLE,
74 /* Function body/variable initializer is known but might be replaced
75 by a different one from other compilation unit and thus needs to
76 be dealt with a care. Like AVAIL_NOT_AVAILABLE it can have
77 arbitrary side effects on escaping variables and functions, while
78 like AVAILABLE it might access static variables. */
79 AVAIL_INTERPOSABLE,
80 /* Function body/variable initializer is known and will be used in final
81 program. */
82 AVAIL_AVAILABLE,
83 /* Function body/variable initializer is known and all it's uses are
84 explicitly visible within current unit (i.e. it's address is never taken
85 and it is not exported to other units). Currently used only for
86 functions. */
87 AVAIL_LOCAL
88 };
89
90 /* Classification of symbols WRT partitioning. */
91 enum symbol_partitioning_class
92 {
93 /* External declarations are ignored by partitioning algorithms and they are
94 added into the boundary later via compute_ltrans_boundary. */
95 SYMBOL_EXTERNAL,
96 /* Partitioned symbols are put into one of partitions. */
97 SYMBOL_PARTITION,
98 /* Duplicated symbols (such as comdat or constant pool references) are
99 copied into every node needing them via add_symbol_to_partition. */
100 SYMBOL_DUPLICATE
101 };
102
103 /* Base of all entries in the symbol table.
104 The symtab_node is inherited by cgraph and varpol nodes. */
105 struct GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"),
106 chain_next ("%h.next"), chain_prev ("%h.previous")))
107 symtab_node
108 {
109 public:
110 friend class symbol_table;
111
112 /* Constructor. */
symtab_nodesymtab_node113 explicit symtab_node (symtab_type t)
114 : type (t), resolution (LDPR_UNKNOWN), definition (false), alias (false),
115 transparent_alias (false), weakref (false), cpp_implicit_alias (false),
116 symver (false), analyzed (false), writeonly (false),
117 refuse_visibility_changes (false), externally_visible (false),
118 no_reorder (false), force_output (false), forced_by_abi (false),
119 unique_name (false), implicit_section (false), body_removed (false),
120 semantic_interposition (flag_semantic_interposition),
121 used_from_other_partition (false), in_other_partition (false),
122 address_taken (false), in_init_priority_hash (false),
123 need_lto_streaming (false), offloadable (false), ifunc_resolver (false),
124 order (false), next_sharing_asm_name (NULL),
125 previous_sharing_asm_name (NULL), same_comdat_group (NULL), ref_list (),
126 alias_target (NULL), lto_file_data (NULL), aux (NULL),
127 x_comdat_group (NULL_TREE), x_section (NULL)
128 {}
129
130 /* Return name. */
131 const char *name () const;
132
133 /* Return dump name. */
134 const char *dump_name () const;
135
136 /* Return asm name. */
137 const char *asm_name () const;
138
139 /* Return dump name with assembler name. */
140 const char *dump_asm_name () const;
141
142 /* Return visibility name. */
143 const char *get_visibility_string () const;
144
145 /* Return type_name name. */
146 const char *get_symtab_type_string () const;
147
148 /* Add node into symbol table. This function is not used directly, but via
149 cgraph/varpool node creation routines. */
150 void register_symbol (void);
151
152 /* Remove symbol from symbol table. */
153 void remove (void);
154
155 /* Dump symtab node to F. */
156 void dump (FILE *f);
157
158 /* Dump symtab callgraph in graphviz format. */
159 void dump_graphviz (FILE *f);
160
161 /* Dump symtab node to stderr. */
162 void DEBUG_FUNCTION debug (void);
163
164 /* Verify consistency of node. */
165 void DEBUG_FUNCTION verify (void);
166
167 /* Return ipa reference from this symtab_node to
168 REFERRED_NODE or REFERRED_VARPOOL_NODE. USE_TYPE specify type
169 of the use and STMT the statement (if it exists). */
170 ipa_ref *create_reference (symtab_node *referred_node,
171 enum ipa_ref_use use_type);
172
173 /* Return ipa reference from this symtab_node to
174 REFERRED_NODE or REFERRED_VARPOOL_NODE. USE_TYPE specify type
175 of the use and STMT the statement (if it exists). */
176 ipa_ref *create_reference (symtab_node *referred_node,
177 enum ipa_ref_use use_type, gimple *stmt);
178
179 /* If VAL is a reference to a function or a variable, add a reference from
180 this symtab_node to the corresponding symbol table node. Return the new
181 reference or NULL if none was created. */
182 ipa_ref *maybe_create_reference (tree val, gimple *stmt);
183
184 /* Clone all references from symtab NODE to this symtab_node. */
185 void clone_references (symtab_node *node);
186
187 /* Remove all stmt references in non-speculative references.
188 Those are not maintained during inlining & clonning.
189 The exception are speculative references that are updated along
190 with callgraph edges associated with them. */
191 void clone_referring (symtab_node *node);
192
193 /* Clone reference REF to this symtab_node and set its stmt to STMT. */
194 ipa_ref *clone_reference (ipa_ref *ref, gimple *stmt);
195
196 /* Find the structure describing a reference to REFERRED_NODE of USE_TYPE and
197 associated with statement STMT or LTO_STMT_UID. */
198 ipa_ref *find_reference (symtab_node *referred_node, gimple *stmt,
199 unsigned int lto_stmt_uid,
200 enum ipa_ref_use use_type);
201
202 /* Remove all references that are associated with statement STMT. */
203 void remove_stmt_references (gimple *stmt);
204
205 /* Remove all stmt references in non-speculative references.
206 Those are not maintained during inlining & clonning.
207 The exception are speculative references that are updated along
208 with callgraph edges associated with them. */
209 void clear_stmts_in_references (void);
210
211 /* Remove all references in ref list. */
212 void remove_all_references (void);
213
214 /* Remove all referring items in ref list. */
215 void remove_all_referring (void);
216
217 /* Dump references in ref list to FILE. */
218 void dump_references (FILE *file);
219
220 /* Dump referring in list to FILE. */
221 void dump_referring (FILE *);
222
223 /* Get number of references for this node. */
num_referencessymtab_node224 inline unsigned num_references (void)
225 {
226 return ref_list.references.length ();
227 }
228
229 /* Iterates I-th reference in the list, REF is also set. */
230 ipa_ref *iterate_reference (unsigned i, ipa_ref *&ref);
231
232 /* Iterates I-th referring item in the list, REF is also set. */
233 ipa_ref *iterate_referring (unsigned i, ipa_ref *&ref);
234
235 /* Iterates I-th referring alias item in the list, REF is also set. */
236 ipa_ref *iterate_direct_aliases (unsigned i, ipa_ref *&ref);
237
238 /* Return true if symtab node and TARGET represents
239 semantically equivalent symbols. */
240 bool semantically_equivalent_p (symtab_node *target);
241
242 /* Classify symbol symtab node for partitioning. */
243 enum symbol_partitioning_class get_partitioning_class (void);
244
245 /* Return comdat group. */
get_comdat_groupsymtab_node246 tree get_comdat_group ()
247 {
248 return x_comdat_group;
249 }
250
251 /* Return comdat group as identifier_node. */
get_comdat_group_idsymtab_node252 tree get_comdat_group_id ()
253 {
254 if (x_comdat_group && TREE_CODE (x_comdat_group) != IDENTIFIER_NODE)
255 x_comdat_group = DECL_ASSEMBLER_NAME (x_comdat_group);
256 return x_comdat_group;
257 }
258
259 /* Set comdat group. */
set_comdat_groupsymtab_node260 void set_comdat_group (tree group)
261 {
262 gcc_checking_assert (!group || TREE_CODE (group) == IDENTIFIER_NODE
263 || DECL_P (group));
264 x_comdat_group = group;
265 }
266
267 /* Return section as string. */
get_sectionsymtab_node268 const char * get_section () const
269 {
270 if (!x_section)
271 return NULL;
272 return x_section->name;
273 }
274
275 /* Remove node from same comdat group. */
276 void remove_from_same_comdat_group (void);
277
278 /* Add this symtab_node to the same comdat group that OLD is in. */
279 void add_to_same_comdat_group (symtab_node *old_node);
280
281 /* Dissolve the same_comdat_group list in which NODE resides. */
282 void dissolve_same_comdat_group_list (void);
283
284 /* Return true when symtab_node is known to be used from other (non-LTO)
285 object file. Known only when doing LTO via linker plugin. */
286 bool used_from_object_file_p (void);
287
288 /* Walk the alias chain to return the symbol NODE is alias of.
289 If NODE is not an alias, return NODE.
290 When AVAILABILITY is non-NULL, get minimal availability in the chain.
291 When REF is non-NULL, assume that reference happens in symbol REF
292 when determining the availability. */
293 symtab_node *ultimate_alias_target (enum availability *avail = NULL,
294 struct symtab_node *ref = NULL);
295
296 /* Return next reachable static symbol with initializer after NODE. */
297 inline symtab_node *next_defined_symbol (void);
298
299 /* Add reference recording that symtab node is alias of TARGET.
300 If TRANSPARENT is true make the alias to be transparent alias.
301 The function can fail in the case of aliasing cycles; in this case
302 it returns false. */
303 bool resolve_alias (symtab_node *target, bool transparent = false);
304
305 /* C++ FE sometimes change linkage flags after producing same
306 body aliases. */
307 void fixup_same_cpp_alias_visibility (symtab_node *target);
308
309 /* Call callback on symtab node and aliases associated to this node.
310 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
311 skipped. */
312 bool call_for_symbol_and_aliases (bool (*callback) (symtab_node *, void *),
313 void *data,
314 bool include_overwrite);
315
316 /* If node cannot be interposable by static or dynamic linker to point to
317 different definition, return this symbol. Otherwise look for alias with
318 such property and if none exists, introduce new one. */
319 symtab_node *noninterposable_alias (void);
320
321 /* Return node that alias is aliasing. */
322 inline symtab_node *get_alias_target (void);
323
324 /* Return DECL that alias is aliasing. */
325 inline tree get_alias_target_tree ();
326
327 /* Set section for symbol and its aliases. */
328 void set_section (const char *section);
329
330 /* Like set_section, but copying the section name from another node. */
331 void set_section (const symtab_node &other);
332
333 /* Set section, do not recurse into aliases.
334 When one wants to change section of symbol and its aliases,
335 use set_section. */
336 void set_section_for_node (const char *section);
337
338 /* Like set_section_for_node, but copying the section name from another
339 node. */
340 void set_section_for_node (const symtab_node &other);
341
342 /* Set initialization priority to PRIORITY. */
343 void set_init_priority (priority_type priority);
344
345 /* Return the initialization priority. */
346 priority_type get_init_priority ();
347
348 /* Return availability of NODE when referenced from REF. */
349 enum availability get_availability (symtab_node *ref = NULL);
350
351 /* During LTO stream-in this predicate can be used to check whether node
352 in question prevails in the linking to save some memory usage. */
353 bool prevailing_p (void);
354
355 /* Return true if NODE binds to current definition in final executable
356 when referenced from REF. If REF is NULL return conservative value
357 for any reference. */
358 bool binds_to_current_def_p (symtab_node *ref = NULL);
359
360 /* Make DECL local. */
361 void make_decl_local (void);
362
363 /* Copy visibility from N. */
364 void copy_visibility_from (symtab_node *n);
365
366 /* Return desired alignment of the definition. This is NOT alignment useful
367 to access THIS, because THIS may be interposable and DECL_ALIGN should
368 be used instead. It however must be guaranteed when output definition
369 of THIS. */
370 unsigned int definition_alignment ();
371
372 /* Return true if alignment can be increased. */
373 bool can_increase_alignment_p ();
374
375 /* Increase alignment of symbol to ALIGN. */
376 void increase_alignment (unsigned int align);
377
378 /* Return true if list contains an alias. */
379 bool has_aliases_p (void);
380
381 /* Return true when the symbol is real symbol, i.e. it is not inline clone
382 or abstract function kept for debug info purposes only. */
383 bool real_symbol_p (void);
384
385 /* Return true when the symbol needs to be output to the LTO symbol table. */
386 bool output_to_lto_symbol_table_p (void);
387
388 /* Determine if symbol declaration is needed. That is, visible to something
389 either outside this translation unit, something magic in the system
390 configury. This function is used just during symbol creation. */
391 bool needed_p (void);
392
393 /* Return true if this symbol is a function from the C frontend specified
394 directly in RTL form (with "__RTL"). */
395 bool native_rtl_p () const;
396
397 /* Return true when there are references to the node. */
398 bool referred_to_p (bool include_self = true);
399
400 /* Return true if symbol can be discarded by linker from the binary.
401 Assume that symbol is used (so there is no need to take into account
402 garbage collecting linkers)
403
404 This can happen for comdats, commons and weaks when they are prevailed
405 by other definition at static linking time. */
406 inline bool
can_be_discarded_psymtab_node407 can_be_discarded_p (void)
408 {
409 return ((DECL_EXTERNAL (decl)
410 && !in_other_partition)
411 || ((get_comdat_group ()
412 || DECL_COMMON (decl)
413 || (DECL_SECTION_NAME (decl) && DECL_WEAK (decl)))
414 && ((resolution != LDPR_PREVAILING_DEF
415 && resolution != LDPR_PREVAILING_DEF_IRONLY_EXP)
416 || flag_incremental_link)
417 && resolution != LDPR_PREVAILING_DEF_IRONLY));
418 }
419
420 /* Return true if NODE is local to a particular COMDAT group, and must not
421 be named from outside the COMDAT. This is used for C++ decloned
422 constructors. */
comdat_local_psymtab_node423 inline bool comdat_local_p (void)
424 {
425 return (same_comdat_group && !TREE_PUBLIC (decl));
426 }
427
428 /* Return true if ONE and TWO are part of the same COMDAT group. */
429 inline bool in_same_comdat_group_p (symtab_node *target);
430
431 /* Return true if symbol is known to be nonzero. */
432 bool nonzero_address ();
433
434 /* Return 0 if symbol is known to have different address than S2,
435 Return 1 if symbol is known to have same address as S2,
436 return 2 otherwise.
437
438 If MEMORY_ACCESSED is true, assume that both memory pointer to THIS
439 and S2 is going to be accessed. This eliminates the situations when
440 either THIS or S2 is NULL and is useful for comparing bases when deciding
441 about memory aliasing. */
442 int equal_address_to (symtab_node *s2, bool memory_accessed = false);
443
444 /* Return true if symbol's address may possibly be compared to other
445 symbol's address. */
446 bool address_matters_p ();
447
448 /* Return true if NODE's address can be compared. This use properties
449 of NODE only and does not look if the address is actually taken in
450 interesting way. For that use ADDRESS_MATTERS_P instead. */
451 bool address_can_be_compared_p (void);
452
453 /* Return symbol table node associated with DECL, if any,
454 and NULL otherwise. */
getsymtab_node455 static inline symtab_node *get (const_tree decl)
456 {
457 /* Check that we are called for sane type of object - functions
458 and static or external variables. */
459 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL
460 || (TREE_CODE (decl) == VAR_DECL
461 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
462 || in_lto_p)));
463 /* Check that the mapping is sane - perhaps this check can go away,
464 but at the moment frontends tends to corrupt the mapping by calling
465 memcpy/memset on the tree nodes. */
466 gcc_checking_assert (!decl->decl_with_vis.symtab_node
467 || decl->decl_with_vis.symtab_node->decl == decl);
468 return decl->decl_with_vis.symtab_node;
469 }
470
471 /* Try to find a symtab node for declaration DECL and if it does not
472 exist or if it corresponds to an inline clone, create a new one. */
473 static inline symtab_node * get_create (tree node);
474
475 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
476 Return NULL if there's no such node. */
477 static symtab_node *get_for_asmname (const_tree asmname);
478
479 /* Check symbol table for callees of IFUNC resolvers. */
480 static void check_ifunc_callee_symtab_nodes (void);
481
482 /* Verify symbol table for internal consistency. */
483 static DEBUG_FUNCTION void verify_symtab_nodes (void);
484
485 /* Perform internal consistency checks, if they are enabled. */
486 static inline void checking_verify_symtab_nodes (void);
487
488 /* Type of the symbol. */
489 ENUM_BITFIELD (symtab_type) type : 8;
490
491 /* The symbols resolution. */
492 ENUM_BITFIELD (ld_plugin_symbol_resolution) resolution : 8;
493
494 /*** Flags representing the symbol type. ***/
495
496 /* True when symbol corresponds to a definition in current unit.
497 set via finalize_function or finalize_decl */
498 unsigned definition : 1;
499 /* True when symbol is an alias.
500 Set by assemble_alias. */
501 unsigned alias : 1;
502 /* When true the alias is translated into its target symbol either by GCC
503 or assembler (it also may just be a duplicate declaration of the same
504 linker name).
505
506 Currently transparent aliases come in three different flavors
507 - aliases having the same assembler name as their target (aka duplicated
508 declarations). In this case the assembler names compare via
509 assembler_names_equal_p and weakref is false
510 - aliases that are renamed at a time being output to final file
511 by varasm.cc. For those DECL_ASSEMBLER_NAME have
512 IDENTIFIER_TRANSPARENT_ALIAS set and thus also their assembler
513 name must be unique.
514 Weakrefs belong to this category when we target assembler without
515 .weakref directive.
516 - weakrefs that are renamed by assembler via .weakref directive.
517 In this case the alias may or may not be definition (depending if
518 target declaration was seen by the compiler), weakref is set.
519 Unless we are before renaming statics, assembler names are different.
520
521 Given that we now support duplicate declarations, the second option is
522 redundant and will be removed. */
523 unsigned transparent_alias : 1;
524 /* True when alias is a weakref. */
525 unsigned weakref : 1;
526 /* C++ frontend produce same body aliases and extra name aliases for
527 virtual functions and vtables that are obviously equivalent.
528 Those aliases are bit special, especially because C++ frontend
529 visibility code is so ugly it cannot get them right at first time
530 and their visibility needs to be copied from their "masters" at
531 the end of parsing. */
532 unsigned cpp_implicit_alias : 1;
533 /* The alias is a symbol version. */
534 unsigned symver : 1;
535 /* Set once the definition was analyzed. The list of references and
536 other properties are built during analysis. */
537 unsigned analyzed : 1;
538 /* Set for write-only variables. */
539 unsigned writeonly : 1;
540 /* Visibility of symbol was used for further optimization; do not
541 permit further changes. */
542 unsigned refuse_visibility_changes : 1;
543
544 /*** Visibility and linkage flags. ***/
545
546 /* Set when function is visible by other units. */
547 unsigned externally_visible : 1;
548 /* Don't reorder to other symbols having this set. */
549 unsigned no_reorder : 1;
550 /* The symbol will be assumed to be used in an invisible way (like
551 by an toplevel asm statement). */
552 unsigned force_output : 1;
553 /* Like FORCE_OUTPUT, but in the case it is ABI requiring the symbol to be
554 exported. Unlike FORCE_OUTPUT this flag gets cleared to symbols promoted
555 to static and it does not inhibit optimization. */
556 unsigned forced_by_abi : 1;
557 /* True when the name is known to be unique and thus it does not need mangling. */
558 unsigned unique_name : 1;
559 /* Specify whether the section was set by user or by
560 compiler via -ffunction-sections. */
561 unsigned implicit_section : 1;
562 /* True when body and other characteristics have been removed by
563 symtab_remove_unreachable_nodes. */
564 unsigned body_removed : 1;
565 /* True when symbol should comply to -fsemantic-interposition flag. */
566 unsigned semantic_interposition : 1;
567
568 /*** WHOPR Partitioning flags.
569 These flags are used at ltrans stage when only part of the callgraph is
570 available. ***/
571
572 /* Set when variable is used from other LTRANS partition. */
573 unsigned used_from_other_partition : 1;
574 /* Set when function is available in the other LTRANS partition.
575 During WPA output it is used to mark nodes that are present in
576 multiple partitions. */
577 unsigned in_other_partition : 1;
578
579
580
581 /*** other flags. ***/
582
583 /* Set when symbol has address taken. */
584 unsigned address_taken : 1;
585 /* Set when init priority is set. */
586 unsigned in_init_priority_hash : 1;
587
588 /* Set when symbol needs to be streamed into LTO bytecode for LTO, or in case
589 of offloading, for separate compilation for a different target. */
590 unsigned need_lto_streaming : 1;
591
592 /* Set when symbol can be streamed into bytecode for offloading. */
593 unsigned offloadable : 1;
594
595 /* Set when symbol is an IFUNC resolver. */
596 unsigned ifunc_resolver : 1;
597
598
599 /* Ordering of all symtab entries. */
600 int order;
601
602 /* Declaration representing the symbol. */
603 tree decl;
604
605 /* Linked list of symbol table entries starting with symtab_nodes. */
606 symtab_node *next;
607 symtab_node *previous;
608
609 /* Linked list of symbols with the same asm name. There may be multiple
610 entries for single symbol name during LTO, because symbols are renamed
611 only after partitioning.
612
613 Because inline clones are kept in the assembler name has, they also produce
614 duplicate entries.
615
616 There are also several long standing bugs where frontends and builtin
617 code produce duplicated decls. */
618 symtab_node *next_sharing_asm_name;
619 symtab_node *previous_sharing_asm_name;
620
621 /* Circular list of nodes in the same comdat group if non-NULL. */
622 symtab_node *same_comdat_group;
623
624 /* Vectors of referring and referenced entities. */
625 ipa_ref_list GTY((skip)) ref_list;
626
627 /* Alias target. May be either DECL pointer or ASSEMBLER_NAME pointer
628 depending to what was known to frontend on the creation time.
629 Once alias is resolved, this pointer become NULL. */
630 tree alias_target;
631
632 /* File stream where this node is being written to. */
633 struct lto_file_decl_data * lto_file_data;
634
635 PTR GTY ((skip)) aux;
636
637 /* Comdat group the symbol is in. Can be private if GGC allowed that. */
638 tree x_comdat_group;
639
640 /* Section name. Again can be private, if allowed. */
641 section_hash_entry *x_section;
642
643 protected:
644 /* Dump base fields of symtab nodes to F. Not to be used directly. */
645 void dump_base (FILE *);
646
647 /* Verify common part of symtab node. */
648 bool DEBUG_FUNCTION verify_base (void);
649
650 /* Remove node from symbol table. This function is not used directly, but via
651 cgraph/varpool node removal routines. */
652 void unregister (struct clone_info *);
653
654 /* Return the initialization and finalization priority information for
655 DECL. If there is no previous priority information, a freshly
656 allocated structure is returned. */
657 struct symbol_priority_map *priority_info (void);
658
659 /* Worker for call_for_symbol_and_aliases_1. */
660 bool call_for_symbol_and_aliases_1 (bool (*callback) (symtab_node *, void *),
661 void *data,
662 bool include_overwrite);
663 private:
664 /* Workers for set_section. */
665 static bool set_section_from_string (symtab_node *n, void *s);
666 static bool set_section_from_node (symtab_node *n, void *o);
667
668 /* Worker for symtab_resolve_alias. */
669 static bool set_implicit_section (symtab_node *n, void *);
670
671 /* Worker searching noninterposable alias. */
672 static bool noninterposable_alias (symtab_node *node, void *data);
673
674 /* Worker for ultimate_alias_target. */
675 symtab_node *ultimate_alias_target_1 (enum availability *avail = NULL,
676 symtab_node *ref = NULL);
677
678 /* Get dump name with normal or assembly name. */
679 const char *get_dump_name (bool asm_name_p) const;
680 };
681
682 inline void
checking_verify_symtab_nodes(void)683 symtab_node::checking_verify_symtab_nodes (void)
684 {
685 if (flag_checking)
686 symtab_node::verify_symtab_nodes ();
687 }
688
689 /* Walk all aliases for NODE. */
690 #define FOR_EACH_ALIAS(NODE, ALIAS) \
691 for (unsigned ALIAS##_iter_ = 0; \
692 (NODE)->iterate_direct_aliases (ALIAS##_iter_, ALIAS); \
693 ALIAS##_iter_++)
694
695 /* This is the information that is put into the cgraph local structure
696 to recover a function. */
697 struct lto_file_decl_data;
698
699 extern const char * const cgraph_availability_names[];
700 extern const char * const ld_plugin_symbol_resolution_names[];
701 extern const char * const tls_model_names[];
702
703 /* Represent which DECL tree (or reference to such tree)
704 will be replaced by another tree while versioning. */
705 struct GTY(()) ipa_replace_map
706 {
707 /* The new (replacing) tree. */
708 tree new_tree;
709 /* Parameter number to replace, when old_tree is NULL. */
710 int parm_num;
711 /* Set if the newly added reference should not be an address one, but a load
712 one from the operand of the ADDR_EXPR in NEW_TREE. This is for cases when
713 the corresponding parameter p is used only as *p. */
714 unsigned force_load_ref : 1;
715 };
716
717 enum cgraph_simd_clone_arg_type
718 {
719 SIMD_CLONE_ARG_TYPE_VECTOR,
720 SIMD_CLONE_ARG_TYPE_UNIFORM,
721 /* These are only for integer/pointer arguments passed by value. */
722 SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP,
723 SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP,
724 /* These 6 are only for reference type arguments or arguments passed
725 by reference. */
726 SIMD_CLONE_ARG_TYPE_LINEAR_REF_CONSTANT_STEP,
727 SIMD_CLONE_ARG_TYPE_LINEAR_REF_VARIABLE_STEP,
728 SIMD_CLONE_ARG_TYPE_LINEAR_UVAL_CONSTANT_STEP,
729 SIMD_CLONE_ARG_TYPE_LINEAR_UVAL_VARIABLE_STEP,
730 SIMD_CLONE_ARG_TYPE_LINEAR_VAL_CONSTANT_STEP,
731 SIMD_CLONE_ARG_TYPE_LINEAR_VAL_VARIABLE_STEP,
732 SIMD_CLONE_ARG_TYPE_MASK
733 };
734
735 /* Function arguments in the original function of a SIMD clone.
736 Supplementary data for `struct simd_clone'. */
737
738 struct GTY(()) cgraph_simd_clone_arg {
739 /* Original function argument as it originally existed in
740 DECL_ARGUMENTS. */
741 tree orig_arg;
742
743 /* orig_arg's function (or for extern functions type from
744 TYPE_ARG_TYPES). */
745 tree orig_type;
746
747 /* If argument is a vector, this holds the vector version of
748 orig_arg that after adjusting the argument types will live in
749 DECL_ARGUMENTS. Otherwise, this is NULL.
750
751 This basically holds:
752 vector(simdlen) __typeof__(orig_arg) new_arg. */
753 tree vector_arg;
754
755 /* vector_arg's type (or for extern functions new vector type. */
756 tree vector_type;
757
758 /* If argument is a vector, this holds the array where the simd
759 argument is held while executing the simd clone function. This
760 is a local variable in the cloned function. Its content is
761 copied from vector_arg upon entry to the clone.
762
763 This basically holds:
764 __typeof__(orig_arg) simd_array[simdlen]. */
765 tree simd_array;
766
767 /* A SIMD clone's argument can be either linear (constant or
768 variable), uniform, or vector. */
769 enum cgraph_simd_clone_arg_type arg_type;
770
771 /* Variable alignment if available, otherwise 0. */
772 unsigned int alignment;
773
774 /* For arg_type SIMD_CLONE_ARG_TYPE_LINEAR_*CONSTANT_STEP this is
775 the constant linear step, if arg_type is
776 SIMD_CLONE_ARG_TYPE_LINEAR_*VARIABLE_STEP, this is index of
777 the uniform argument holding the step, otherwise 0. */
778 HOST_WIDE_INT linear_step;
779 };
780
781 /* Specific data for a SIMD function clone. */
782
783 struct GTY(()) cgraph_simd_clone {
784 /* Number of words in the SIMD lane associated with this clone. */
785 poly_uint64 simdlen;
786
787 /* Number of annotated function arguments in `args'. This is
788 usually the number of named arguments in FNDECL. */
789 unsigned int nargs;
790
791 /* Max hardware vector size in bits for integral vectors. */
792 poly_uint64 vecsize_int;
793
794 /* Max hardware vector size in bits for floating point vectors. */
795 poly_uint64 vecsize_float;
796
797 /* Machine mode of the mask argument(s), if they are to be passed
798 as bitmasks in integer argument(s). VOIDmode if masks are passed
799 as vectors of characteristic type. */
800 machine_mode mask_mode;
801
802 /* The mangling character for a given vector size. This is used
803 to determine the ISA mangling bit as specified in the Intel
804 Vector ABI. */
805 unsigned char vecsize_mangle;
806
807 /* True if this is the masked, in-branch version of the clone,
808 otherwise false. */
809 unsigned int inbranch : 1;
810
811 /* Doubly linked list of SIMD clones. */
812 cgraph_node *prev_clone, *next_clone;
813
814 /* Original cgraph node the SIMD clones were created for. */
815 cgraph_node *origin;
816
817 /* Annotated function arguments for the original function. */
818 cgraph_simd_clone_arg GTY((length ("%h.nargs"))) args[1];
819 };
820
821 /* Function Multiversioning info. */
822 struct GTY((for_user)) cgraph_function_version_info {
823 /* The cgraph_node for which the function version info is stored. */
824 cgraph_node *this_node;
825 /* Chains all the semantically identical function versions. The
826 first function in this chain is the version_info node of the
827 default function. */
828 cgraph_function_version_info *prev;
829 /* If this version node corresponds to a dispatcher for function
830 versions, this points to the version info node of the default
831 function, the first node in the chain. */
832 cgraph_function_version_info *next;
833 /* If this node corresponds to a function version, this points
834 to the dispatcher function decl, which is the function that must
835 be called to execute the right function version at run-time.
836
837 If this cgraph node is a dispatcher (if dispatcher_function is
838 true, in the cgraph_node struct) for function versions, this
839 points to resolver function, which holds the function body of the
840 dispatcher. The dispatcher decl is an alias to the resolver
841 function decl. */
842 tree dispatcher_resolver;
843 };
844
845 #define DEFCIFCODE(code, type, string) CIF_ ## code,
846 /* Reasons for inlining failures. */
847
848 enum cgraph_inline_failed_t {
849 #include "cif-code.def"
850 CIF_N_REASONS
851 };
852
853 enum cgraph_inline_failed_type_t
854 {
855 CIF_FINAL_NORMAL = 0,
856 CIF_FINAL_ERROR
857 };
858
859 struct cgraph_edge;
860
861 struct cgraph_edge_hasher : ggc_ptr_hash<cgraph_edge>
862 {
863 typedef gimple *compare_type;
864
865 static hashval_t hash (cgraph_edge *);
866 static hashval_t hash (gimple *);
867 static bool equal (cgraph_edge *, gimple *);
868 };
869
870 /* The cgraph data structure.
871 Each function decl has assigned cgraph_node listing callees and callers. */
872
873 struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node
874 {
875 friend class symbol_table;
876
877 /* Constructor. */
cgraph_nodecgraph_node878 explicit cgraph_node (int uid)
879 : symtab_node (SYMTAB_FUNCTION), callees (NULL), callers (NULL),
880 indirect_calls (NULL),
881 next_sibling_clone (NULL), prev_sibling_clone (NULL), clones (NULL),
882 clone_of (NULL), call_site_hash (NULL), former_clone_of (NULL),
883 simdclone (NULL), simd_clones (NULL), ipa_transforms_to_apply (vNULL),
884 inlined_to (NULL), rtl (NULL),
885 count (profile_count::uninitialized ()),
886 count_materialization_scale (REG_BR_PROB_BASE), profile_id (0),
887 unit_id (0), tp_first_run (0), thunk (false),
888 used_as_abstract_origin (false),
889 lowered (false), process (false), frequency (NODE_FREQUENCY_NORMAL),
890 only_called_at_startup (false), only_called_at_exit (false),
891 tm_clone (false), dispatcher_function (false), calls_comdat_local (false),
892 icf_merged (false), nonfreeing_fn (false), merged_comdat (false),
893 merged_extern_inline (false), parallelized_function (false),
894 split_part (false), indirect_call_target (false), local (false),
895 versionable (false), can_change_signature (false),
896 redefined_extern_inline (false), tm_may_enter_irr (false),
897 ipcp_clone (false), declare_variant_alt (false),
898 calls_declare_variant_alt (false),
899 called_by_ifunc_resolver (false),
900 m_uid (uid), m_summary_id (-1)
901 {}
902
903 /* Remove the node from cgraph and all inline clones inlined into it.
904 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
905 removed. This allows to call the function from outer loop walking clone
906 tree. */
907 bool remove_symbol_and_inline_clones (cgraph_node *forbidden_node = NULL);
908
909 /* Record all references from cgraph_node that are taken
910 in statement STMT. */
911 void record_stmt_references (gimple *stmt);
912
913 /* Like cgraph_set_call_stmt but walk the clone tree and update all
914 clones sharing the same function body.
915 When WHOLE_SPECULATIVE_EDGES is true, all three components of
916 speculative edge gets updated. Otherwise we update only direct
917 call. */
918 void set_call_stmt_including_clones (gimple *old_stmt, gcall *new_stmt,
919 bool update_speculative = true);
920
921 /* Walk the alias chain to return the function cgraph_node is alias of.
922 Walk through thunk, too.
923 When AVAILABILITY is non-NULL, get minimal availability in the chain.
924 When REF is non-NULL, assume that reference happens in symbol REF
925 when determining the availability. */
926 cgraph_node *function_symbol (enum availability *avail = NULL,
927 struct symtab_node *ref = NULL);
928
929 /* Walk the alias chain to return the function cgraph_node is alias of.
930 Walk through non virtual thunks, too. Thus we return either a function
931 or a virtual thunk node.
932 When AVAILABILITY is non-NULL, get minimal availability in the chain.
933 When REF is non-NULL, assume that reference happens in symbol REF
934 when determining the availability. */
935 cgraph_node *function_or_virtual_thunk_symbol
936 (enum availability *avail = NULL,
937 struct symtab_node *ref = NULL);
938
939 /* Create node representing clone of N executed COUNT times. Decrease
940 the execution counts from original node too.
941 The new clone will have decl set to DECL that may or may not be the same
942 as decl of N.
943
944 When UPDATE_ORIGINAL is true, the counts are subtracted from the original
945 function's profile to reflect the fact that part of execution is handled
946 by node.
947 When CALL_DUPLICATION_HOOK is true, the ipa passes are acknowledged about
948 the new clone. Otherwise the caller is responsible for doing so later.
949
950 If the new node is being inlined into another one, NEW_INLINED_TO should be
951 the outline function the new one is (even indirectly) inlined to.
952 All hooks will see this in node's inlined_to, when invoked.
953 Can be NULL if the node is not inlined. SUFFIX is string that is appended
954 to the original name. */
955 cgraph_node *create_clone (tree decl, profile_count count,
956 bool update_original,
957 vec<cgraph_edge *> redirect_callers,
958 bool call_duplication_hook,
959 cgraph_node *new_inlined_to,
960 ipa_param_adjustments *param_adjustments,
961 const char *suffix = NULL);
962
963 /* Create callgraph node clone with new declaration. The actual body will be
964 copied later at compilation stage. The name of the new clone will be
965 constructed from the name of the original node, SUFFIX and NUM_SUFFIX. */
966 cgraph_node *create_virtual_clone (const vec<cgraph_edge *> &redirect_callers,
967 vec<ipa_replace_map *, va_gc> *tree_map,
968 ipa_param_adjustments *param_adjustments,
969 const char * suffix, unsigned num_suffix);
970
971 /* Remove the node from the tree of virtual and inline clones and make it a
972 standalone node - not a clone any more. */
973 void remove_from_clone_tree ();
974
975 /* cgraph node being removed from symbol table; see if its entry can be
976 replaced by other inline clone. */
977 cgraph_node *find_replacement (struct clone_info *);
978
979 /* Create a new cgraph node which is the new version of
980 callgraph node. REDIRECT_CALLERS holds the callers
981 edges which should be redirected to point to
982 NEW_VERSION. ALL the callees edges of the node
983 are cloned to the new version node. Return the new
984 version node.
985
986 If non-NULL BLOCK_TO_COPY determine what basic blocks
987 was copied to prevent duplications of calls that are dead
988 in the clone.
989
990 SUFFIX is string that is appended to the original name. */
991
992 cgraph_node *create_version_clone (tree new_decl,
993 vec<cgraph_edge *> redirect_callers,
994 bitmap bbs_to_copy,
995 const char *suffix = NULL);
996
997 /* Perform function versioning.
998 Function versioning includes copying of the tree and
999 a callgraph update (creating a new cgraph node and updating
1000 its callees and callers).
1001
1002 REDIRECT_CALLERS varray includes the edges to be redirected
1003 to the new version.
1004
1005 TREE_MAP is a mapping of tree nodes we want to replace with
1006 new ones (according to results of prior analysis).
1007
1008 If non-NULL ARGS_TO_SKIP determine function parameters to remove
1009 from new version.
1010 If SKIP_RETURN is true, the new version will return void.
1011 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
1012 If non_NULL NEW_ENTRY determine new entry BB of the clone.
1013
1014 If TARGET_ATTRIBUTES is non-null, when creating a new declaration,
1015 add the attributes to DECL_ATTRIBUTES. And call valid_attribute_p
1016 that will promote value of the attribute DECL_FUNCTION_SPECIFIC_TARGET
1017 of the declaration.
1018
1019 If VERSION_DECL is set true, use clone_function_name_numbered for the
1020 function clone. Otherwise, use clone_function_name.
1021
1022 Return the new version's cgraph node. */
1023 cgraph_node *create_version_clone_with_body
1024 (vec<cgraph_edge *> redirect_callers,
1025 vec<ipa_replace_map *, va_gc> *tree_map,
1026 ipa_param_adjustments *param_adjustments,
1027 bitmap bbs_to_copy, basic_block new_entry_block, const char *clone_name,
1028 tree target_attributes = NULL_TREE, bool version_decl = true);
1029
1030 /* Insert a new cgraph_function_version_info node into cgraph_fnver_htab
1031 corresponding to cgraph_node. */
1032 cgraph_function_version_info *insert_new_function_version (void);
1033
1034 /* Get the cgraph_function_version_info node corresponding to node. */
1035 cgraph_function_version_info *function_version (void);
1036
1037 /* Discover all functions and variables that are trivially needed, analyze
1038 them as well as all functions and variables referred by them */
1039 void analyze (void);
1040
1041 /* Add thunk alias into callgraph. The alias declaration is ALIAS and it
1042 aliases DECL with an adjustments made into the first parameter.
1043 See comments in struct symtab-thunks.h for detail on the parameters. */
1044 cgraph_node * create_thunk (tree alias, tree, bool this_adjusting,
1045 HOST_WIDE_INT fixed_offset,
1046 HOST_WIDE_INT virtual_value,
1047 HOST_WIDE_INT indirect_offset,
1048 tree virtual_offset,
1049 tree real_alias);
1050
1051
1052 /* Return node that alias is aliasing. */
1053 inline cgraph_node *get_alias_target (void);
1054
1055 /* Given function symbol, walk the alias chain to return the function node
1056 is alias of. Do not walk through thunks.
1057 When AVAILABILITY is non-NULL, get minimal availability in the chain.
1058 When REF is non-NULL, assume that reference happens in symbol REF
1059 when determining the availability. */
1060
1061 cgraph_node *ultimate_alias_target (availability *availability = NULL,
1062 symtab_node *ref = NULL);
1063
1064 /* Call expand_thunk on all callers that are thunks and analyze those
1065 nodes that were expanded. */
1066 void expand_all_artificial_thunks ();
1067
1068 /* Assemble thunks and aliases associated to node. */
1069 void assemble_thunks_and_aliases (void);
1070
1071 /* Expand function specified by node. */
1072 void expand (void);
1073
1074 /* As an GCC extension we allow redefinition of the function. The
1075 semantics when both copies of bodies differ is not well defined.
1076 We replace the old body with new body so in unit at a time mode
1077 we always use new body, while in normal mode we may end up with
1078 old body inlined into some functions and new body expanded and
1079 inlined in others. */
1080 void reset (void);
1081
1082 /* Creates a wrapper from cgraph_node to TARGET node. Thunk is used for this
1083 kind of wrapper method. */
1084 void create_wrapper (cgraph_node *target);
1085
1086 /* Verify cgraph nodes of the cgraph node. */
1087 void DEBUG_FUNCTION verify_node (void);
1088
1089 /* Remove function from symbol table. */
1090 void remove (void);
1091
1092 /* Dump call graph node to file F. */
1093 void dump (FILE *f);
1094
1095 /* Dump call graph node to file F. */
1096 void dump_graphviz (FILE *f);
1097
1098 /* Dump call graph node to stderr. */
1099 void DEBUG_FUNCTION debug (void);
1100
1101 /* When doing LTO, read cgraph_node's body from disk if it is not already
1102 present. */
1103 bool get_untransformed_body ();
1104
1105 /* Prepare function body. When doing LTO, read cgraph_node's body from disk
1106 if it is not already present. When some IPA transformations are scheduled,
1107 apply them. */
1108 bool get_body ();
1109
1110 void materialize_clone (void);
1111
1112 /* Release memory used to represent body of function.
1113 Use this only for functions that are released before being translated to
1114 target code (i.e. RTL). Functions that are compiled to RTL and beyond
1115 are free'd in final.cc via free_after_compilation(). */
1116 void release_body (bool keep_arguments = false);
1117
1118 /* Return the DECL_STRUCT_FUNCTION of the function. */
1119 struct function *get_fun () const;
1120
1121 /* Bring cgraph node local. */
1122 void make_local (void);
1123
1124 /* Likewise indicate that a node is having address taken. */
1125 void mark_address_taken (void);
1126
1127 /* Set finalization priority to PRIORITY. */
1128 void set_fini_priority (priority_type priority);
1129
1130 /* Return the finalization priority. */
1131 priority_type get_fini_priority (void);
1132
1133 /* Create edge from a given function to CALLEE in the cgraph. */
1134 cgraph_edge *create_edge (cgraph_node *callee,
1135 gcall *call_stmt, profile_count count,
1136 bool cloning_p = false);
1137
1138 /* Create an indirect edge with a yet-undetermined callee where the call
1139 statement destination is a formal parameter of the caller with index
1140 PARAM_INDEX. */
1141 cgraph_edge *create_indirect_edge (gcall *call_stmt, int ecf_flags,
1142 profile_count count,
1143 bool cloning_p = false);
1144
1145 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
1146 same function body. If clones already have edge for OLD_STMT; only
1147 update the edge same way as cgraph_set_call_stmt_including_clones does. */
1148 void create_edge_including_clones (cgraph_node *callee,
1149 gimple *old_stmt, gcall *stmt,
1150 profile_count count,
1151 cgraph_inline_failed_t reason);
1152
1153 /* Return the callgraph edge representing the GIMPLE_CALL statement
1154 CALL_STMT. */
1155 cgraph_edge *get_edge (gimple *call_stmt);
1156
1157 /* Collect all callers of cgraph_node and its aliases that are known to lead
1158 to NODE (i.e. are not overwritable) and that are not thunks. */
1159 auto_vec<cgraph_edge *> collect_callers (void);
1160
1161 /* Remove all callers from the node. */
1162 void remove_callers (void);
1163
1164 /* Remove all callees from the node. */
1165 void remove_callees (void);
1166
1167 /* Return function availability. See cgraph.h for description of individual
1168 return values. */
1169 enum availability get_availability (symtab_node *ref = NULL);
1170
1171 /* Set TREE_NOTHROW on cgraph_node's decl and on aliases of the node
1172 if any to NOTHROW. */
1173 bool set_nothrow_flag (bool nothrow);
1174
1175 /* SET DECL_IS_MALLOC on cgraph_node's decl and on aliases of the node
1176 if any. */
1177 bool set_malloc_flag (bool malloc_p);
1178
1179 /* SET TREE_THIS_VOLATILE on cgraph_node's decl and on aliases of the node
1180 if any. */
1181 bool set_noreturn_flag (bool noreturn_p);
1182
1183 /* If SET_CONST is true, mark function, aliases and thunks to be ECF_CONST.
1184 If SET_CONST if false, clear the flag.
1185
1186 When setting the flag be careful about possible interposition and
1187 do not set the flag for functions that can be interposed and set pure
1188 flag for functions that can bind to other definition.
1189
1190 Return true if any change was done. */
1191
1192 bool set_const_flag (bool set_const, bool looping);
1193
1194 /* Set DECL_PURE_P on cgraph_node's decl and on aliases of the node
1195 if any to PURE.
1196
1197 When setting the flag, be careful about possible interposition.
1198 Return true if any change was done. */
1199
1200 bool set_pure_flag (bool pure, bool looping);
1201
1202 /* Call callback on function and aliases associated to the function.
1203 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
1204 skipped. */
1205
1206 bool call_for_symbol_and_aliases (bool (*callback) (cgraph_node *,
1207 void *),
1208 void *data, bool include_overwritable);
1209
1210 /* Call callback on cgraph_node, thunks and aliases associated to NODE.
1211 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
1212 skipped. When EXCLUDE_VIRTUAL_THUNKS is true, virtual thunks are
1213 skipped. */
1214 bool call_for_symbol_thunks_and_aliases (bool (*callback) (cgraph_node *node,
1215 void *data),
1216 void *data,
1217 bool include_overwritable,
1218 bool exclude_virtual_thunks = false);
1219
1220 /* Likewise indicate that a node is needed, i.e. reachable via some
1221 external means. */
1222 inline void mark_force_output (void);
1223
1224 /* Return true when function can be marked local. */
1225 bool local_p (void);
1226
1227 /* Return true if cgraph_node can be made local for API change.
1228 Extern inline functions and C++ COMDAT functions can be made local
1229 at the expense of possible code size growth if function is used in multiple
1230 compilation units. */
1231 bool can_be_local_p (void);
1232
1233 /* Return true when cgraph_node cannot return or throw and thus
1234 it is safe to ignore its side effects for IPA analysis. */
1235 bool cannot_return_p (void);
1236
1237 /* Return true when function cgraph_node and all its aliases are only called
1238 directly.
1239 i.e. it is not externally visible, address was not taken and
1240 it is not used in any other non-standard way. */
1241 bool only_called_directly_p (void);
1242
1243 /* Return true when function is only called directly or it has alias.
1244 i.e. it is not externally visible, address was not taken and
1245 it is not used in any other non-standard way. */
1246 inline bool only_called_directly_or_aliased_p (void);
1247
1248 /* Return true when function cgraph_node can be expected to be removed
1249 from program when direct calls in this compilation unit are removed.
1250
1251 As a special case COMDAT functions are
1252 cgraph_can_remove_if_no_direct_calls_p while the are not
1253 cgraph_only_called_directly_p (it is possible they are called from other
1254 unit)
1255
1256 This function behaves as cgraph_only_called_directly_p because eliminating
1257 all uses of COMDAT function does not make it necessarily disappear from
1258 the program unless we are compiling whole program or we do LTO. In this
1259 case we know we win since dynamic linking will not really discard the
1260 linkonce section.
1261
1262 If WILL_INLINE is true, assume that function will be inlined into all the
1263 direct calls. */
1264 bool will_be_removed_from_program_if_no_direct_calls_p
1265 (bool will_inline = false);
1266
1267 /* Return true when function can be removed from callgraph
1268 if all direct calls and references are eliminated. The function does
1269 not take into account comdat groups. */
1270 bool can_remove_if_no_direct_calls_and_refs_p (void);
1271
1272 /* Return true when function cgraph_node and its aliases can be removed from
1273 callgraph if all direct calls are eliminated.
1274 If WILL_INLINE is true, assume that function will be inlined into all the
1275 direct calls. */
1276 bool can_remove_if_no_direct_calls_p (bool will_inline = false);
1277
1278 /* Return true when callgraph node is a function with Gimple body defined
1279 in current unit. Functions can also be define externally or they
1280 can be thunks with no Gimple representation.
1281
1282 Note that at WPA stage, the function body may not be present in memory. */
1283 inline bool has_gimple_body_p (void);
1284
1285 /* Return true if this node represents a former, i.e. an expanded, thunk. */
1286 bool former_thunk_p (void);
1287
1288 /* Check if function calls comdat local. This is used to recompute
1289 calls_comdat_local flag after function transformations. */
1290 bool check_calls_comdat_local_p ();
1291
1292 /* Return true if function should be optimized for size. */
1293 enum optimize_size_level optimize_for_size_p (void);
1294
1295 /* Dump the callgraph to file F. */
1296 static void dump_cgraph (FILE *f);
1297
1298 /* Dump the call graph to stderr. */
1299 static inline
debug_cgraphcgraph_node1300 void debug_cgraph (void)
1301 {
1302 dump_cgraph (stderr);
1303 }
1304
1305 /* Get unique identifier of the node. */
get_uidcgraph_node1306 inline int get_uid ()
1307 {
1308 return m_uid;
1309 }
1310
1311 /* Get summary id of the node. */
get_summary_idcgraph_node1312 inline int get_summary_id ()
1313 {
1314 return m_summary_id;
1315 }
1316
1317 /* Record that DECL1 and DECL2 are semantically identical function
1318 versions. */
1319 static void record_function_versions (tree decl1, tree decl2);
1320
1321 /* Remove the cgraph_function_version_info and cgraph_node for DECL. This
1322 DECL is a duplicate declaration. */
1323 static void delete_function_version_by_decl (tree decl);
1324
1325 /* Add the function FNDECL to the call graph.
1326 Unlike finalize_function, this function is intended to be used
1327 by middle end and allows insertion of new function at arbitrary point
1328 of compilation. The function can be either in high, low or SSA form
1329 GIMPLE.
1330
1331 The function is assumed to be reachable and have address taken (so no
1332 API breaking optimizations are performed on it).
1333
1334 Main work done by this function is to enqueue the function for later
1335 processing to avoid need the passes to be re-entrant. */
1336 static void add_new_function (tree fndecl, bool lowered);
1337
1338 /* Return callgraph node for given symbol and check it is a function. */
getcgraph_node1339 static inline cgraph_node *get (const_tree decl)
1340 {
1341 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL);
1342 return dyn_cast <cgraph_node *> (symtab_node::get (decl));
1343 }
1344
1345 /* DECL has been parsed. Take it, queue it, compile it at the whim of the
1346 logic in effect. If NO_COLLECT is true, then our caller cannot stand to
1347 have the garbage collector run at the moment. We would need to either
1348 create a new GC context, or just not compile right now. */
1349 static void finalize_function (tree, bool);
1350
1351 /* Return cgraph node assigned to DECL. Create new one when needed. */
1352 static cgraph_node * create (tree decl);
1353
1354 /* Try to find a call graph node for declaration DECL and if it does not
1355 exist or if it corresponds to an inline clone, create a new one. */
1356 static cgraph_node * get_create (tree);
1357
1358 /* Return local info for the compiled function. */
1359 static cgraph_node *local_info_node (tree decl);
1360
1361 /* Return RTL info for the compiled function. */
1362 static struct cgraph_rtl_info *rtl_info (const_tree);
1363
1364 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
1365 Return NULL if there's no such node. */
1366 static cgraph_node *get_for_asmname (tree asmname);
1367
1368 /* Attempt to mark ALIAS as an alias to DECL. Return alias node if
1369 successful and NULL otherwise.
1370 Same body aliases are output whenever the body of DECL is output,
1371 and cgraph_node::get (ALIAS) transparently
1372 returns cgraph_node::get (DECL). */
1373 static cgraph_node * create_same_body_alias (tree alias, tree decl);
1374
1375 /* Verify whole cgraph structure. */
1376 static void DEBUG_FUNCTION verify_cgraph_nodes (void);
1377
1378 /* Verify cgraph, if consistency checking is enabled. */
1379 static inline void checking_verify_cgraph_nodes (void);
1380
1381 /* Worker to bring NODE local. */
1382 static bool make_local (cgraph_node *node, void *);
1383
1384 /* Mark ALIAS as an alias to DECL. DECL_NODE is cgraph node representing
1385 the function body is associated
1386 with (not necessarily cgraph_node (DECL). */
1387 static cgraph_node *create_alias (tree alias, tree target);
1388
1389 /* Return true if NODE has thunk. */
1390 static bool has_thunk_p (cgraph_node *node, void *);
1391
1392 cgraph_edge *callees;
1393 cgraph_edge *callers;
1394 /* List of edges representing indirect calls with a yet undetermined
1395 callee. */
1396 cgraph_edge *indirect_calls;
1397 cgraph_node *next_sibling_clone;
1398 cgraph_node *prev_sibling_clone;
1399 cgraph_node *clones;
1400 cgraph_node *clone_of;
1401 /* For functions with many calls sites it holds map from call expression
1402 to the edge to speed up cgraph_edge function. */
1403 hash_table<cgraph_edge_hasher> *GTY(()) call_site_hash;
1404 /* Declaration node used to be clone of. */
1405 tree former_clone_of;
1406
1407 /* If this is a SIMD clone, this points to the SIMD specific
1408 information for it. */
1409 cgraph_simd_clone *simdclone;
1410 /* If this function has SIMD clones, this points to the first clone. */
1411 cgraph_node *simd_clones;
1412
1413 /* Interprocedural passes scheduled to have their transform functions
1414 applied next time we execute local pass on them. We maintain it
1415 per-function in order to allow IPA passes to introduce new functions. */
1416 vec<ipa_opt_pass, va_heap, vl_ptr> GTY((skip)) ipa_transforms_to_apply;
1417
1418 /* For inline clones this points to the function they will be
1419 inlined into. */
1420 cgraph_node *inlined_to;
1421
1422 struct cgraph_rtl_info *rtl;
1423
1424 /* Expected number of executions: calculated in profile.cc. */
1425 profile_count count;
1426 /* How to scale counts at materialization time; used to merge
1427 LTO units with different number of profile runs. */
1428 int count_materialization_scale;
1429 /* ID assigned by the profiling. */
1430 unsigned int profile_id;
1431 /* ID of the translation unit. */
1432 int unit_id;
1433 /* Time profiler: first run of function. */
1434 int tp_first_run;
1435
1436 /* True when symbol is a thunk. */
1437 unsigned thunk : 1;
1438 /* Set when decl is an abstract function pointed to by the
1439 ABSTRACT_DECL_ORIGIN of a reachable function. */
1440 unsigned used_as_abstract_origin : 1;
1441 /* Set once the function is lowered (i.e. its CFG is built). */
1442 unsigned lowered : 1;
1443 /* Set once the function has been instantiated and its callee
1444 lists created. */
1445 unsigned process : 1;
1446 /* How commonly executed the node is. Initialized during branch
1447 probabilities pass. */
1448 ENUM_BITFIELD (node_frequency) frequency : 2;
1449 /* True when function can only be called at startup (from static ctor). */
1450 unsigned only_called_at_startup : 1;
1451 /* True when function can only be called at startup (from static dtor). */
1452 unsigned only_called_at_exit : 1;
1453 /* True when function is the transactional clone of a function which
1454 is called only from inside transactions. */
1455 /* ?? We should be able to remove this. We have enough bits in
1456 cgraph to calculate it. */
1457 unsigned tm_clone : 1;
1458 /* True if this decl is a dispatcher for function versions. */
1459 unsigned dispatcher_function : 1;
1460 /* True if this decl calls a COMDAT-local function. This is set up in
1461 compute_fn_summary and inline_call. */
1462 unsigned calls_comdat_local : 1;
1463 /* True if node has been created by merge operation in IPA-ICF. */
1464 unsigned icf_merged: 1;
1465 /* True if call to node can't result in a call to free, munmap or
1466 other operation that could make previously non-trapping memory
1467 accesses trapping. */
1468 unsigned nonfreeing_fn : 1;
1469 /* True if there was multiple COMDAT bodies merged by lto-symtab. */
1470 unsigned merged_comdat : 1;
1471 /* True if this def was merged with extern inlines. */
1472 unsigned merged_extern_inline : 1;
1473 /* True if function was created to be executed in parallel. */
1474 unsigned parallelized_function : 1;
1475 /* True if function is part split out by ipa-split. */
1476 unsigned split_part : 1;
1477 /* True if the function appears as possible target of indirect call. */
1478 unsigned indirect_call_target : 1;
1479 /* Set when function is visible in current compilation unit only and
1480 its address is never taken. */
1481 unsigned local : 1;
1482 /* False when there is something makes versioning impossible. */
1483 unsigned versionable : 1;
1484 /* False when function calling convention and signature cannot be changed.
1485 This is the case when __builtin_apply_args is used. */
1486 unsigned can_change_signature : 1;
1487 /* True when the function has been originally extern inline, but it is
1488 redefined now. */
1489 unsigned redefined_extern_inline : 1;
1490 /* True if the function may enter serial irrevocable mode. */
1491 unsigned tm_may_enter_irr : 1;
1492 /* True if this was a clone created by ipa-cp. */
1493 unsigned ipcp_clone : 1;
1494 /* True if this is the deferred declare variant resolution artificial
1495 function. */
1496 unsigned declare_variant_alt : 1;
1497 /* True if the function calls declare_variant_alt functions. */
1498 unsigned calls_declare_variant_alt : 1;
1499 /* Set if the function is called by an IFUNC resolver. */
1500 unsigned called_by_ifunc_resolver : 1;
1501
1502 private:
1503 /* Unique id of the node. */
1504 int m_uid;
1505
1506 /* Summary id that is recycled. */
1507 int m_summary_id;
1508
1509 /* Worker for call_for_symbol_and_aliases. */
1510 bool call_for_symbol_and_aliases_1 (bool (*callback) (cgraph_node *,
1511 void *),
1512 void *data, bool include_overwritable);
1513 };
1514
1515 /* A cgraph node set is a collection of cgraph nodes. A cgraph node
1516 can appear in multiple sets. */
1517 struct cgraph_node_set_def
1518 {
1519 hash_map<cgraph_node *, size_t> *map;
1520 vec<cgraph_node *> nodes;
1521 };
1522
1523 typedef cgraph_node_set_def *cgraph_node_set;
1524 typedef struct varpool_node_set_def *varpool_node_set;
1525
1526 struct varpool_node;
1527
1528 /* A varpool node set is a collection of varpool nodes. A varpool node
1529 can appear in multiple sets. */
1530 struct varpool_node_set_def
1531 {
1532 hash_map<varpool_node *, size_t> * map;
1533 vec<varpool_node *> nodes;
1534 };
1535
1536 /* Iterator structure for cgraph node sets. */
1537 struct cgraph_node_set_iterator
1538 {
1539 cgraph_node_set set;
1540 unsigned index;
1541 };
1542
1543 /* Iterator structure for varpool node sets. */
1544 struct varpool_node_set_iterator
1545 {
1546 varpool_node_set set;
1547 unsigned index;
1548 };
1549
1550 /* Context of polymorphic call. It represent information about the type of
1551 instance that may reach the call. This is used by ipa-devirt walkers of the
1552 type inheritance graph. */
1553
class()1554 class GTY(()) ipa_polymorphic_call_context {
1555 public:
1556 /* The called object appears in an object of type OUTER_TYPE
1557 at offset OFFSET. When information is not 100% reliable, we
1558 use SPECULATIVE_OUTER_TYPE and SPECULATIVE_OFFSET. */
1559 HOST_WIDE_INT offset;
1560 HOST_WIDE_INT speculative_offset;
1561 tree outer_type;
1562 tree speculative_outer_type;
1563 /* True if outer object may be in construction or destruction. */
1564 unsigned maybe_in_construction : 1;
1565 /* True if outer object may be of derived type. */
1566 unsigned maybe_derived_type : 1;
1567 /* True if speculative outer object may be of derived type. We always
1568 speculate that construction does not happen. */
1569 unsigned speculative_maybe_derived_type : 1;
1570 /* True if the context is invalid and all calls should be redirected
1571 to BUILTIN_UNREACHABLE. */
1572 unsigned invalid : 1;
1573 /* True if the outer type is dynamic. */
1574 unsigned dynamic : 1;
1575
1576 /* Build empty "I know nothing" context. */
1577 ipa_polymorphic_call_context ();
1578 /* Build polymorphic call context for indirect call E. */
1579 ipa_polymorphic_call_context (cgraph_edge *e);
1580 /* Build polymorphic call context for IP invariant CST.
1581 If specified, OTR_TYPE specify the type of polymorphic call
1582 that takes CST+OFFSET as a parameter. */
1583 ipa_polymorphic_call_context (tree cst, tree otr_type = NULL,
1584 HOST_WIDE_INT offset = 0);
1585 /* Build context for pointer REF contained in FNDECL at statement STMT.
1586 if INSTANCE is non-NULL, return pointer to the object described by
1587 the context. */
1588 ipa_polymorphic_call_context (tree fndecl, tree ref, gimple *stmt,
1589 tree *instance = NULL);
1590
1591 /* Look for vtable stores or constructor calls to work out dynamic type
1592 of memory location. */
1593 bool get_dynamic_type (tree, tree, tree, gimple *, unsigned *);
1594
1595 /* Make context non-speculative. */
1596 void clear_speculation ();
1597
1598 /* Produce context specifying all derived types of OTR_TYPE. If OTR_TYPE is
1599 NULL, the context is set to dummy "I know nothing" setting. */
1600 void clear_outer_type (tree otr_type = NULL);
1601
1602 /* Walk container types and modify context to point to actual class
1603 containing OTR_TYPE (if non-NULL) as base class.
1604 Return true if resulting context is valid.
1605
1606 When CONSIDER_PLACEMENT_NEW is false, reject contexts that may be made
1607 valid only via allocation of new polymorphic type inside by means
1608 of placement new.
1609
1610 When CONSIDER_BASES is false, only look for actual fields, not base types
1611 of TYPE. */
1612 bool restrict_to_inner_class (tree otr_type,
1613 bool consider_placement_new = true,
1614 bool consider_bases = true);
1615
1616 /* Adjust all offsets in contexts by given number of bits. */
1617 void offset_by (HOST_WIDE_INT);
1618 /* Use when we cannot track dynamic type change. This speculatively assume
1619 type change is not happening. */
1620 void possible_dynamic_type_change (bool, tree otr_type = NULL);
1621 /* Assume that both THIS and a given context is valid and strengthen THIS
1622 if possible. Return true if any strengthening was made.
1623 If actual type the context is being used in is known, OTR_TYPE should be
1624 set accordingly. This improves quality of combined result. */
1625 bool combine_with (ipa_polymorphic_call_context, tree otr_type = NULL);
1626 bool meet_with (ipa_polymorphic_call_context, tree otr_type = NULL);
1627
1628 /* Return TRUE if context is fully useless. */
1629 bool useless_p () const;
1630 /* Return TRUE if this context conveys the same information as X. */
1631 bool equal_to (const ipa_polymorphic_call_context &x) const;
1632
1633 /* Dump human readable context to F. If NEWLINE is true, it will be
1634 terminated by a newline. */
1635 void dump (FILE *f, bool newline = true) const;
1636 void DEBUG_FUNCTION debug () const;
1637
1638 /* LTO streaming. */
1639 void stream_out (struct output_block *) const;
1640 void stream_in (class lto_input_block *, class data_in *data_in);
1641
1642 private:
1643 bool combine_speculation_with (tree, HOST_WIDE_INT, bool, tree);
1644 bool meet_speculation_with (tree, HOST_WIDE_INT, bool, tree);
1645 void set_by_decl (tree, HOST_WIDE_INT);
1646 bool set_by_invariant (tree, tree, HOST_WIDE_INT);
1647 bool speculation_consistent_p (tree, HOST_WIDE_INT, bool, tree) const;
1648 void make_speculative (tree otr_type = NULL);
1649 };
1650
1651 /* Structure containing additional information about an indirect call. */
1652
class()1653 class GTY(()) cgraph_indirect_call_info
1654 {
1655 public:
1656 /* When agg_content is set, an offset where the call pointer is located
1657 within the aggregate. */
1658 HOST_WIDE_INT offset;
1659 /* Context of the polymorphic call; use only when POLYMORPHIC flag is set. */
1660 ipa_polymorphic_call_context context;
1661 /* OBJ_TYPE_REF_TOKEN of a polymorphic call (if polymorphic is set). */
1662 HOST_WIDE_INT otr_token;
1663 /* Type of the object from OBJ_TYPE_REF_OBJECT. */
1664 tree otr_type;
1665 /* Index of the parameter that is called. */
1666 int param_index;
1667 /* ECF flags determined from the caller. */
1668 int ecf_flags;
1669
1670 /* Number of speculative call targets, it's less than GCOV_TOPN_VALUES. */
1671 unsigned num_speculative_call_targets : 16;
1672
1673 /* Set when the call is a virtual call with the parameter being the
1674 associated object pointer rather than a simple direct call. */
1675 unsigned polymorphic : 1;
1676 /* Set when the call is a call of a pointer loaded from contents of an
1677 aggregate at offset. */
1678 unsigned agg_contents : 1;
1679 /* Set when this is a call through a member pointer. */
1680 unsigned member_ptr : 1;
1681 /* When the agg_contents bit is set, this one determines whether the
1682 destination is loaded from a parameter passed by reference. */
1683 unsigned by_ref : 1;
1684 /* When the agg_contents bit is set, this one determines whether we can
1685 deduce from the function body that the loaded value from the reference is
1686 never modified between the invocation of the function and the load
1687 point. */
1688 unsigned guaranteed_unmodified : 1;
1689 /* For polymorphic calls this specify whether the virtual table pointer
1690 may have changed in between function entry and the call. */
1691 unsigned vptr_changed : 1;
1692 };
1693
1694 class GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"),
1695 for_user)) cgraph_edge
1696 {
1697 public:
1698 friend struct cgraph_node;
1699 friend class symbol_table;
1700
1701 /* Remove EDGE from the cgraph. */
1702 static void remove (cgraph_edge *edge);
1703
1704 /* Change field call_stmt of edge E to NEW_STMT. If UPDATE_SPECULATIVE and E
1705 is any component of speculative edge, then update all components.
1706 Speculations can be resolved in the process and EDGE can be removed and
1707 deallocated. Return the edge that now represents the call. */
1708 static cgraph_edge *set_call_stmt (cgraph_edge *e, gcall *new_stmt,
1709 bool update_speculative = true);
1710
1711 /* Redirect callee of the edge to N. The function does not update underlying
1712 call expression. */
1713 void redirect_callee (cgraph_node *n);
1714
1715 /* If the edge does not lead to a thunk, simply redirect it to N. Otherwise
1716 create one or more equivalent thunks for N and redirect E to the first in
1717 the chain. Note that it is then necessary to call
1718 n->expand_all_artificial_thunks once all callers are redirected. */
1719 void redirect_callee_duplicating_thunks (cgraph_node *n);
1720
1721 /* Make an indirect edge with an unknown callee an ordinary edge leading to
1722 CALLEE. Speculations can be resolved in the process and EDGE can be
1723 removed and deallocated. Return the edge that now represents the
1724 call. */
1725 static cgraph_edge *make_direct (cgraph_edge *edge, cgraph_node *callee);
1726
1727 /* Turn edge into speculative call calling N2. Update
1728 the profile so the direct call is taken COUNT times
1729 with FREQUENCY. speculative_id is used to link direct calls with their
1730 corresponding IPA_REF_ADDR references when representing speculative calls.
1731 */
1732 cgraph_edge *make_speculative (cgraph_node *n2, profile_count direct_count,
1733 unsigned int speculative_id = 0);
1734
1735 /* Speculative call consists of an indirect edge and one or more
1736 direct edge+ref pairs. Speculative will expand to the following sequence:
1737
1738 if (call_dest == target1) // reference to target1
1739 target1 (); // direct call to target1
1740 else if (call_dest == target2) // reference to targt2
1741 target2 (); // direct call to target2
1742 else
1743 call_dest (); // indirect call
1744
1745 Before the expansion we will have indirect call and the direct call+ref
1746 pairs all linked to single statement.
1747
1748 Note that ref may point to different symbol than the corresponding call
1749 becuase the speculated edge may have been optimized (redirected to
1750 a clone) or inlined.
1751
1752 Given an edge which is part of speculative call, return the first
1753 direct call edge in the speculative call sequence.
1754
1755 In the example above called on any cgraph edge in the sequence it will
1756 return direct call to target1. */
1757 cgraph_edge *first_speculative_call_target ();
1758
1759 /* Return next speculative call target or NULL if there is none.
1760 All targets are required to form an interval in the callee list.
1761
1762 In example above, if called on call to target1 it will return call to
1763 target2. */
next_speculative_call_target()1764 cgraph_edge *next_speculative_call_target ()
1765 {
1766 cgraph_edge *e = this;
1767 gcc_checking_assert (speculative && callee);
1768
1769 if (e->next_callee && e->next_callee->speculative
1770 && e->next_callee->call_stmt == e->call_stmt
1771 && e->next_callee->lto_stmt_uid == e->lto_stmt_uid)
1772 return e->next_callee;
1773 return NULL;
1774 }
1775
1776 /* When called on any edge in the speculative call return the (unique)
1777 indirect call edge in the speculative call sequence. */
speculative_call_indirect_edge()1778 cgraph_edge *speculative_call_indirect_edge ()
1779 {
1780 gcc_checking_assert (speculative);
1781 if (!callee)
1782 return this;
1783 for (cgraph_edge *e2 = caller->indirect_calls;
1784 true; e2 = e2->next_callee)
1785 if (e2->speculative
1786 && call_stmt == e2->call_stmt
1787 && lto_stmt_uid == e2->lto_stmt_uid)
1788 return e2;
1789 }
1790
1791 /* When called on any edge in speculative call and when given any target
1792 of ref which is speculated to it returns the corresponding direct call.
1793
1794 In example above if called on function target2 it will return call to
1795 target2. */
1796 cgraph_edge *speculative_call_for_target (cgraph_node *);
1797
1798 /* Return REF corresponding to direct call in the specualtive call
1799 sequence. */
speculative_call_target_ref()1800 ipa_ref *speculative_call_target_ref ()
1801 {
1802 ipa_ref *ref;
1803
1804 gcc_checking_assert (speculative);
1805 for (unsigned int i = 0; caller->iterate_reference (i, ref); i++)
1806 if (ref->speculative && ref->speculative_id == speculative_id
1807 && ref->stmt == (gimple *)call_stmt
1808 && ref->lto_stmt_uid == lto_stmt_uid)
1809 return ref;
1810 gcc_unreachable ();
1811 }
1812
1813 /* Speculative call edge turned out to be direct call to CALLEE_DECL. Remove
1814 the speculative call sequence and return edge representing the call, the
1815 original EDGE can be removed and deallocated. It is up to caller to
1816 redirect the call as appropriate. Return the edge that now represents the
1817 call.
1818
1819 For "speculative" indirect call that contains multiple "speculative"
1820 targets (i.e. edge->indirect_info->num_speculative_call_targets > 1),
1821 decrease the count and only remove current direct edge.
1822
1823 If no speculative direct call left to the speculative indirect call, remove
1824 the speculative of both the indirect call and corresponding direct edge.
1825
1826 It is up to caller to iteratively resolve each "speculative" direct call
1827 and redirect the call as appropriate. */
1828 static cgraph_edge *resolve_speculation (cgraph_edge *edge,
1829 tree callee_decl = NULL);
1830
1831 /* If necessary, change the function declaration in the call statement
1832 associated with edge E so that it corresponds to the edge callee.
1833 Speculations can be resolved in the process and EDGE can be removed and
1834 deallocated.
1835
1836 The edge could be one of speculative direct call generated from speculative
1837 indirect call. In this circumstance, decrease the speculative targets
1838 count (i.e. num_speculative_call_targets) and redirect call stmt to the
1839 corresponding i-th target. If no speculative direct call left to the
1840 speculative indirect call, remove "speculative" of the indirect call and
1841 also redirect stmt to it's final direct target.
1842
1843 When called from within tree-inline, KILLED_SSAs has to contain the
1844 pointer to killed_new_ssa_names within the copy_body_data structure and
1845 SSAs discovered to be useless (if LHS is removed) will be added to it,
1846 otherwise it needs to be NULL.
1847
1848 It is up to caller to iteratively transform each "speculative"
1849 direct call as appropriate. */
1850 static gimple *redirect_call_stmt_to_callee (cgraph_edge *e,
1851 hash_set <tree>
1852 *killed_ssas = nullptr);
1853
1854 /* Create clone of edge in the node N represented
1855 by CALL_EXPR the callgraph. */
1856 cgraph_edge * clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid,
1857 profile_count num, profile_count den,
1858 bool update_original);
1859
1860 /* Verify edge count and frequency. */
1861 bool verify_count ();
1862
1863 /* Return true when call of edge cannot lead to return from caller
1864 and thus it is safe to ignore its side effects for IPA analysis
1865 when computing side effects of the caller. */
1866 bool cannot_lead_to_return_p (void);
1867
1868 /* Return true when the edge represents a direct recursion. */
1869 bool recursive_p (void);
1870
1871 /* Return true if the edge may be considered hot. */
1872 bool maybe_hot_p (void);
1873
1874 /* Get unique identifier of the edge. */
get_uid()1875 inline int get_uid ()
1876 {
1877 return m_uid;
1878 }
1879
1880 /* Get summary id of the edge. */
get_summary_id()1881 inline int get_summary_id ()
1882 {
1883 return m_summary_id;
1884 }
1885
1886 /* Rebuild cgraph edges for current function node. This needs to be run after
1887 passes that don't update the cgraph. */
1888 static unsigned int rebuild_edges (void);
1889
1890 /* Rebuild cgraph references for current function node. This needs to be run
1891 after passes that don't update the cgraph. */
1892 static void rebuild_references (void);
1893
1894 /* During LTO stream in this can be used to check whether call can possibly
1895 be internal to the current translation unit. */
1896 bool possibly_call_in_translation_unit_p (void);
1897
1898 /* Return num_speculative_targets of this edge. */
1899 int num_speculative_call_targets_p (void);
1900
1901 /* Expected number of executions: calculated in profile.cc. */
1902 profile_count count;
1903 cgraph_node *caller;
1904 cgraph_node *callee;
1905 cgraph_edge *prev_caller;
1906 cgraph_edge *next_caller;
1907 cgraph_edge *prev_callee;
1908 cgraph_edge *next_callee;
1909 gcall *call_stmt;
1910 /* Additional information about an indirect call. Not cleared when an edge
1911 becomes direct. */
1912 cgraph_indirect_call_info *indirect_info;
1913 PTR GTY ((skip (""))) aux;
1914 /* When equal to CIF_OK, inline this call. Otherwise, points to the
1915 explanation why function was not inlined. */
1916 enum cgraph_inline_failed_t inline_failed;
1917 /* The stmt_uid of call_stmt. This is used by LTO to recover the call_stmt
1918 when the function is serialized in. */
1919 unsigned int lto_stmt_uid;
1920 /* speculative id is used to link direct calls with their corresponding
1921 IPA_REF_ADDR references when representing speculative calls. */
1922 unsigned int speculative_id : 16;
1923 /* Whether this edge was made direct by indirect inlining. */
1924 unsigned int indirect_inlining_edge : 1;
1925 /* Whether this edge describes an indirect call with an undetermined
1926 callee. */
1927 unsigned int indirect_unknown_callee : 1;
1928 /* Whether this edge is still a dangling */
1929 /* True if the corresponding CALL stmt cannot be inlined. */
1930 unsigned int call_stmt_cannot_inline_p : 1;
1931 /* Can this call throw externally? */
1932 unsigned int can_throw_external : 1;
1933 /* Edges with SPECULATIVE flag represents indirect calls that was
1934 speculatively turned into direct (i.e. by profile feedback).
1935 The final code sequence will have form:
1936
1937 if (call_target == expected_fn)
1938 expected_fn ();
1939 else
1940 call_target ();
1941
1942 Every speculative call is represented by three components attached
1943 to a same call statement:
1944 1) a direct call (to expected_fn)
1945 2) an indirect call (to call_target)
1946 3) a IPA_REF_ADDR reference to expected_fn.
1947
1948 Optimizers may later redirect direct call to clone, so 1) and 3)
1949 do not need to necessarily agree with destination. */
1950 unsigned int speculative : 1;
1951 /* Set to true when caller is a constructor or destructor of polymorphic
1952 type. */
1953 unsigned in_polymorphic_cdtor : 1;
1954
1955 /* Return true if call must bind to current definition. */
1956 bool binds_to_current_def_p ();
1957
1958 /* Expected frequency of executions within the function.
1959 When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
1960 per function call. The range is 0 to CGRAPH_FREQ_MAX. */
1961 int frequency ();
1962
1963 /* Expected frequency of executions within the function. */
1964 sreal sreal_frequency ();
1965 private:
1966 /* Unique id of the edge. */
1967 int m_uid;
1968
1969 /* Summary id that is recycled. */
1970 int m_summary_id;
1971
1972 /* Remove the edge from the list of the callers of the callee. */
1973 void remove_caller (void);
1974
1975 /* Remove the edge from the list of the callees of the caller. */
1976 void remove_callee (void);
1977
1978 /* Set callee N of call graph edge and add it to the corresponding set of
1979 callers. */
1980 void set_callee (cgraph_node *n);
1981
1982 /* Output flags of edge to a file F. */
1983 void dump_edge_flags (FILE *f);
1984
1985 /* Dump edge to stderr. */
1986 void DEBUG_FUNCTION debug (void);
1987
1988 /* Verify that call graph edge corresponds to DECL from the associated
1989 statement. Return true if the verification should fail. */
1990 bool verify_corresponds_to_fndecl (tree decl);
1991 };
1992
1993 #define CGRAPH_FREQ_BASE 1000
1994 #define CGRAPH_FREQ_MAX 100000
1995
1996 /* The varpool data structure.
1997 Each static variable decl has assigned varpool_node. */
1998
1999 struct GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node
2000 {
2001 /* Constructor. */
varpool_nodevarpool_node2002 explicit varpool_node ()
2003 : symtab_node (SYMTAB_VARIABLE), output (0), dynamically_initialized (0),
2004 tls_model (TLS_MODEL_NONE), used_by_single_function (0)
2005 {}
2006
2007 /* Dump given varpool node to F. */
2008 void dump (FILE *f);
2009
2010 /* Dump given varpool node to stderr. */
2011 void DEBUG_FUNCTION debug (void);
2012
2013 /* Remove variable from symbol table. */
2014 void remove (void);
2015
2016 /* Remove node initializer when it is no longer needed. */
2017 void remove_initializer (void);
2018
2019 void analyze (void);
2020
2021 /* Return variable availability. */
2022 availability get_availability (symtab_node *ref = NULL);
2023
2024 /* When doing LTO, read variable's constructor from disk if
2025 it is not already present. */
2026 tree get_constructor (void);
2027
2028 /* Return true if variable has constructor that can be used for folding. */
2029 bool ctor_useable_for_folding_p (void);
2030
2031 /* For given variable pool node, walk the alias chain to return the function
2032 the variable is alias of. Do not walk through thunks.
2033 When AVAILABILITY is non-NULL, get minimal availability in the chain.
2034 When REF is non-NULL, assume that reference happens in symbol REF
2035 when determining the availability. */
2036 inline varpool_node *ultimate_alias_target
2037 (availability *availability = NULL, symtab_node *ref = NULL);
2038
2039 /* Return node that alias is aliasing. */
2040 inline varpool_node *get_alias_target (void);
2041
2042 /* Output one variable, if necessary. Return whether we output it. */
2043 bool assemble_decl (void);
2044
2045 /* For variables in named sections make sure get_variable_section
2046 is called before we switch to those sections. Then section
2047 conflicts between read-only and read-only requiring relocations
2048 sections can be resolved. */
2049 void finalize_named_section_flags (void);
2050
2051 /* Call callback on varpool symbol and aliases associated to varpool symbol.
2052 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
2053 skipped. */
2054 bool call_for_symbol_and_aliases (bool (*callback) (varpool_node *, void *),
2055 void *data,
2056 bool include_overwritable);
2057
2058 /* Return true when variable should be considered externally visible. */
2059 bool externally_visible_p (void);
2060
2061 /* Return true when all references to variable must be visible
2062 in ipa_ref_list.
2063 i.e. if the variable is not externally visible or not used in some magic
2064 way (asm statement or such).
2065 The magic uses are all summarized in force_output flag. */
2066 inline bool all_refs_explicit_p ();
2067
2068 /* Return true when variable can be removed from variable pool
2069 if all direct calls are eliminated. */
2070 inline bool can_remove_if_no_refs_p (void);
2071
2072 /* Add the variable DECL to the varpool.
2073 Unlike finalize_decl function is intended to be used
2074 by middle end and allows insertion of new variable at arbitrary point
2075 of compilation. */
2076 static void add (tree decl);
2077
2078 /* Return varpool node for given symbol and check it is a function. */
2079 static inline varpool_node *get (const_tree decl);
2080
2081 /* Mark DECL as finalized. By finalizing the declaration, frontend instruct
2082 the middle end to output the variable to asm file, if needed or externally
2083 visible. */
2084 static void finalize_decl (tree decl);
2085
2086 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
2087 Extra name aliases are output whenever DECL is output. */
2088 static varpool_node * create_extra_name_alias (tree alias, tree decl);
2089
2090 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
2091 Extra name aliases are output whenever DECL is output. */
2092 static varpool_node * create_alias (tree, tree);
2093
2094 /* Dump the variable pool to F. */
2095 static void dump_varpool (FILE *f);
2096
2097 /* Dump the variable pool to stderr. */
2098 static void DEBUG_FUNCTION debug_varpool (void);
2099
2100 /* Allocate new callgraph node and insert it into basic data structures. */
2101 static varpool_node *create_empty (void);
2102
2103 /* Return varpool node assigned to DECL. Create new one when needed. */
2104 static varpool_node *get_create (tree decl);
2105
2106 /* Given an assembler name, lookup node. */
2107 static varpool_node *get_for_asmname (tree asmname);
2108
2109 /* Set when variable is scheduled to be assembled. */
2110 unsigned output : 1;
2111
2112 /* Set if the variable is dynamically initialized, except for
2113 function local statics. */
2114 unsigned dynamically_initialized : 1;
2115
2116 ENUM_BITFIELD(tls_model) tls_model : 3;
2117
2118 /* Set if the variable is known to be used by single function only.
2119 This is computed by ipa_single_use pass and used by late optimizations
2120 in places where optimization would be valid for local static variable
2121 if we did not do any inter-procedural code movement. */
2122 unsigned used_by_single_function : 1;
2123
2124 private:
2125 /* Assemble thunks and aliases associated to varpool node. */
2126 void assemble_aliases (void);
2127
2128 /* Worker for call_for_node_and_aliases. */
2129 bool call_for_symbol_and_aliases_1 (bool (*callback) (varpool_node *, void *),
2130 void *data,
2131 bool include_overwritable);
2132 };
2133
2134 /* Every top level asm statement is put into a asm_node. */
2135
2136 struct GTY(()) asm_node {
2137 /* Next asm node. */
2138 asm_node *next;
2139 /* String for this asm node. */
2140 tree asm_str;
2141 /* Ordering of all cgraph nodes. */
2142 int order;
2143 };
2144
2145 /* Report whether or not THIS symtab node is a function, aka cgraph_node. */
2146
2147 template <>
2148 template <>
2149 inline bool
test(symtab_node * p)2150 is_a_helper <cgraph_node *>::test (symtab_node *p)
2151 {
2152 return p && p->type == SYMTAB_FUNCTION;
2153 }
2154
2155 /* Report whether or not THIS symtab node is a variable, aka varpool_node. */
2156
2157 template <>
2158 template <>
2159 inline bool
test(symtab_node * p)2160 is_a_helper <varpool_node *>::test (symtab_node *p)
2161 {
2162 return p && p->type == SYMTAB_VARIABLE;
2163 }
2164
2165 typedef void (*cgraph_edge_hook)(cgraph_edge *, void *);
2166 typedef void (*cgraph_node_hook)(cgraph_node *, void *);
2167 typedef void (*varpool_node_hook)(varpool_node *, void *);
2168 typedef void (*cgraph_2edge_hook)(cgraph_edge *, cgraph_edge *, void *);
2169 typedef void (*cgraph_2node_hook)(cgraph_node *, cgraph_node *, void *);
2170
2171 struct cgraph_edge_hook_list;
2172 struct cgraph_node_hook_list;
2173 struct varpool_node_hook_list;
2174 struct cgraph_2edge_hook_list;
2175 struct cgraph_2node_hook_list;
2176
2177 /* Map from a symbol to initialization/finalization priorities. */
2178 struct GTY(()) symbol_priority_map {
2179 priority_type init;
2180 priority_type fini;
2181 };
2182
2183 enum symtab_state
2184 {
2185 /* Frontend is parsing and finalizing functions. */
2186 PARSING,
2187 /* Callgraph is being constructed. It is safe to add new functions. */
2188 CONSTRUCTION,
2189 /* Callgraph is being streamed-in at LTO time. */
2190 LTO_STREAMING,
2191 /* Callgraph is built and early IPA passes are being run. */
2192 IPA,
2193 /* Callgraph is built and all functions are transformed to SSA form. */
2194 IPA_SSA,
2195 /* All inline decisions are done; it is now possible to remove extern inline
2196 functions and virtual call targets. */
2197 IPA_SSA_AFTER_INLINING,
2198 /* Functions are now ordered and being passed to RTL expanders. */
2199 EXPANSION,
2200 /* All cgraph expansion is done. */
2201 FINISHED
2202 };
2203
2204 struct asmname_hasher : ggc_ptr_hash <symtab_node>
2205 {
2206 typedef const_tree compare_type;
2207
2208 static hashval_t hash (symtab_node *n);
2209 static bool equal (symtab_node *n, const_tree t);
2210 };
2211
2212 /* Core summaries maintained about symbols. */
2213
2214 struct thunk_info;
2215 template <class T> class function_summary;
2216 typedef function_summary <thunk_info *> thunk_summary;
2217
2218 struct clone_info;
2219 template <class T> class function_summary;
2220 typedef function_summary <clone_info *> clone_summary;
2221
2222 class GTY((tag ("SYMTAB"))) symbol_table
2223 {
2224 public:
2225 friend struct symtab_node;
2226 friend struct cgraph_node;
2227 friend struct cgraph_edge;
2228
symbol_table()2229 symbol_table ():
2230 cgraph_count (0), cgraph_max_uid (1), cgraph_max_summary_id (0),
2231 edges_count (0), edges_max_uid (1), edges_max_summary_id (0),
2232 cgraph_released_summary_ids (), edge_released_summary_ids (),
2233 nodes (NULL), asmnodes (NULL), asm_last_node (NULL),
2234 order (0), max_unit (0), global_info_ready (false), state (PARSING),
2235 function_flags_ready (false), cpp_implicit_aliases_done (false),
2236 section_hash (NULL), assembler_name_hash (NULL), init_priority_hash (NULL),
2237 dump_file (NULL), ipa_clones_dump_file (NULL), cloned_nodes (),
2238 m_thunks (NULL), m_clones (NULL),
2239 m_first_edge_removal_hook (NULL), m_first_cgraph_removal_hook (NULL),
2240 m_first_edge_duplicated_hook (NULL), m_first_cgraph_duplicated_hook (NULL),
2241 m_first_cgraph_insertion_hook (NULL), m_first_varpool_insertion_hook (NULL),
2242 m_first_varpool_removal_hook (NULL)
2243 {
2244 }
2245
2246 /* Initialize callgraph dump file. */
2247 void initialize (void);
2248
2249 /* Register a top-level asm statement ASM_STR. */
2250 inline asm_node *finalize_toplevel_asm (tree asm_str);
2251
2252 /* Analyze the whole compilation unit once it is parsed completely. */
2253 void finalize_compilation_unit (void);
2254
2255 /* C++ frontend produce same body aliases all over the place, even before PCH
2256 gets streamed out. It relies on us linking the aliases with their function
2257 in order to do the fixups, but ipa-ref is not PCH safe. Consequently we
2258 first produce aliases without links, but once C++ FE is sure it won't
2259 stream PCH we build the links via this function. */
2260 void process_same_body_aliases (void);
2261
2262 /* Perform simple optimizations based on callgraph. */
2263 void compile (void);
2264
2265 /* Process CGRAPH_NEW_FUNCTIONS and perform actions necessary to add these
2266 functions into callgraph in a way so they look like ordinary reachable
2267 functions inserted into callgraph already at construction time. */
2268 void process_new_functions (void);
2269
2270 /* Register a symbol NODE. */
2271 inline void register_symbol (symtab_node *node);
2272
2273 inline void
clear_asm_symbols(void)2274 clear_asm_symbols (void)
2275 {
2276 asmnodes = NULL;
2277 asm_last_node = NULL;
2278 }
2279
2280 /* Perform reachability analysis and reclaim all unreachable nodes. */
2281 bool remove_unreachable_nodes (FILE *file);
2282
2283 /* Optimization of function bodies might've rendered some variables as
2284 unnecessary so we want to avoid these from being compiled. Re-do
2285 reachability starting from variables that are either externally visible
2286 or was referred from the asm output routines. */
2287 void remove_unreferenced_decls (void);
2288
2289 /* Unregister a symbol NODE. */
2290 inline void unregister (symtab_node *node);
2291
2292 /* Allocate new callgraph node and insert it into basic data structures. */
2293 cgraph_node *create_empty (void);
2294
2295 /* Release a callgraph NODE. */
2296 void release_symbol (cgraph_node *node);
2297
2298 /* Output all variables enqueued to be assembled. */
2299 bool output_variables (void);
2300
2301 /* Weakrefs may be associated to external decls and thus not output
2302 at expansion time. Emit all necessary aliases. */
2303 void output_weakrefs (void);
2304
2305 /* Return first static symbol with definition. */
2306 inline symtab_node *first_symbol (void);
2307
2308 /* Return first assembler symbol. */
2309 inline asm_node *
first_asm_symbol(void)2310 first_asm_symbol (void)
2311 {
2312 return asmnodes;
2313 }
2314
2315 /* Return first static symbol with definition. */
2316 inline symtab_node *first_defined_symbol (void);
2317
2318 /* Return first variable. */
2319 inline varpool_node *first_variable (void);
2320
2321 /* Return next variable after NODE. */
2322 inline varpool_node *next_variable (varpool_node *node);
2323
2324 /* Return first static variable with initializer. */
2325 inline varpool_node *first_static_initializer (void);
2326
2327 /* Return next static variable with initializer after NODE. */
2328 inline varpool_node *next_static_initializer (varpool_node *node);
2329
2330 /* Return first static variable with definition. */
2331 inline varpool_node *first_defined_variable (void);
2332
2333 /* Return next static variable with definition after NODE. */
2334 inline varpool_node *next_defined_variable (varpool_node *node);
2335
2336 /* Return first function with body defined. */
2337 inline cgraph_node *first_defined_function (void);
2338
2339 /* Return next function with body defined after NODE. */
2340 inline cgraph_node *next_defined_function (cgraph_node *node);
2341
2342 /* Return first function. */
2343 inline cgraph_node *first_function (void);
2344
2345 /* Return next function. */
2346 inline cgraph_node *next_function (cgraph_node *node);
2347
2348 /* Return first function with body defined. */
2349 cgraph_node *first_function_with_gimple_body (void);
2350
2351 /* Return next reachable static variable with initializer after NODE. */
2352 inline cgraph_node *next_function_with_gimple_body (cgraph_node *node);
2353
2354 /* Register HOOK to be called with DATA on each removed edge. */
2355 cgraph_edge_hook_list *add_edge_removal_hook (cgraph_edge_hook hook,
2356 void *data);
2357
2358 /* Remove ENTRY from the list of hooks called on removing edges. */
2359 void remove_edge_removal_hook (cgraph_edge_hook_list *entry);
2360
2361 /* Register HOOK to be called with DATA on each removed node. */
2362 cgraph_node_hook_list *add_cgraph_removal_hook (cgraph_node_hook hook,
2363 void *data);
2364
2365 /* Remove ENTRY from the list of hooks called on removing nodes. */
2366 void remove_cgraph_removal_hook (cgraph_node_hook_list *entry);
2367
2368 /* Register HOOK to be called with DATA on each removed node. */
2369 varpool_node_hook_list *add_varpool_removal_hook (varpool_node_hook hook,
2370 void *data);
2371
2372 /* Remove ENTRY from the list of hooks called on removing nodes. */
2373 void remove_varpool_removal_hook (varpool_node_hook_list *entry);
2374
2375 /* Register HOOK to be called with DATA on each inserted node. */
2376 cgraph_node_hook_list *add_cgraph_insertion_hook (cgraph_node_hook hook,
2377 void *data);
2378
2379 /* Remove ENTRY from the list of hooks called on inserted nodes. */
2380 void remove_cgraph_insertion_hook (cgraph_node_hook_list *entry);
2381
2382 /* Register HOOK to be called with DATA on each inserted node. */
2383 varpool_node_hook_list *add_varpool_insertion_hook (varpool_node_hook hook,
2384 void *data);
2385
2386 /* Remove ENTRY from the list of hooks called on inserted nodes. */
2387 void remove_varpool_insertion_hook (varpool_node_hook_list *entry);
2388
2389 /* Register HOOK to be called with DATA on each duplicated edge. */
2390 cgraph_2edge_hook_list *add_edge_duplication_hook (cgraph_2edge_hook hook,
2391 void *data);
2392 /* Remove ENTRY from the list of hooks called on duplicating edges. */
2393 void remove_edge_duplication_hook (cgraph_2edge_hook_list *entry);
2394
2395 /* Register HOOK to be called with DATA on each duplicated node. */
2396 cgraph_2node_hook_list *add_cgraph_duplication_hook (cgraph_2node_hook hook,
2397 void *data);
2398
2399 /* Remove ENTRY from the list of hooks called on duplicating nodes. */
2400 void remove_cgraph_duplication_hook (cgraph_2node_hook_list *entry);
2401
2402 /* Call all edge removal hooks. */
2403 void call_edge_removal_hooks (cgraph_edge *e);
2404
2405 /* Call all node insertion hooks. */
2406 void call_cgraph_insertion_hooks (cgraph_node *node);
2407
2408 /* Call all node removal hooks. */
2409 void call_cgraph_removal_hooks (cgraph_node *node);
2410
2411 /* Call all node duplication hooks. */
2412 void call_cgraph_duplication_hooks (cgraph_node *node, cgraph_node *node2);
2413
2414 /* Call all edge duplication hooks. */
2415 void call_edge_duplication_hooks (cgraph_edge *cs1, cgraph_edge *cs2);
2416
2417 /* Call all node removal hooks. */
2418 void call_varpool_removal_hooks (varpool_node *node);
2419
2420 /* Call all node insertion hooks. */
2421 void call_varpool_insertion_hooks (varpool_node *node);
2422
2423 /* Arrange node to be first in its entry of assembler_name_hash. */
2424 void symtab_prevail_in_asm_name_hash (symtab_node *node);
2425
2426 /* Initialize asm name hash unless. */
2427 void symtab_initialize_asm_name_hash (void);
2428
2429 /* Set the DECL_ASSEMBLER_NAME and update symtab hashtables. */
2430 void change_decl_assembler_name (tree decl, tree name);
2431
2432 /* Dump symbol table to F. */
2433 void dump (FILE *f);
2434
2435 /* Dump symbol table to F in graphviz format. */
2436 void dump_graphviz (FILE *f);
2437
2438 /* Dump symbol table to stderr. */
2439 void DEBUG_FUNCTION debug (void);
2440
2441 /* Assign a new summary ID for the callgraph NODE. */
assign_summary_id(cgraph_node * node)2442 inline int assign_summary_id (cgraph_node *node)
2443 {
2444 if (!cgraph_released_summary_ids.is_empty ())
2445 node->m_summary_id = cgraph_released_summary_ids.pop ();
2446 else
2447 node->m_summary_id = cgraph_max_summary_id++;
2448
2449 return node->m_summary_id;
2450 }
2451
2452 /* Assign a new summary ID for the callgraph EDGE. */
assign_summary_id(cgraph_edge * edge)2453 inline int assign_summary_id (cgraph_edge *edge)
2454 {
2455 if (!edge_released_summary_ids.is_empty ())
2456 edge->m_summary_id = edge_released_summary_ids.pop ();
2457 else
2458 edge->m_summary_id = edges_max_summary_id++;
2459
2460 return edge->m_summary_id;
2461 }
2462
2463 /* Return true if assembler names NAME1 and NAME2 leads to the same symbol
2464 name. */
2465 static bool assembler_names_equal_p (const char *name1, const char *name2);
2466
2467 int cgraph_count;
2468 int cgraph_max_uid;
2469 int cgraph_max_summary_id;
2470
2471 int edges_count;
2472 int edges_max_uid;
2473 int edges_max_summary_id;
2474
2475 /* Vector of released summary IDS for cgraph nodes. */
2476 vec<int> GTY ((skip)) cgraph_released_summary_ids;
2477
2478 /* Vector of released summary IDS for cgraph nodes. */
2479 vec<int> GTY ((skip)) edge_released_summary_ids;
2480
2481 /* Return symbol used to separate symbol name from suffix. */
2482 static char symbol_suffix_separator ();
2483
2484 symtab_node* GTY(()) nodes;
2485 asm_node* GTY(()) asmnodes;
2486 asm_node* GTY(()) asm_last_node;
2487
2488 /* The order index of the next symtab node to be created. This is
2489 used so that we can sort the cgraph nodes in order by when we saw
2490 them, to support -fno-toplevel-reorder. */
2491 int order;
2492
2493 /* Maximal unit ID used. */
2494 int max_unit;
2495
2496 /* Set when whole unit has been analyzed so we can access global info. */
2497 bool global_info_ready;
2498 /* What state callgraph is in right now. */
2499 enum symtab_state state;
2500 /* Set when the cgraph is fully build and the basic flags are computed. */
2501 bool function_flags_ready;
2502
2503 bool cpp_implicit_aliases_done;
2504
2505 /* Hash table used to hold sections. */
2506 hash_table<section_name_hasher> *GTY(()) section_hash;
2507
2508 /* Hash table used to convert assembler names into nodes. */
2509 hash_table<asmname_hasher> *assembler_name_hash;
2510
2511 /* Hash table used to hold init priorities. */
2512 hash_map<symtab_node *, symbol_priority_map> *init_priority_hash;
2513
2514 FILE* GTY ((skip)) dump_file;
2515
2516 FILE* GTY ((skip)) ipa_clones_dump_file;
2517
2518 hash_set <const cgraph_node *> GTY ((skip)) cloned_nodes;
2519
2520 /* Thunk annotations. */
2521 thunk_summary *m_thunks;
2522
2523 /* Virtual clone annotations. */
2524 clone_summary *m_clones;
2525
2526 private:
2527 /* Allocate a cgraph_edge structure and fill it with data according to the
2528 parameters of which only CALLEE can be NULL (when creating an indirect
2529 call edge). CLONING_P should be set if properties that are copied from an
2530 original edge should not be calculated. */
2531 cgraph_edge *create_edge (cgraph_node *caller, cgraph_node *callee,
2532 gcall *call_stmt, profile_count count,
2533 bool indir_unknown_callee, bool cloning_p);
2534
2535 /* Put the edge onto the free list. */
2536 void free_edge (cgraph_edge *e);
2537
2538 /* Insert NODE to assembler name hash. */
2539 void insert_to_assembler_name_hash (symtab_node *node, bool with_clones);
2540
2541 /* Remove NODE from assembler name hash. */
2542 void unlink_from_assembler_name_hash (symtab_node *node, bool with_clones);
2543
2544 /* Hash asmnames ignoring the user specified marks. */
2545 static hashval_t decl_assembler_name_hash (const_tree asmname);
2546
2547 /* Compare ASMNAME with the DECL_ASSEMBLER_NAME of DECL. */
2548 static bool decl_assembler_name_equal (tree decl, const_tree asmname);
2549
2550 friend struct asmname_hasher;
2551
2552 /* List of hooks triggered when an edge is removed. */
2553 cgraph_edge_hook_list * GTY((skip)) m_first_edge_removal_hook;
2554 /* List of hooks trigger_red when a cgraph node is removed. */
2555 cgraph_node_hook_list * GTY((skip)) m_first_cgraph_removal_hook;
2556 /* List of hooks triggered when an edge is duplicated. */
2557 cgraph_2edge_hook_list * GTY((skip)) m_first_edge_duplicated_hook;
2558 /* List of hooks triggered when a node is duplicated. */
2559 cgraph_2node_hook_list * GTY((skip)) m_first_cgraph_duplicated_hook;
2560 /* List of hooks triggered when an function is inserted. */
2561 cgraph_node_hook_list * GTY((skip)) m_first_cgraph_insertion_hook;
2562 /* List of hooks triggered when an variable is inserted. */
2563 varpool_node_hook_list * GTY((skip)) m_first_varpool_insertion_hook;
2564 /* List of hooks triggered when a node is removed. */
2565 varpool_node_hook_list * GTY((skip)) m_first_varpool_removal_hook;
2566 };
2567
2568 extern GTY(()) symbol_table *symtab;
2569
2570 extern vec<cgraph_node *> cgraph_new_nodes;
2571
2572 inline hashval_t
hash(symtab_node * n)2573 asmname_hasher::hash (symtab_node *n)
2574 {
2575 return symbol_table::decl_assembler_name_hash
2576 (DECL_ASSEMBLER_NAME (n->decl));
2577 }
2578
2579 inline bool
equal(symtab_node * n,const_tree t)2580 asmname_hasher::equal (symtab_node *n, const_tree t)
2581 {
2582 return symbol_table::decl_assembler_name_equal (n->decl, t);
2583 }
2584
2585 /* In cgraph.cc */
2586 void cgraph_cc_finalize (void);
2587 void release_function_body (tree);
2588 cgraph_indirect_call_info *cgraph_allocate_init_indirect_info (void);
2589
2590 void cgraph_update_edges_for_call_stmt (gimple *, tree, gimple *);
2591 bool cgraph_function_possibly_inlined_p (tree);
2592
2593 const char* cgraph_inline_failed_string (cgraph_inline_failed_t);
2594 cgraph_inline_failed_type_t cgraph_inline_failed_type (cgraph_inline_failed_t);
2595
2596 /* In cgraphunit.cc */
2597 void cgraphunit_cc_finalize (void);
2598 int tp_first_run_node_cmp (const void *pa, const void *pb);
2599
2600 /* In symtab-thunks.cc */
2601 void symtab_thunks_cc_finalize (void);
2602
2603 /* Initialize datastructures so DECL is a function in lowered gimple form.
2604 IN_SSA is true if the gimple is in SSA. */
2605 basic_block init_lowered_empty_function (tree, bool, profile_count);
2606
2607 tree thunk_adjust (gimple_stmt_iterator *, tree, bool, HOST_WIDE_INT, tree,
2608 HOST_WIDE_INT);
2609 /* In cgraphclones.cc */
2610
2611 tree clone_function_name_numbered (const char *name, const char *suffix);
2612 tree clone_function_name_numbered (tree decl, const char *suffix);
2613 tree clone_function_name (const char *name, const char *suffix,
2614 unsigned long number);
2615 tree clone_function_name (tree decl, const char *suffix,
2616 unsigned long number);
2617 tree clone_function_name (tree decl, const char *suffix);
2618
2619 void tree_function_versioning (tree, tree, vec<ipa_replace_map *, va_gc> *,
2620 ipa_param_adjustments *,
2621 bool, bitmap, basic_block);
2622
2623 void dump_callgraph_transformation (const cgraph_node *original,
2624 const cgraph_node *clone,
2625 const char *suffix);
2626 /* In cgraphbuild.cc */
2627 int compute_call_stmt_bb_frequency (tree, basic_block bb);
2628 void record_references_in_initializer (tree, bool);
2629
2630 /* In ipa.cc */
2631 void cgraph_build_static_cdtor (char which, tree body, int priority);
2632 bool ipa_discover_variable_flags (void);
2633
2634 /* In varpool.cc */
2635 tree ctor_for_folding (tree);
2636
2637 /* In ipa-inline-analysis.cc */
2638 void initialize_inline_failed (struct cgraph_edge *);
2639 bool speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining);
2640
2641 /* Return true when the symbol is real symbol, i.e. it is not inline clone
2642 or abstract function kept for debug info purposes only. */
2643 inline bool
real_symbol_p(void)2644 symtab_node::real_symbol_p (void)
2645 {
2646 cgraph_node *cnode;
2647
2648 if (DECL_ABSTRACT_P (decl))
2649 return false;
2650 if (transparent_alias && definition)
2651 return false;
2652 if (!is_a <cgraph_node *> (this))
2653 return true;
2654 cnode = dyn_cast <cgraph_node *> (this);
2655 if (cnode->inlined_to)
2656 return false;
2657 return true;
2658 }
2659
2660 /* Return true if DECL should have entry in symbol table if used.
2661 Those are functions and static & external variables. */
2662
2663 static inline bool
decl_in_symtab_p(const_tree decl)2664 decl_in_symtab_p (const_tree decl)
2665 {
2666 return (TREE_CODE (decl) == FUNCTION_DECL
2667 || (TREE_CODE (decl) == VAR_DECL
2668 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))));
2669 }
2670
2671 inline bool
in_same_comdat_group_p(symtab_node * target)2672 symtab_node::in_same_comdat_group_p (symtab_node *target)
2673 {
2674 symtab_node *source = this;
2675
2676 if (cgraph_node *cn = dyn_cast <cgraph_node *> (target))
2677 {
2678 if (cn->inlined_to)
2679 source = cn->inlined_to;
2680 }
2681 if (cgraph_node *cn = dyn_cast <cgraph_node *> (target))
2682 {
2683 if (cn->inlined_to)
2684 target = cn->inlined_to;
2685 }
2686
2687 return source->get_comdat_group () == target->get_comdat_group ();
2688 }
2689
2690 /* Return node that alias is aliasing. */
2691
2692 inline symtab_node *
get_alias_target(void)2693 symtab_node::get_alias_target (void)
2694 {
2695 ipa_ref *ref = NULL;
2696 iterate_reference (0, ref);
2697 gcc_checking_assert (ref->use == IPA_REF_ALIAS);
2698 return ref->referred;
2699 }
2700
2701 /* Return the DECL (or identifier) that alias is aliasing. Unlike the above,
2702 this works whether or not the alias has been analyzed already. */
2703
2704 inline tree
get_alias_target_tree()2705 symtab_node::get_alias_target_tree ()
2706 {
2707 if (alias_target)
2708 return alias_target;
2709 return get_alias_target ()->decl;
2710 }
2711
2712 /* Return next reachable static symbol with initializer after the node. */
2713
2714 inline symtab_node *
next_defined_symbol(void)2715 symtab_node::next_defined_symbol (void)
2716 {
2717 symtab_node *node1 = next;
2718
2719 for (; node1; node1 = node1->next)
2720 if (node1->definition)
2721 return node1;
2722
2723 return NULL;
2724 }
2725
2726 /* Iterates I-th reference in the list, REF is also set. */
2727
2728 inline ipa_ref *
iterate_reference(unsigned i,ipa_ref * & ref)2729 symtab_node::iterate_reference (unsigned i, ipa_ref *&ref)
2730 {
2731 ref_list.references.iterate (i, &ref);
2732
2733 return ref;
2734 }
2735
2736 /* Iterates I-th referring item in the list, REF is also set. */
2737
2738 inline ipa_ref *
iterate_referring(unsigned i,ipa_ref * & ref)2739 symtab_node::iterate_referring (unsigned i, ipa_ref *&ref)
2740 {
2741 ref_list.referring.iterate (i, &ref);
2742
2743 return ref;
2744 }
2745
2746 /* Iterates I-th referring alias item in the list, REF is also set. */
2747
2748 inline ipa_ref *
iterate_direct_aliases(unsigned i,ipa_ref * & ref)2749 symtab_node::iterate_direct_aliases (unsigned i, ipa_ref *&ref)
2750 {
2751 ref_list.referring.iterate (i, &ref);
2752
2753 if (ref && ref->use != IPA_REF_ALIAS)
2754 return NULL;
2755
2756 return ref;
2757 }
2758
2759 /* Return true if list contains an alias. */
2760
2761 inline bool
has_aliases_p(void)2762 symtab_node::has_aliases_p (void)
2763 {
2764 ipa_ref *ref = NULL;
2765
2766 return (iterate_direct_aliases (0, ref) != NULL);
2767 }
2768
2769 /* Return true when RESOLUTION indicate that linker will use
2770 the symbol from non-LTO object files. */
2771
2772 inline bool
resolution_used_from_other_file_p(enum ld_plugin_symbol_resolution resolution)2773 resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution resolution)
2774 {
2775 return (resolution == LDPR_PREVAILING_DEF
2776 || resolution == LDPR_PREEMPTED_REG
2777 || resolution == LDPR_RESOLVED_EXEC
2778 || resolution == LDPR_RESOLVED_DYN);
2779 }
2780
2781 /* Return true when symtab_node is known to be used from other (non-LTO)
2782 object file. Known only when doing LTO via linker plugin. */
2783
2784 inline bool
used_from_object_file_p(void)2785 symtab_node::used_from_object_file_p (void)
2786 {
2787 if (!TREE_PUBLIC (decl) || DECL_EXTERNAL (decl))
2788 return false;
2789 if (resolution_used_from_other_file_p (resolution))
2790 return true;
2791 return false;
2792 }
2793
2794 /* Return varpool node for given symbol and check it is a function. */
2795
2796 inline varpool_node *
get(const_tree decl)2797 varpool_node::get (const_tree decl)
2798 {
2799 gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
2800 return dyn_cast<varpool_node *> (symtab_node::get (decl));
2801 }
2802
2803 /* Register a symbol NODE. */
2804
2805 inline void
register_symbol(symtab_node * node)2806 symbol_table::register_symbol (symtab_node *node)
2807 {
2808 node->next = nodes;
2809 node->previous = NULL;
2810
2811 if (nodes)
2812 nodes->previous = node;
2813 nodes = node;
2814
2815 node->order = order++;
2816 }
2817
2818 /* Register a top-level asm statement ASM_STR. */
2819
2820 asm_node *
finalize_toplevel_asm(tree asm_str)2821 symbol_table::finalize_toplevel_asm (tree asm_str)
2822 {
2823 asm_node *node;
2824
2825 node = ggc_cleared_alloc<asm_node> ();
2826 node->asm_str = asm_str;
2827 node->order = order++;
2828 node->next = NULL;
2829
2830 if (asmnodes == NULL)
2831 asmnodes = node;
2832 else
2833 asm_last_node->next = node;
2834
2835 asm_last_node = node;
2836 return node;
2837 }
2838
2839 /* Unregister a symbol NODE. */
2840 inline void
unregister(symtab_node * node)2841 symbol_table::unregister (symtab_node *node)
2842 {
2843 if (node->previous)
2844 node->previous->next = node->next;
2845 else
2846 nodes = node->next;
2847
2848 if (node->next)
2849 node->next->previous = node->previous;
2850
2851 node->next = NULL;
2852 node->previous = NULL;
2853 }
2854
2855 /* Release a callgraph NODE with UID and put in to the list of free nodes. */
2856
2857 inline void
release_symbol(cgraph_node * node)2858 symbol_table::release_symbol (cgraph_node *node)
2859 {
2860 cgraph_count--;
2861 if (node->m_summary_id != -1)
2862 cgraph_released_summary_ids.safe_push (node->m_summary_id);
2863 ggc_free (node);
2864 }
2865
2866 /* Return first static symbol with definition. */
2867 inline symtab_node *
first_symbol(void)2868 symbol_table::first_symbol (void)
2869 {
2870 return nodes;
2871 }
2872
2873 /* Walk all symbols. */
2874 #define FOR_EACH_SYMBOL(node) \
2875 for ((node) = symtab->first_symbol (); (node); (node) = (node)->next)
2876
2877 /* Return first static symbol with definition. */
2878 inline symtab_node *
first_defined_symbol(void)2879 symbol_table::first_defined_symbol (void)
2880 {
2881 symtab_node *node;
2882
2883 for (node = nodes; node; node = node->next)
2884 if (node->definition)
2885 return node;
2886
2887 return NULL;
2888 }
2889
2890 /* Walk all symbols with definitions in current unit. */
2891 #define FOR_EACH_DEFINED_SYMBOL(node) \
2892 for ((node) = symtab->first_defined_symbol (); (node); \
2893 (node) = node->next_defined_symbol ())
2894
2895 /* Return first variable. */
2896 inline varpool_node *
first_variable(void)2897 symbol_table::first_variable (void)
2898 {
2899 symtab_node *node;
2900 for (node = nodes; node; node = node->next)
2901 if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
2902 return vnode;
2903 return NULL;
2904 }
2905
2906 /* Return next variable after NODE. */
2907 inline varpool_node *
next_variable(varpool_node * node)2908 symbol_table::next_variable (varpool_node *node)
2909 {
2910 symtab_node *node1 = node->next;
2911 for (; node1; node1 = node1->next)
2912 if (varpool_node *vnode1 = dyn_cast <varpool_node *> (node1))
2913 return vnode1;
2914 return NULL;
2915 }
2916 /* Walk all variables. */
2917 #define FOR_EACH_VARIABLE(node) \
2918 for ((node) = symtab->first_variable (); \
2919 (node); \
2920 (node) = symtab->next_variable ((node)))
2921
2922 /* Return first static variable with initializer. */
2923 inline varpool_node *
first_static_initializer(void)2924 symbol_table::first_static_initializer (void)
2925 {
2926 symtab_node *node;
2927 for (node = nodes; node; node = node->next)
2928 {
2929 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2930 if (vnode && DECL_INITIAL (node->decl))
2931 return vnode;
2932 }
2933 return NULL;
2934 }
2935
2936 /* Return next static variable with initializer after NODE. */
2937 inline varpool_node *
next_static_initializer(varpool_node * node)2938 symbol_table::next_static_initializer (varpool_node *node)
2939 {
2940 symtab_node *node1 = node->next;
2941 for (; node1; node1 = node1->next)
2942 {
2943 varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
2944 if (vnode1 && DECL_INITIAL (node1->decl))
2945 return vnode1;
2946 }
2947 return NULL;
2948 }
2949
2950 /* Walk all static variables with initializer set. */
2951 #define FOR_EACH_STATIC_INITIALIZER(node) \
2952 for ((node) = symtab->first_static_initializer (); (node); \
2953 (node) = symtab->next_static_initializer (node))
2954
2955 /* Return first static variable with definition. */
2956 inline varpool_node *
first_defined_variable(void)2957 symbol_table::first_defined_variable (void)
2958 {
2959 symtab_node *node;
2960 for (node = nodes; node; node = node->next)
2961 {
2962 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2963 if (vnode && vnode->definition)
2964 return vnode;
2965 }
2966 return NULL;
2967 }
2968
2969 /* Return next static variable with definition after NODE. */
2970 inline varpool_node *
next_defined_variable(varpool_node * node)2971 symbol_table::next_defined_variable (varpool_node *node)
2972 {
2973 symtab_node *node1 = node->next;
2974 for (; node1; node1 = node1->next)
2975 {
2976 varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
2977 if (vnode1 && vnode1->definition)
2978 return vnode1;
2979 }
2980 return NULL;
2981 }
2982 /* Walk all variables with definitions in current unit. */
2983 #define FOR_EACH_DEFINED_VARIABLE(node) \
2984 for ((node) = symtab->first_defined_variable (); (node); \
2985 (node) = symtab->next_defined_variable (node))
2986
2987 /* Return first function with body defined. */
2988 inline cgraph_node *
first_defined_function(void)2989 symbol_table::first_defined_function (void)
2990 {
2991 symtab_node *node;
2992 for (node = nodes; node; node = node->next)
2993 {
2994 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
2995 if (cn && cn->definition)
2996 return cn;
2997 }
2998 return NULL;
2999 }
3000
3001 /* Return next function with body defined after NODE. */
3002 inline cgraph_node *
next_defined_function(cgraph_node * node)3003 symbol_table::next_defined_function (cgraph_node *node)
3004 {
3005 symtab_node *node1 = node->next;
3006 for (; node1; node1 = node1->next)
3007 {
3008 cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
3009 if (cn1 && cn1->definition)
3010 return cn1;
3011 }
3012 return NULL;
3013 }
3014
3015 /* Walk all functions with body defined. */
3016 #define FOR_EACH_DEFINED_FUNCTION(node) \
3017 for ((node) = symtab->first_defined_function (); (node); \
3018 (node) = symtab->next_defined_function ((node)))
3019
3020 /* Return first function. */
3021 inline cgraph_node *
first_function(void)3022 symbol_table::first_function (void)
3023 {
3024 symtab_node *node;
3025 for (node = nodes; node; node = node->next)
3026 if (cgraph_node *cn = dyn_cast <cgraph_node *> (node))
3027 return cn;
3028 return NULL;
3029 }
3030
3031 /* Return next function. */
3032 inline cgraph_node *
next_function(cgraph_node * node)3033 symbol_table::next_function (cgraph_node *node)
3034 {
3035 symtab_node *node1 = node->next;
3036 for (; node1; node1 = node1->next)
3037 if (cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1))
3038 return cn1;
3039 return NULL;
3040 }
3041
3042 /* Return first function with body defined. */
3043 inline cgraph_node *
first_function_with_gimple_body(void)3044 symbol_table::first_function_with_gimple_body (void)
3045 {
3046 symtab_node *node;
3047 for (node = nodes; node; node = node->next)
3048 {
3049 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
3050 if (cn && cn->has_gimple_body_p ())
3051 return cn;
3052 }
3053 return NULL;
3054 }
3055
3056 /* Return next reachable static variable with initializer after NODE. */
3057 inline cgraph_node *
next_function_with_gimple_body(cgraph_node * node)3058 symbol_table::next_function_with_gimple_body (cgraph_node *node)
3059 {
3060 symtab_node *node1 = node->next;
3061 for (; node1; node1 = node1->next)
3062 {
3063 cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
3064 if (cn1 && cn1->has_gimple_body_p ())
3065 return cn1;
3066 }
3067 return NULL;
3068 }
3069
3070 /* Walk all functions. */
3071 #define FOR_EACH_FUNCTION(node) \
3072 for ((node) = symtab->first_function (); (node); \
3073 (node) = symtab->next_function ((node)))
3074
3075 /* Return true when callgraph node is a function with Gimple body defined
3076 in current unit. Functions can also be define externally or they
3077 can be thunks with no Gimple representation.
3078
3079 Note that at WPA stage, the function body may not be present in memory. */
3080
3081 inline bool
has_gimple_body_p(void)3082 cgraph_node::has_gimple_body_p (void)
3083 {
3084 return definition && !thunk && !alias;
3085 }
3086
3087 /* Walk all functions with body defined. */
3088 #define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \
3089 for ((node) = symtab->first_function_with_gimple_body (); (node); \
3090 (node) = symtab->next_function_with_gimple_body (node))
3091
3092 /* Uniquize all constants that appear in memory.
3093 Each constant in memory thus far output is recorded
3094 in `const_desc_table'. */
3095
3096 struct GTY((for_user)) constant_descriptor_tree {
3097 /* A MEM for the constant. */
3098 rtx rtl;
3099
3100 /* The value of the constant. */
3101 tree value;
3102
3103 /* Hash of value. Computing the hash from value each time
3104 hashfn is called can't work properly, as that means recursive
3105 use of the hash table during hash table expansion. */
3106 hashval_t hash;
3107 };
3108
3109 /* Return true when function is only called directly or it has alias.
3110 i.e. it is not externally visible, address was not taken and
3111 it is not used in any other non-standard way. */
3112
3113 inline bool
only_called_directly_or_aliased_p(void)3114 cgraph_node::only_called_directly_or_aliased_p (void)
3115 {
3116 gcc_assert (!inlined_to);
3117 return (!force_output && !address_taken
3118 && !ifunc_resolver
3119 && !used_from_other_partition
3120 && !DECL_VIRTUAL_P (decl)
3121 && !DECL_STATIC_CONSTRUCTOR (decl)
3122 && !DECL_STATIC_DESTRUCTOR (decl)
3123 && !used_from_object_file_p ()
3124 && !externally_visible);
3125 }
3126
3127 /* Return true when function can be removed from callgraph
3128 if all direct calls are eliminated. */
3129
3130 inline bool
can_remove_if_no_direct_calls_and_refs_p(void)3131 cgraph_node::can_remove_if_no_direct_calls_and_refs_p (void)
3132 {
3133 gcc_checking_assert (!inlined_to);
3134 /* Extern inlines can always go, we will use the external definition. */
3135 if (DECL_EXTERNAL (decl))
3136 return true;
3137 /* When function is needed, we cannot remove it. */
3138 if (force_output || used_from_other_partition)
3139 return false;
3140 if (DECL_STATIC_CONSTRUCTOR (decl)
3141 || DECL_STATIC_DESTRUCTOR (decl))
3142 return false;
3143 /* Only COMDAT functions can be removed if externally visible. */
3144 if (externally_visible
3145 && ((!DECL_COMDAT (decl) || ifunc_resolver)
3146 || forced_by_abi
3147 || used_from_object_file_p ()))
3148 return false;
3149 return true;
3150 }
3151
3152 /* Verify cgraph, if consistency checking is enabled. */
3153
3154 inline void
checking_verify_cgraph_nodes(void)3155 cgraph_node::checking_verify_cgraph_nodes (void)
3156 {
3157 if (flag_checking)
3158 cgraph_node::verify_cgraph_nodes ();
3159 }
3160
3161 /* Return true when variable can be removed from variable pool
3162 if all direct calls are eliminated. */
3163
3164 inline bool
can_remove_if_no_refs_p(void)3165 varpool_node::can_remove_if_no_refs_p (void)
3166 {
3167 if (DECL_EXTERNAL (decl))
3168 return true;
3169 return (!force_output && !used_from_other_partition
3170 && ((DECL_COMDAT (decl)
3171 && !forced_by_abi
3172 && !used_from_object_file_p ())
3173 || !externally_visible
3174 || DECL_HAS_VALUE_EXPR_P (decl)));
3175 }
3176
3177 /* Return true when all references to variable must be visible in ipa_ref_list.
3178 i.e. if the variable is not externally visible or not used in some magic
3179 way (asm statement or such).
3180 The magic uses are all summarized in force_output flag. */
3181
3182 inline bool
all_refs_explicit_p()3183 varpool_node::all_refs_explicit_p ()
3184 {
3185 return (definition
3186 && !externally_visible
3187 && !used_from_other_partition
3188 && !force_output);
3189 }
3190
3191 struct tree_descriptor_hasher : ggc_ptr_hash<constant_descriptor_tree>
3192 {
3193 static hashval_t hash (constant_descriptor_tree *);
3194 static bool equal (constant_descriptor_tree *, constant_descriptor_tree *);
3195 };
3196
3197 /* Constant pool accessor function. */
3198 hash_table<tree_descriptor_hasher> *constant_pool_htab (void);
3199
3200 /* Return node that alias is aliasing. */
3201
3202 inline cgraph_node *
get_alias_target(void)3203 cgraph_node::get_alias_target (void)
3204 {
3205 return dyn_cast <cgraph_node *> (symtab_node::get_alias_target ());
3206 }
3207
3208 /* Return node that alias is aliasing. */
3209
3210 inline varpool_node *
get_alias_target(void)3211 varpool_node::get_alias_target (void)
3212 {
3213 return dyn_cast <varpool_node *> (symtab_node::get_alias_target ());
3214 }
3215
3216 /* Walk the alias chain to return the symbol NODE is alias of.
3217 If NODE is not an alias, return NODE.
3218 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3219 When REF is non-NULL, assume that reference happens in symbol REF
3220 when determining the availability. */
3221
3222 inline symtab_node *
ultimate_alias_target(enum availability * availability,symtab_node * ref)3223 symtab_node::ultimate_alias_target (enum availability *availability,
3224 symtab_node *ref)
3225 {
3226 if (!alias)
3227 {
3228 if (availability)
3229 *availability = get_availability (ref);
3230 return this;
3231 }
3232
3233 return ultimate_alias_target_1 (availability, ref);
3234 }
3235
3236 /* Given function symbol, walk the alias chain to return the function node
3237 is alias of. Do not walk through thunks.
3238 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3239 When REF is non-NULL, assume that reference happens in symbol REF
3240 when determining the availability. */
3241
3242 inline cgraph_node *
ultimate_alias_target(enum availability * availability,symtab_node * ref)3243 cgraph_node::ultimate_alias_target (enum availability *availability,
3244 symtab_node *ref)
3245 {
3246 cgraph_node *n = dyn_cast <cgraph_node *>
3247 (symtab_node::ultimate_alias_target (availability, ref));
3248 if (!n && availability)
3249 *availability = AVAIL_NOT_AVAILABLE;
3250 return n;
3251 }
3252
3253 /* For given variable pool node, walk the alias chain to return the function
3254 the variable is alias of. Do not walk through thunks.
3255 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3256 When REF is non-NULL, assume that reference happens in symbol REF
3257 when determining the availability. */
3258
3259 inline varpool_node *
ultimate_alias_target(availability * availability,symtab_node * ref)3260 varpool_node::ultimate_alias_target (availability *availability,
3261 symtab_node *ref)
3262 {
3263 varpool_node *n = dyn_cast <varpool_node *>
3264 (symtab_node::ultimate_alias_target (availability, ref));
3265
3266 if (!n && availability)
3267 *availability = AVAIL_NOT_AVAILABLE;
3268 return n;
3269 }
3270
3271 /* Set callee N of call graph edge and add it to the corresponding set of
3272 callers. */
3273
3274 inline void
set_callee(cgraph_node * n)3275 cgraph_edge::set_callee (cgraph_node *n)
3276 {
3277 prev_caller = NULL;
3278 if (n->callers)
3279 n->callers->prev_caller = this;
3280 next_caller = n->callers;
3281 n->callers = this;
3282 callee = n;
3283 }
3284
3285 /* Return true when the edge represents a direct recursion. */
3286
3287 inline bool
recursive_p(void)3288 cgraph_edge::recursive_p (void)
3289 {
3290 cgraph_node *c = callee->ultimate_alias_target ();
3291 if (caller->inlined_to)
3292 return caller->inlined_to->decl == c->decl;
3293 else
3294 return caller->decl == c->decl;
3295 }
3296
3297 /* Remove the edge from the list of the callers of the callee. */
3298
3299 inline void
remove_callee(void)3300 cgraph_edge::remove_callee (void)
3301 {
3302 gcc_assert (!indirect_unknown_callee);
3303 if (prev_caller)
3304 prev_caller->next_caller = next_caller;
3305 if (next_caller)
3306 next_caller->prev_caller = prev_caller;
3307 if (!prev_caller)
3308 callee->callers = next_caller;
3309 }
3310
3311 /* Return true if call must bind to current definition. */
3312
3313 inline bool
binds_to_current_def_p()3314 cgraph_edge::binds_to_current_def_p ()
3315 {
3316 if (callee)
3317 return callee->binds_to_current_def_p (caller);
3318 else
3319 return false;
3320 }
3321
3322 /* Expected frequency of executions within the function.
3323 When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
3324 per function call. The range is 0 to CGRAPH_FREQ_MAX. */
3325
3326 inline int
frequency()3327 cgraph_edge::frequency ()
3328 {
3329 return count.to_cgraph_frequency (caller->inlined_to
3330 ? caller->inlined_to->count
3331 : caller->count);
3332 }
3333
3334
3335 /* Return true if the TM_CLONE bit is set for a given FNDECL. */
3336 static inline bool
decl_is_tm_clone(const_tree fndecl)3337 decl_is_tm_clone (const_tree fndecl)
3338 {
3339 cgraph_node *n = cgraph_node::get (fndecl);
3340 if (n)
3341 return n->tm_clone;
3342 return false;
3343 }
3344
3345 /* Likewise indicate that a node is needed, i.e. reachable via some
3346 external means. */
3347
3348 inline void
mark_force_output(void)3349 cgraph_node::mark_force_output (void)
3350 {
3351 force_output = 1;
3352 gcc_checking_assert (!inlined_to);
3353 }
3354
3355 /* Return true if function should be optimized for size. */
3356
3357 inline enum optimize_size_level
optimize_for_size_p(void)3358 cgraph_node::optimize_for_size_p (void)
3359 {
3360 if (opt_for_fn (decl, optimize_size))
3361 return OPTIMIZE_SIZE_MAX;
3362 if (count == profile_count::zero ())
3363 return OPTIMIZE_SIZE_MAX;
3364 if (frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
3365 return OPTIMIZE_SIZE_BALANCED;
3366 else
3367 return OPTIMIZE_SIZE_NO;
3368 }
3369
3370 /* Return symtab_node for NODE or create one if it is not present
3371 in symtab. */
3372
3373 inline symtab_node *
get_create(tree node)3374 symtab_node::get_create (tree node)
3375 {
3376 if (TREE_CODE (node) == VAR_DECL)
3377 return varpool_node::get_create (node);
3378 else
3379 return cgraph_node::get_create (node);
3380 }
3381
3382 /* Return availability of NODE when referenced from REF. */
3383
3384 inline enum availability
get_availability(symtab_node * ref)3385 symtab_node::get_availability (symtab_node *ref)
3386 {
3387 if (is_a <cgraph_node *> (this))
3388 return dyn_cast <cgraph_node *> (this)->get_availability (ref);
3389 else
3390 return dyn_cast <varpool_node *> (this)->get_availability (ref);
3391 }
3392
3393 /* Call callback on symtab node and aliases associated to this node.
3394 When INCLUDE_OVERWRITABLE is false, overwritable symbols are skipped. */
3395
3396 inline bool
call_for_symbol_and_aliases(bool (* callback)(symtab_node *,void *),void * data,bool include_overwritable)3397 symtab_node::call_for_symbol_and_aliases (bool (*callback) (symtab_node *,
3398 void *),
3399 void *data,
3400 bool include_overwritable)
3401 {
3402 if (include_overwritable
3403 || get_availability () > AVAIL_INTERPOSABLE)
3404 {
3405 if (callback (this, data))
3406 return true;
3407 }
3408 if (has_aliases_p ())
3409 return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
3410 return false;
3411 }
3412
3413 /* Call callback on function and aliases associated to the function.
3414 When INCLUDE_OVERWRITABLE is false, overwritable symbols are
3415 skipped. */
3416
3417 inline bool
call_for_symbol_and_aliases(bool (* callback)(cgraph_node *,void *),void * data,bool include_overwritable)3418 cgraph_node::call_for_symbol_and_aliases (bool (*callback) (cgraph_node *,
3419 void *),
3420 void *data,
3421 bool include_overwritable)
3422 {
3423 if (include_overwritable
3424 || get_availability () > AVAIL_INTERPOSABLE)
3425 {
3426 if (callback (this, data))
3427 return true;
3428 }
3429 if (has_aliases_p ())
3430 return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
3431 return false;
3432 }
3433
3434 /* Call callback on varpool symbol and aliases associated to varpool symbol.
3435 When INCLUDE_OVERWRITABLE is false, overwritable symbols are
3436 skipped. */
3437
3438 inline bool
call_for_symbol_and_aliases(bool (* callback)(varpool_node *,void *),void * data,bool include_overwritable)3439 varpool_node::call_for_symbol_and_aliases (bool (*callback) (varpool_node *,
3440 void *),
3441 void *data,
3442 bool include_overwritable)
3443 {
3444 if (include_overwritable
3445 || get_availability () > AVAIL_INTERPOSABLE)
3446 {
3447 if (callback (this, data))
3448 return true;
3449 }
3450 if (has_aliases_p ())
3451 return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
3452 return false;
3453 }
3454
3455 /* Return true if reference may be used in address compare. */
3456
3457 inline bool
address_matters_p()3458 ipa_ref::address_matters_p ()
3459 {
3460 if (use != IPA_REF_ADDR)
3461 return false;
3462 /* Addresses taken from virtual tables are never compared. */
3463 if (is_a <varpool_node *> (referring)
3464 && DECL_VIRTUAL_P (referring->decl))
3465 return false;
3466 return referred->address_can_be_compared_p ();
3467 }
3468
3469 /* Build polymorphic call context for indirect call E. */
3470
3471 inline
ipa_polymorphic_call_context(cgraph_edge * e)3472 ipa_polymorphic_call_context::ipa_polymorphic_call_context (cgraph_edge *e)
3473 {
3474 gcc_checking_assert (e->indirect_info->polymorphic);
3475 *this = e->indirect_info->context;
3476 }
3477
3478 /* Build empty "I know nothing" context. */
3479
3480 inline
ipa_polymorphic_call_context()3481 ipa_polymorphic_call_context::ipa_polymorphic_call_context ()
3482 {
3483 clear_speculation ();
3484 clear_outer_type ();
3485 invalid = false;
3486 }
3487
3488 /* Make context non-speculative. */
3489
3490 inline void
clear_speculation()3491 ipa_polymorphic_call_context::clear_speculation ()
3492 {
3493 speculative_outer_type = NULL;
3494 speculative_offset = 0;
3495 speculative_maybe_derived_type = false;
3496 }
3497
3498 /* Produce context specifying all derived types of OTR_TYPE. If OTR_TYPE is
3499 NULL, the context is set to dummy "I know nothing" setting. */
3500
3501 inline void
clear_outer_type(tree otr_type)3502 ipa_polymorphic_call_context::clear_outer_type (tree otr_type)
3503 {
3504 outer_type = otr_type ? TYPE_MAIN_VARIANT (otr_type) : NULL;
3505 offset = 0;
3506 maybe_derived_type = true;
3507 maybe_in_construction = true;
3508 dynamic = true;
3509 }
3510
3511 /* Adjust all offsets in contexts by OFF bits. */
3512
3513 inline void
offset_by(HOST_WIDE_INT off)3514 ipa_polymorphic_call_context::offset_by (HOST_WIDE_INT off)
3515 {
3516 if (outer_type)
3517 offset += off;
3518 if (speculative_outer_type)
3519 speculative_offset += off;
3520 }
3521
3522 /* Return TRUE if context is fully useless. */
3523
3524 inline bool
useless_p()3525 ipa_polymorphic_call_context::useless_p () const
3526 {
3527 return (!outer_type && !speculative_outer_type);
3528 }
3529
3530 /* When using fprintf (or similar), problems can arise with
3531 transient generated strings. Many string-generation APIs
3532 only support one result being alive at once (e.g. by
3533 returning a pointer to a statically-allocated buffer).
3534
3535 If there is more than one generated string within one
3536 fprintf call: the first string gets evicted or overwritten
3537 by the second, before fprintf is fully evaluated.
3538 See e.g. PR/53136.
3539
3540 This function provides a workaround for this, by providing
3541 a simple way to create copies of these transient strings,
3542 without the need to have explicit cleanup:
3543
3544 fprintf (dumpfile, "string 1: %s string 2:%s\n",
3545 xstrdup_for_dump (EXPR_1),
3546 xstrdup_for_dump (EXPR_2));
3547
3548 This is actually a simple wrapper around ggc_strdup, but
3549 the name documents the intent. We require that no GC can occur
3550 within the fprintf call. */
3551
3552 static inline const char *
xstrdup_for_dump(const char * transient_str)3553 xstrdup_for_dump (const char *transient_str)
3554 {
3555 return ggc_strdup (transient_str);
3556 }
3557
3558 /* During LTO stream-in this predicate can be used to check whether node
3559 in question prevails in the linking to save some memory usage. */
3560 inline bool
prevailing_p(void)3561 symtab_node::prevailing_p (void)
3562 {
3563 return definition && ((!TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl))
3564 || previous_sharing_asm_name == NULL);
3565 }
3566
3567 extern GTY(()) symbol_table *saved_symtab;
3568
3569 #if CHECKING_P
3570
3571 namespace selftest {
3572
3573 /* An RAII-style class for use in selftests for temporarily using a different
3574 symbol_table, so that such tests can be isolated from each other. */
3575
3576 class symbol_table_test
3577 {
3578 public:
3579 /* Constructor. Override "symtab". */
3580 symbol_table_test ();
3581
3582 /* Destructor. Restore the saved_symtab. */
3583 ~symbol_table_test ();
3584 };
3585
3586 } // namespace selftest
3587
3588 #endif /* CHECKING_P */
3589
3590 #endif /* GCC_CGRAPH_H */
3591