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