]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cgraph.h
runtime: Check for CPU_COUNT itself, don't check glibc version.
[thirdparty/gcc.git] / gcc / cgraph.h
CommitLineData
1c4a429a 1/* Callgraph handling code.
23a5b65a 2 Copyright (C) 2003-2014 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
b787e7a2 24#include "hash-map.h"
5d59b5e1 25#include "is-a.h"
051f8cc6 26#include "plugin-api.h"
7a8cba34 27#include "vec.h"
4d648807 28#include "basic-block.h"
7a8cba34 29#include "function.h"
1f00098b 30#include "ipa-ref.h"
3dafb85c 31#include "dumpfile.h"
1f00098b
JH
32
33/* Symbol table consists of functions and variables.
e70670cf 34 TODO: add labels and CONST_DECLs. */
1f00098b
JH
35enum symtab_type
36{
960bfb69 37 SYMTAB_SYMBOL,
1f00098b
JH
38 SYMTAB_FUNCTION,
39 SYMTAB_VARIABLE
40};
41
f961457f
JH
42/* Section names are stored as reference counted strings in GGC safe hashtable
43 (to make them survive through PCH). */
44
45struct GTY(()) section_hash_entry_d
46{
47 int ref_count;
48 char *name; /* As long as this datastructure stays in GGC, we can not put
49 string at the tail of structure of GGC dies in horrible
50 way */
51};
52
53typedef struct section_hash_entry_d section_hash_entry;
54
d52f5295
ML
55enum availability
56{
57 /* Not yet set by cgraph_function_body_availability. */
58 AVAIL_UNSET,
59 /* Function body/variable initializer is unknown. */
60 AVAIL_NOT_AVAILABLE,
61 /* Function body/variable initializer is known but might be replaced
62 by a different one from other compilation unit and thus needs to
63 be dealt with a care. Like AVAIL_NOT_AVAILABLE it can have
64 arbitrary side effects on escaping variables and functions, while
65 like AVAILABLE it might access static variables. */
66 AVAIL_INTERPOSABLE,
67 /* Function body/variable initializer is known and will be used in final
68 program. */
69 AVAIL_AVAILABLE,
70 /* Function body/variable initializer is known and all it's uses are
71 explicitly visible within current unit (ie it's address is never taken and
72 it is not exported to other units). Currently used only for functions. */
73 AVAIL_LOCAL
74};
75
76/* Classification of symbols WRT partitioning. */
77enum symbol_partitioning_class
78{
79 /* External declarations are ignored by partitioning algorithms and they are
80 added into the boundary later via compute_ltrans_boundary. */
81 SYMBOL_EXTERNAL,
82 /* Partitioned symbols are pur into one of partitions. */
83 SYMBOL_PARTITION,
84 /* Duplicated symbols (such as comdat or constant pool references) are
85 copied into every node needing them via add_symbol_to_partition. */
86 SYMBOL_DUPLICATE
87};
88
1f00098b
JH
89/* Base of all entries in the symbol table.
90 The symtab_node is inherited by cgraph and varpol nodes. */
a3bfa8b8
DM
91class GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"),
92 chain_next ("%h.next"), chain_prev ("%h.previous")))
5e20cdc9 93 symtab_node
1f00098b 94{
a3bfa8b8 95public:
fec39fa6
TS
96 /* Return name. */
97 const char *name () const;
98
99 /* Return asm name. */
100 const char * asm_name () const;
101
d52f5295
ML
102 /* Add node into symbol table. This function is not used directly, but via
103 cgraph/varpool node creation routines. */
104 void register_symbol (void);
105
106 /* Remove symbol from symbol table. */
107 void remove (void);
108
109 /* Dump symtab node to F. */
110 void dump (FILE *f);
111
112 /* Dump symtab node to stderr. */
113 void DEBUG_FUNCTION debug (void);
114
115 /* Verify consistency of node. */
116 void DEBUG_FUNCTION verify (void);
117
118 /* Return ipa reference from this symtab_node to
119 REFERED_NODE or REFERED_VARPOOL_NODE. USE_TYPE specify type
120 of the use and STMT the statement (if it exists). */
3dafb85c
ML
121 ipa_ref *create_reference (symtab_node *referred_node,
122 enum ipa_ref_use use_type);
d52f5295
ML
123
124 /* Return ipa reference from this symtab_node to
125 REFERED_NODE or REFERED_VARPOOL_NODE. USE_TYPE specify type
126 of the use and STMT the statement (if it exists). */
3dafb85c
ML
127 ipa_ref *create_reference (symtab_node *referred_node,
128 enum ipa_ref_use use_type, gimple stmt);
d52f5295
ML
129
130 /* If VAL is a reference to a function or a variable, add a reference from
131 this symtab_node to the corresponding symbol table node. USE_TYPE specify
132 type of the use and STMT the statement (if it exists). Return the new
133 reference or NULL if none was created. */
3dafb85c
ML
134 ipa_ref *maybe_create_reference (tree val, enum ipa_ref_use use_type,
135 gimple stmt);
d52f5295
ML
136
137 /* Clone all references from symtab NODE to this symtab_node. */
138 void clone_references (symtab_node *node);
139
140 /* Remove all stmt references in non-speculative references.
141 Those are not maintained during inlining & clonning.
142 The exception are speculative references that are updated along
143 with callgraph edges associated with them. */
144 void clone_referring (symtab_node *node);
145
146 /* Clone reference REF to this symtab_node and set its stmt to STMT. */
3dafb85c 147 ipa_ref *clone_reference (ipa_ref *ref, gimple stmt);
d52f5295
ML
148
149 /* Find the structure describing a reference to REFERRED_NODE
150 and associated with statement STMT. */
3dafb85c
ML
151 ipa_ref *find_reference (symtab_node *referred_node, gimple stmt,
152 unsigned int lto_stmt_uid);
d52f5295
ML
153
154 /* Remove all references that are associated with statement STMT. */
155 void remove_stmt_references (gimple stmt);
156
157 /* Remove all stmt references in non-speculative references.
158 Those are not maintained during inlining & clonning.
159 The exception are speculative references that are updated along
160 with callgraph edges associated with them. */
161 void clear_stmts_in_references (void);
162
163 /* Remove all references in ref list. */
164 void remove_all_references (void);
165
166 /* Remove all referring items in ref list. */
167 void remove_all_referring (void);
168
169 /* Dump references in ref list to FILE. */
170 void dump_references (FILE *file);
171
172 /* Dump referring in list to FILE. */
173 void dump_referring (FILE *);
174
175 /* Iterates I-th reference in the list, REF is also set. */
3dafb85c 176 ipa_ref *iterate_reference (unsigned i, ipa_ref *&ref);
d52f5295
ML
177
178 /* Iterates I-th referring item in the list, REF is also set. */
3dafb85c 179 ipa_ref *iterate_referring (unsigned i, ipa_ref *&ref);
d52f5295
ML
180
181 /* Iterates I-th referring alias item in the list, REF is also set. */
3dafb85c 182 ipa_ref *iterate_direct_aliases (unsigned i, ipa_ref *&ref);
d52f5295
ML
183
184 /* Return true if symtab node and TARGET represents
185 semantically equivalent symbols. */
186 bool semantically_equivalent_p (symtab_node *target);
187
188 /* Classify symbol symtab node for partitioning. */
189 enum symbol_partitioning_class get_partitioning_class (void);
190
191 /* Return comdat group. */
192 tree get_comdat_group ()
193 {
194 return x_comdat_group;
195 }
196
197 /* Return comdat group as identifier_node. */
198 tree get_comdat_group_id ()
199 {
200 if (x_comdat_group && TREE_CODE (x_comdat_group) != IDENTIFIER_NODE)
201 x_comdat_group = DECL_ASSEMBLER_NAME (x_comdat_group);
202 return x_comdat_group;
203 }
204
205 /* Set comdat group. */
206 void set_comdat_group (tree group)
207 {
208 gcc_checking_assert (!group || TREE_CODE (group) == IDENTIFIER_NODE
209 || DECL_P (group));
210 x_comdat_group = group;
211 }
212
213 /* Return section as string. */
214 const char * get_section ()
215 {
216 if (!x_section)
217 return NULL;
218 return x_section->name;
219 }
220
221 /* Remove node from same comdat group. */
222 void remove_from_same_comdat_group (void);
223
224 /* Add this symtab_node to the same comdat group that OLD is in. */
225 void add_to_same_comdat_group (symtab_node *old_node);
226
227 /* Dissolve the same_comdat_group list in which NODE resides. */
228 void dissolve_same_comdat_group_list (void);
229
230 /* Return true when symtab_node is known to be used from other (non-LTO)
231 object file. Known only when doing LTO via linker plugin. */
232 bool used_from_object_file_p (void);
233
234 /* Walk the alias chain to return the symbol NODE is alias of.
235 If NODE is not an alias, return NODE.
236 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
237 symtab_node *ultimate_alias_target (enum availability *avail = NULL);
238
239 /* Return next reachable static symbol with initializer after NODE. */
240 inline symtab_node *next_defined_symbol (void);
241
242 /* Add reference recording that symtab node is alias of TARGET.
243 The function can fail in the case of aliasing cycles; in this case
244 it returns false. */
245 bool resolve_alias (symtab_node *target);
246
247 /* C++ FE sometimes change linkage flags after producing same
248 body aliases. */
249 void fixup_same_cpp_alias_visibility (symtab_node *target);
250
251 /* Call calback on symtab node and aliases associated to this node.
252 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
253 skipped. */
254 bool call_for_symbol_and_aliases (bool (*callback) (symtab_node *, void *),
255 void *data,
256 bool include_overwrite);
257
258 /* If node can not be interposable by static or dynamic linker to point to
259 different definition, return this symbol. Otherwise look for alias with
260 such property and if none exists, introduce new one. */
261 symtab_node *noninterposable_alias (void);
262
263 /* Return node that alias is aliasing. */
264 inline symtab_node *get_alias_target (void);
265
266 /* Set section for symbol and its aliases. */
267 void set_section (const char *section);
268
269 /* Set section, do not recurse into aliases.
270 When one wants to change section of symbol and its aliases,
271 use set_section. */
272 void set_section_for_node (const char *section);
273
274 /* Set initialization priority to PRIORITY. */
275 void set_init_priority (priority_type priority);
276
277 /* Return the initialization priority. */
278 priority_type get_init_priority ();
279
280 /* Return availability of NODE. */
281 enum availability get_availability (void);
282
283 /* Make DECL local. */
284 void make_decl_local (void);
285
286 /* Return true if list contains an alias. */
287 bool has_aliases_p (void);
288
289 /* Return true when the symbol is real symbol, i.e. it is not inline clone
290 or abstract function kept for debug info purposes only. */
291 bool real_symbol_p (void);
292
3dafb85c
ML
293 /* Determine if symbol declaration is needed. That is, visible to something
294 either outside this translation unit, something magic in the system
295 configury. This function is used just during symbol creation. */
296 bool needed_p (void);
297
298 /* Return true when there are references to the node. */
299 bool referred_to_p (void);
300
d52f5295
ML
301 /* Return true if NODE can be discarded by linker from the binary. */
302 inline bool
303 can_be_discarded_p (void)
304 {
305 return (DECL_EXTERNAL (decl)
306 || (get_comdat_group ()
307 && resolution != LDPR_PREVAILING_DEF
308 && resolution != LDPR_PREVAILING_DEF_IRONLY
309 && resolution != LDPR_PREVAILING_DEF_IRONLY_EXP));
310 }
311
312 /* Return true if NODE is local to a particular COMDAT group, and must not
313 be named from outside the COMDAT. This is used for C++ decloned
314 constructors. */
315 inline bool comdat_local_p (void)
316 {
317 return (same_comdat_group && !TREE_PUBLIC (decl));
318 }
319
320 /* Return true if ONE and TWO are part of the same COMDAT group. */
321 inline bool in_same_comdat_group_p (symtab_node *target);
322
323 /* Return true when there is a reference to node and it is not vtable. */
324 bool address_taken_from_non_vtable_p (void);
325
326 /* Return true if symbol is known to be nonzero. */
327 bool nonzero_address ();
328
329 /* Return symbol table node associated with DECL, if any,
330 and NULL otherwise. */
331 static inline symtab_node *get (const_tree decl)
332 {
333#ifdef ENABLE_CHECKING
334 /* Check that we are called for sane type of object - functions
335 and static or external variables. */
336 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL
337 || (TREE_CODE (decl) == VAR_DECL
338 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
339 || in_lto_p)));
340 /* Check that the mapping is sane - perhaps this check can go away,
341 but at the moment frontends tends to corrupt the mapping by calling
342 memcpy/memset on the tree nodes. */
343 gcc_checking_assert (!decl->decl_with_vis.symtab_node
344 || decl->decl_with_vis.symtab_node->decl == decl);
345#endif
346 return decl->decl_with_vis.symtab_node;
347 }
348
f7217cde
JH
349 /* Try to find a symtab node for declaration DECL and if it does not
350 exist or if it corresponds to an inline clone, create a new one. */
351 static inline symtab_node * get_create (tree node);
352
3dafb85c
ML
353 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
354 Return NULL if there's no such node. */
355 static symtab_node *get_for_asmname (const_tree asmname);
356
d52f5295
ML
357 /* Dump symbol table to F. */
358 static void dump_table (FILE *);
359
360 /* Dump symbol table to stderr. */
361 static inline DEBUG_FUNCTION void debug_symtab (void)
362 {
363 dump_table (stderr);
364 }
365
366 /* Verify symbol table for internal consistency. */
367 static DEBUG_FUNCTION void verify_symtab_nodes (void);
368
369 /* Return true when NODE is known to be used from other (non-LTO)
370 object file. Known only when doing LTO via linker plugin. */
371 static bool used_from_object_file_p_worker (symtab_node *node);
372
1f00098b 373 /* Type of the symbol. */
b8dbdb12
RG
374 ENUM_BITFIELD (symtab_type) type : 8;
375
376 /* The symbols resolution. */
377 ENUM_BITFIELD (ld_plugin_symbol_resolution) resolution : 8;
378
e70670cf
JH
379 /*** Flags representing the symbol type. ***/
380
381 /* True when symbol corresponds to a definition in current unit.
3dafb85c 382 set via finalize_function or finalize_decl */
e70670cf 383 unsigned definition : 1;
9041d2e6
ML
384 /* True when symbol is an alias.
385 Set by ssemble_alias. */
e70670cf 386 unsigned alias : 1;
08346abd
JH
387 /* True when alias is a weakref. */
388 unsigned weakref : 1;
40a7fe1e 389 /* C++ frontend produce same body aliases and extra name aliases for
688010ba 390 virtual functions and vtables that are obviously equivalent.
40a7fe1e
JH
391 Those aliases are bit special, especially because C++ frontend
392 visibility code is so ugly it can not get them right at first time
393 and their visibility needs to be copied from their "masters" at
394 the end of parsing. */
395 unsigned cpp_implicit_alias : 1;
e70670cf
JH
396 /* Set once the definition was analyzed. The list of references and
397 other properties are built during analysis. */
398 unsigned analyzed : 1;
6de88c6a
JH
399 /* Set for write-only variables. */
400 unsigned writeonly : 1;
f7217cde
JH
401 /* Visibility of symbol was used for further optimization; do not
402 permit further changes. */
403 unsigned refuse_visibility_changes : 1;
e70670cf
JH
404
405 /*** Visibility and linkage flags. ***/
406
b8dbdb12
RG
407 /* Set when function is visible by other units. */
408 unsigned externally_visible : 1;
7861b648
AK
409 /* Don't reorder to other symbols having this set. */
410 unsigned no_reorder : 1;
4bcfd75c 411 /* The symbol will be assumed to be used in an invisible way (like
edb983b2 412 by an toplevel asm statement). */
b8dbdb12 413 unsigned force_output : 1;
edb983b2
JH
414 /* Like FORCE_OUTPUT, but in the case it is ABI requiring the symbol to be
415 exported. Unlike FORCE_OUTPUT this flag gets cleared to symbols promoted
416 to static and it does not inhibit optimization. */
417 unsigned forced_by_abi : 1;
702d8703
JH
418 /* True when the name is known to be unique and thus it does not need mangling. */
419 unsigned unique_name : 1;
e257a17c
JH
420 /* Specify whether the section was set by user or by
421 compiler via -ffunction-sections. */
422 unsigned implicit_section : 1;
3d8d0043
MJ
423 /* True when body and other characteristics have been removed by
424 symtab_remove_unreachable_nodes. */
425 unsigned body_removed : 1;
b8dbdb12 426
e70670cf
JH
427 /*** WHOPR Partitioning flags.
428 These flags are used at ltrans stage when only part of the callgraph is
429 available. ***/
b8dbdb12 430
e70670cf
JH
431 /* Set when variable is used from other LTRANS partition. */
432 unsigned used_from_other_partition : 1;
9041d2e6 433 /* Set when function is available in the other LTRANS partition.
e70670cf
JH
434 During WPA output it is used to mark nodes that are present in
435 multiple partitions. */
436 unsigned in_other_partition : 1;
b8dbdb12 437
b8dbdb12 438
e70670cf
JH
439
440 /*** other flags. ***/
441
442 /* Set when symbol has address taken. */
443 unsigned address_taken : 1;
569b1784
JH
444 /* Set when init priority is set. */
445 unsigned in_init_priority_hash : 1;
e70670cf
JH
446
447
448 /* Ordering of all symtab entries. */
449 int order;
450
451 /* Declaration representing the symbol. */
452 tree decl;
960bfb69 453
2aae7680 454 /* Linked list of symbol table entries starting with symtab_nodes. */
5e20cdc9
DM
455 symtab_node *next;
456 symtab_node *previous;
e70670cf 457
1ab24192 458 /* Linked list of symbols with the same asm name. There may be multiple
e70670cf
JH
459 entries for single symbol name during LTO, because symbols are renamed
460 only after partitioning.
461
462 Because inline clones are kept in the assembler name has, they also produce
463 duplicate entries.
464
465 There are also several long standing bugs where frontends and builtin
466 code produce duplicated decls. */
5e20cdc9
DM
467 symtab_node *next_sharing_asm_name;
468 symtab_node *previous_sharing_asm_name;
2aae7680 469
d52f5295
ML
470 /* Circular list of nodes in the same comdat group if non-NULL. */
471 symtab_node *same_comdat_group;
e55637b7 472
e70670cf 473 /* Vectors of referring and referenced entities. */
3dafb85c 474 ipa_ref_list ref_list;
e70670cf 475
40a7fe1e
JH
476 /* Alias target. May be either DECL pointer or ASSEMBLER_NAME pointer
477 depending to what was known to frontend on the creation time.
478 Once alias is resolved, this pointer become NULL. */
479 tree alias_target;
480
e70670cf
JH
481 /* File stream where this node is being written to. */
482 struct lto_file_decl_data * lto_file_data;
483
960bfb69 484 PTR GTY ((skip)) aux;
aede2c10
JH
485
486 /* Comdat group the symbol is in. Can be private if GGC allowed that. */
f961457f 487 tree x_comdat_group;
24d047a3
JH
488
489 /* Section name. Again can be private, if allowed. */
f961457f 490 section_hash_entry *x_section;
e257a17c 491
d52f5295
ML
492protected:
493 /* Dump base fields of symtab nodes to F. Not to be used directly. */
494 void dump_base (FILE *);
569b1784 495
d52f5295
ML
496 /* Verify common part of symtab node. */
497 bool DEBUG_FUNCTION verify_base (void);
89330618 498
d52f5295
ML
499 /* Remove node from symbol table. This function is not used directly, but via
500 cgraph/varpool node removal routines. */
501 void unregister (void);
502
503 /* Return the initialization and finalization priority information for
504 DECL. If there is no previous priority information, a freshly
505 allocated structure is returned. */
506 struct symbol_priority_map *priority_info (void);
507
508private:
509 /* Worker for set_section. */
510 static bool set_section (symtab_node *n, void *s);
511
512 /* Worker for symtab_resolve_alias. */
513 static bool set_implicit_section (symtab_node *n, void *);
514
515 /* Worker searching noninterposable alias. */
516 static bool noninterposable_alias (symtab_node *node, void *data);
1f00098b 517};
1c4a429a 518
e55637b7
ML
519/* Walk all aliases for NODE. */
520#define FOR_EACH_ALIAS(node, alias) \
d52f5295 521 for (unsigned x_i = 0; node->iterate_direct_aliases (x_i, alias); x_i++)
6b02a499 522
d7f09764
DN
523/* This is the information that is put into the cgraph local structure
524 to recover a function. */
525struct lto_file_decl_data;
526
8a4a83ed 527extern const char * const cgraph_availability_names[];
430c6ceb 528extern const char * const ld_plugin_symbol_resolution_names[];
714c800f 529extern const char * const tls_model_names[];
8a4a83ed 530
6744a6ab
JH
531/* Information about thunk, used only for same body aliases. */
532
533struct GTY(()) cgraph_thunk_info {
534 /* Information about the thunk. */
535 HOST_WIDE_INT fixed_offset;
536 HOST_WIDE_INT virtual_value;
537 tree alias;
538 bool this_adjusting;
539 bool virtual_offset_p;
540 /* Set to true when alias node is thunk. */
541 bool thunk_p;
542};
543
dafc5b82 544/* Information about the function collected locally.
25c84396 545 Available after function is analyzed. */
dafc5b82 546
d1b38208 547struct GTY(()) cgraph_local_info {
e0bb17a8 548 /* Set when function function is visible in current compilation unit only
e2209b03 549 and its address is never taken. */
b4e19405 550 unsigned local : 1;
6674a6ce 551
124f1be6
MJ
552 /* False when there is something makes versioning impossible. */
553 unsigned versionable : 1;
554
61e03ffc
JH
555 /* False when function calling convention and signature can not be changed.
556 This is the case when __builtin_apply_args is used. */
557 unsigned can_change_signature : 1;
558
95c755e9
JH
559 /* True when the function has been originally extern inline, but it is
560 redefined now. */
b4e19405 561 unsigned redefined_extern_inline : 1;
0a35513e
AH
562
563 /* True if the function may enter serial irrevocable mode. */
564 unsigned tm_may_enter_irr : 1;
dafc5b82
JH
565};
566
567/* Information about the function that needs to be computed globally
726a989a 568 once compilation is finished. Available only with -funit-at-a-time. */
dafc5b82 569
d1b38208 570struct GTY(()) cgraph_global_info {
726a989a
RB
571 /* For inline clones this points to the function they will be
572 inlined into. */
d52f5295 573 cgraph_node *inlined_to;
dafc5b82
JH
574};
575
b255a036
JH
576/* Information about the function that is propagated by the RTL backend.
577 Available only for functions that has been already assembled. */
578
d1b38208 579struct GTY(()) cgraph_rtl_info {
17b29c0a 580 unsigned int preferred_incoming_stack_boundary;
27c07cc5
RO
581
582 /* Call unsaved hard registers really used by the corresponding
583 function (including ones used by functions called by the
584 function). */
585 HARD_REG_SET function_used_regs;
586 /* Set if function_used_regs is valid. */
587 unsigned function_used_regs_valid: 1;
b255a036
JH
588};
589
9187e02d
JH
590/* Represent which DECL tree (or reference to such tree)
591 will be replaced by another tree while versioning. */
592struct GTY(()) ipa_replace_map
593{
594 /* The tree that will be replaced. */
595 tree old_tree;
596 /* The new (replacing) tree. */
597 tree new_tree;
922f15c2
JH
598 /* Parameter number to replace, when old_tree is NULL. */
599 int parm_num;
9187e02d
JH
600 /* True when a substitution should be done, false otherwise. */
601 bool replace_p;
602 /* True when we replace a reference to old_tree. */
603 bool ref_p;
604};
9187e02d
JH
605
606struct GTY(()) cgraph_clone_info
607{
d52f5295 608 vec<ipa_replace_map *, va_gc> *tree_map;
9187e02d 609 bitmap args_to_skip;
08ad1d6d 610 bitmap combined_args_to_skip;
9187e02d
JH
611};
612
0136f8f0
AH
613enum cgraph_simd_clone_arg_type
614{
615 SIMD_CLONE_ARG_TYPE_VECTOR,
616 SIMD_CLONE_ARG_TYPE_UNIFORM,
617 SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP,
618 SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP,
619 SIMD_CLONE_ARG_TYPE_MASK
620};
621
622/* Function arguments in the original function of a SIMD clone.
623 Supplementary data for `struct simd_clone'. */
624
625struct GTY(()) cgraph_simd_clone_arg {
626 /* Original function argument as it originally existed in
627 DECL_ARGUMENTS. */
628 tree orig_arg;
629
630 /* orig_arg's function (or for extern functions type from
631 TYPE_ARG_TYPES). */
632 tree orig_type;
633
634 /* If argument is a vector, this holds the vector version of
635 orig_arg that after adjusting the argument types will live in
636 DECL_ARGUMENTS. Otherwise, this is NULL.
637
638 This basically holds:
639 vector(simdlen) __typeof__(orig_arg) new_arg. */
640 tree vector_arg;
641
642 /* vector_arg's type (or for extern functions new vector type. */
643 tree vector_type;
644
645 /* If argument is a vector, this holds the array where the simd
646 argument is held while executing the simd clone function. This
647 is a local variable in the cloned function. Its content is
648 copied from vector_arg upon entry to the clone.
649
650 This basically holds:
651 __typeof__(orig_arg) simd_array[simdlen]. */
652 tree simd_array;
653
654 /* A SIMD clone's argument can be either linear (constant or
655 variable), uniform, or vector. */
656 enum cgraph_simd_clone_arg_type arg_type;
657
658 /* For arg_type SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP this is
659 the constant linear step, if arg_type is
660 SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP, this is index of
661 the uniform argument holding the step, otherwise 0. */
662 HOST_WIDE_INT linear_step;
663
664 /* Variable alignment if available, otherwise 0. */
665 unsigned int alignment;
666};
667
668/* Specific data for a SIMD function clone. */
669
670struct GTY(()) cgraph_simd_clone {
671 /* Number of words in the SIMD lane associated with this clone. */
672 unsigned int simdlen;
673
674 /* Number of annotated function arguments in `args'. This is
675 usually the number of named arguments in FNDECL. */
676 unsigned int nargs;
677
678 /* Max hardware vector size in bits for integral vectors. */
679 unsigned int vecsize_int;
680
681 /* Max hardware vector size in bits for floating point vectors. */
682 unsigned int vecsize_float;
683
684 /* The mangling character for a given vector size. This is is used
685 to determine the ISA mangling bit as specified in the Intel
686 Vector ABI. */
687 unsigned char vecsize_mangle;
688
689 /* True if this is the masked, in-branch version of the clone,
690 otherwise false. */
691 unsigned int inbranch : 1;
692
693 /* True if this is a Cilk Plus variant. */
694 unsigned int cilk_elemental : 1;
695
696 /* Doubly linked list of SIMD clones. */
d52f5295 697 cgraph_node *prev_clone, *next_clone;
0136f8f0
AH
698
699 /* Original cgraph node the SIMD clones were created for. */
d52f5295 700 cgraph_node *origin;
0136f8f0
AH
701
702 /* Annotated function arguments for the original function. */
3dafb85c 703 cgraph_simd_clone_arg GTY((length ("%h.nargs"))) args[1];
0136f8f0
AH
704};
705
d52f5295
ML
706/* Function Multiversioning info. */
707struct GTY(()) cgraph_function_version_info {
708 /* The cgraph_node for which the function version info is stored. */
709 cgraph_node *this_node;
710 /* Chains all the semantically identical function versions. The
711 first function in this chain is the version_info node of the
712 default function. */
3dafb85c 713 cgraph_function_version_info *prev;
d52f5295
ML
714 /* If this version node corresponds to a dispatcher for function
715 versions, this points to the version info node of the default
716 function, the first node in the chain. */
3dafb85c 717 cgraph_function_version_info *next;
d52f5295
ML
718 /* If this node corresponds to a function version, this points
719 to the dispatcher function decl, which is the function that must
720 be called to execute the right function version at run-time.
721
722 If this cgraph node is a dispatcher (if dispatcher_function is
723 true, in the cgraph_node struct) for function versions, this
724 points to resolver function, which holds the function body of the
725 dispatcher. The dispatcher decl is an alias to the resolver
726 function decl. */
727 tree dispatcher_resolver;
728};
729
730#define DEFCIFCODE(code, type, string) CIF_ ## code,
731/* Reasons for inlining failures. */
732
733enum cgraph_inline_failed_t {
734#include "cif-code.def"
735 CIF_N_REASONS
736};
737
738enum cgraph_inline_failed_type_t
739{
740 CIF_FINAL_NORMAL = 0,
741 CIF_FINAL_ERROR
742};
743
744struct cgraph_edge;
5fefcf92 745
ba228239 746/* The cgraph data structure.
e0bb17a8 747 Each function decl has assigned cgraph_node listing callees and callers. */
1c4a429a 748
5e20cdc9 749struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node {
a3bfa8b8 750public:
d52f5295
ML
751 /* Remove the node from cgraph and all inline clones inlined into it.
752 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
753 removed. This allows to call the function from outer loop walking clone
754 tree. */
755 bool remove_symbol_and_inline_clones (cgraph_node *forbidden_node = NULL);
756
757 /* Record all references from cgraph_node that are taken
758 in statement STMT. */
759 void record_stmt_references (gimple stmt);
760
761 /* Like cgraph_set_call_stmt but walk the clone tree and update all
762 clones sharing the same function body.
763 When WHOLE_SPECULATIVE_EDGES is true, all three components of
764 speculative edge gets updated. Otherwise we update only direct
765 call. */
766 void set_call_stmt_including_clones (gimple old_stmt, gimple new_stmt,
767 bool update_speculative = true);
768
769 /* Walk the alias chain to return the function cgraph_node is alias of.
770 Walk through thunk, too.
771 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
772 cgraph_node *function_symbol (enum availability *avail = NULL);
773
774 /* Create node representing clone of N executed COUNT times. Decrease
775 the execution counts from original node too.
776 The new clone will have decl set to DECL that may or may not be the same
777 as decl of N.
778
779 When UPDATE_ORIGINAL is true, the counts are subtracted from the original
780 function's profile to reflect the fact that part of execution is handled
781 by node.
782 When CALL_DUPLICATOIN_HOOK is true, the ipa passes are acknowledged about
783 the new clone. Otherwise the caller is responsible for doing so later.
784
785 If the new node is being inlined into another one, NEW_INLINED_TO should be
786 the outline function the new one is (even indirectly) inlined to.
787 All hooks will see this in node's global.inlined_to, when invoked.
788 Can be NULL if the node is not inlined. */
789 cgraph_node *create_clone (tree decl, gcov_type count, int freq,
790 bool update_original,
791 vec<cgraph_edge *> redirect_callers,
792 bool call_duplication_hook,
3dafb85c 793 cgraph_node *new_inlined_to,
d52f5295
ML
794 bitmap args_to_skip);
795
796 /* Create callgraph node clone with new declaration. The actual body will
797 be copied later at compilation stage. */
798 cgraph_node *create_virtual_clone (vec<cgraph_edge *> redirect_callers,
799 vec<ipa_replace_map *, va_gc> *tree_map,
800 bitmap args_to_skip, const char * suffix);
801
802 /* cgraph node being removed from symbol table; see if its entry can be
803 replaced by other inline clone. */
804 cgraph_node *find_replacement (void);
805
806 /* Create a new cgraph node which is the new version of
807 callgraph node. REDIRECT_CALLERS holds the callers
808 edges which should be redirected to point to
809 NEW_VERSION. ALL the callees edges of the node
810 are cloned to the new version node. Return the new
811 version node.
812
813 If non-NULL BLOCK_TO_COPY determine what basic blocks
814 was copied to prevent duplications of calls that are dead
815 in the clone. */
816
817 cgraph_node *create_version_clone (tree new_decl,
818 vec<cgraph_edge *> redirect_callers,
819 bitmap bbs_to_copy);
820
821 /* Perform function versioning.
822 Function versioning includes copying of the tree and
823 a callgraph update (creating a new cgraph node and updating
824 its callees and callers).
825
826 REDIRECT_CALLERS varray includes the edges to be redirected
827 to the new version.
828
829 TREE_MAP is a mapping of tree nodes we want to replace with
830 new ones (according to results of prior analysis).
831
832 If non-NULL ARGS_TO_SKIP determine function parameters to remove
833 from new version.
834 If SKIP_RETURN is true, the new version will return void.
835 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
836 If non_NULL NEW_ENTRY determine new entry BB of the clone.
837
838 Return the new version's cgraph node. */
839 cgraph_node *create_version_clone_with_body
840 (vec<cgraph_edge *> redirect_callers,
841 vec<ipa_replace_map *, va_gc> *tree_map, bitmap args_to_skip,
842 bool skip_return, bitmap bbs_to_copy, basic_block new_entry_block,
843 const char *clone_name);
844
845 /* Insert a new cgraph_function_version_info node into cgraph_fnver_htab
846 corresponding to cgraph_node. */
3dafb85c 847 cgraph_function_version_info *insert_new_function_version (void);
d52f5295
ML
848
849 /* Get the cgraph_function_version_info node corresponding to node. */
3dafb85c 850 cgraph_function_version_info *function_version (void);
d52f5295
ML
851
852 /* Discover all functions and variables that are trivially needed, analyze
853 them as well as all functions and variables referred by them */
854 void analyze (void);
855
856 /* Add thunk alias into callgraph. The alias declaration is ALIAS and it
857 aliases DECL with an adjustments made into the first parameter.
858 See comments in thunk_adjust for detail on the parameters. */
859 cgraph_node * create_thunk (tree alias, tree, bool this_adjusting,
860 HOST_WIDE_INT fixed_offset,
861 HOST_WIDE_INT virtual_value,
862 tree virtual_offset,
863 tree real_alias);
864
865
866 /* Return node that alias is aliasing. */
867 inline cgraph_node *get_alias_target (void);
868
869 /* Given function symbol, walk the alias chain to return the function node
870 is alias of. Do not walk through thunks.
871 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
872
873 cgraph_node *ultimate_alias_target (availability *availability = NULL);
874
875 /* Expand thunk NODE to gimple if possible.
876 When FORCE_GIMPLE_THUNK is true, gimple thunk is created and
877 no assembler is produced.
878 When OUTPUT_ASM_THUNK is true, also produce assembler for
879 thunks that are not lowered. */
880 bool expand_thunk (bool output_asm_thunks, bool force_gimple_thunk);
881
3dafb85c
ML
882 /* Assemble thunks and aliases associated to node. */
883 void assemble_thunks_and_aliases (void);
884
885 /* Expand function specified by node. */
886 void expand (void);
887
d52f5295
ML
888 /* As an GCC extension we allow redefinition of the function. The
889 semantics when both copies of bodies differ is not well defined.
890 We replace the old body with new body so in unit at a time mode
891 we always use new body, while in normal mode we may end up with
892 old body inlined into some functions and new body expanded and
893 inlined in others. */
894 void reset (void);
895
896 /* Creates a wrapper from cgraph_node to TARGET node. Thunk is used for this
897 kind of wrapper method. */
898 void create_wrapper (cgraph_node *target);
899
900 /* Verify cgraph nodes of the cgraph node. */
901 void DEBUG_FUNCTION verify_node (void);
902
903 /* Remove function from symbol table. */
904 void remove (void);
905
906 /* Dump call graph node to file F. */
907 void dump (FILE *f);
908
909 /* Dump call graph node to stderr. */
910 void DEBUG_FUNCTION debug (void);
911
912 /* When doing LTO, read cgraph_node's body from disk if it is not already
913 present. */
914 bool get_body (void);
915
916 /* Release memory used to represent body of function.
917 Use this only for functions that are released before being translated to
918 target code (i.e. RTL). Functions that are compiled to RTL and beyond
919 are free'd in final.c via free_after_compilation(). */
bf898b30 920 void release_body (bool keep_arguments = false);
d52f5295
ML
921
922 /* cgraph_node is no longer nested function; update cgraph accordingly. */
923 void unnest (void);
924
925 /* Bring cgraph node local. */
926 void make_local (void);
927
928 /* Likewise indicate that a node is having address taken. */
929 void mark_address_taken (void);
930
931 /* Set fialization priority to PRIORITY. */
932 void set_fini_priority (priority_type priority);
933
934 /* Return the finalization priority. */
935 priority_type get_fini_priority (void);
936
937 /* Create edge from a given function to CALLEE in the cgraph. */
3dafb85c
ML
938 cgraph_edge *create_edge (cgraph_node *callee,
939 gimple call_stmt, gcov_type count,
940 int freq);
941
d52f5295
ML
942 /* Create an indirect edge with a yet-undetermined callee where the call
943 statement destination is a formal parameter of the caller with index
944 PARAM_INDEX. */
3dafb85c
ML
945 cgraph_edge *create_indirect_edge (gimple call_stmt, int ecf_flags,
946 gcov_type count, int freq,
947 bool compute_indirect_info = true);
d52f5295
ML
948
949 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
950 same function body. If clones already have edge for OLD_STMT; only
951 update the edge same way as cgraph_set_call_stmt_including_clones does. */
3dafb85c 952 void create_edge_including_clones (cgraph_node *callee,
d52f5295
ML
953 gimple old_stmt, gimple stmt,
954 gcov_type count,
955 int freq,
956 cgraph_inline_failed_t reason);
957
958 /* Return the callgraph edge representing the GIMPLE_CALL statement
959 CALL_STMT. */
960 cgraph_edge *get_edge (gimple call_stmt);
961
962 /* Collect all callers of cgraph_node and its aliases that are known to lead
963 to NODE (i.e. are not overwritable). */
964 vec<cgraph_edge *> collect_callers (void);
965
966 /* Remove all callers from the node. */
967 void remove_callers (void);
968
969 /* Remove all callees from the node. */
970 void remove_callees (void);
971
972 /* Return function availability. See cgraph.h for description of individual
973 return values. */
974 enum availability get_availability (void);
975
976 /* Set TREE_NOTHROW on cgraph_node's decl and on aliases of the node
977 if any to NOTHROW. */
978 void set_nothrow_flag (bool nothrow);
979
980 /* Set TREE_READONLY on cgraph_node's decl and on aliases of the node
981 if any to READONLY. */
982 void set_const_flag (bool readonly, bool looping);
983
984 /* Set DECL_PURE_P on cgraph_node's decl and on aliases of the node
985 if any to PURE. */
986 void set_pure_flag (bool pure, bool looping);
987
d52f5295
ML
988 /* Call calback on function and aliases associated to the function.
989 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
990 skipped. */
991
992 bool call_for_symbol_and_aliases (bool (*callback) (cgraph_node *,
993 void *),
994 void *data, bool include_overwritable);
995
996 /* Call calback on cgraph_node, thunks and aliases associated to NODE.
997 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
998 skipped. */
999 bool call_for_symbol_thunks_and_aliases (bool (*callback) (cgraph_node *node,
1000 void *data),
1001 void *data,
1002 bool include_overwritable);
1003
d52f5295
ML
1004 /* Likewise indicate that a node is needed, i.e. reachable via some
1005 external means. */
1006 inline void mark_force_output (void);
1007
1008 /* Return true when function can be marked local. */
1009 bool local_p (void);
1010
1011 /* Return true if cgraph_node can be made local for API change.
1012 Extern inline functions and C++ COMDAT functions can be made local
1013 at the expense of possible code size growth if function is used in multiple
1014 compilation units. */
1015 bool can_be_local_p (void);
1016
1017 /* Return true when cgraph_node can not return or throw and thus
1018 it is safe to ignore its side effects for IPA analysis. */
1019 bool cannot_return_p (void);
1020
1021 /* Return true when function cgraph_node and all its aliases are only called
1022 directly.
1023 i.e. it is not externally visible, address was not taken and
1024 it is not used in any other non-standard way. */
1025 bool only_called_directly_p (void);
1026
1027 /* Return true when function is only called directly or it has alias.
1028 i.e. it is not externally visible, address was not taken and
1029 it is not used in any other non-standard way. */
1030 inline bool only_called_directly_or_aliased_p (void);
1031
1032 /* Return true when function cgraph_node can be expected to be removed
1033 from program when direct calls in this compilation unit are removed.
1034
1035 As a special case COMDAT functions are
1036 cgraph_can_remove_if_no_direct_calls_p while the are not
1037 cgraph_only_called_directly_p (it is possible they are called from other
1038 unit)
1039
1040 This function behaves as cgraph_only_called_directly_p because eliminating
1041 all uses of COMDAT function does not make it necessarily disappear from
1042 the program unless we are compiling whole program or we do LTO. In this
1043 case we know we win since dynamic linking will not really discard the
1044 linkonce section. */
1045 bool will_be_removed_from_program_if_no_direct_calls_p (void);
1046
1047 /* Return true when function can be removed from callgraph
1048 if all direct calls are eliminated. */
1049 bool can_remove_if_no_direct_calls_and_refs_p (void);
1050
1051 /* Return true when function cgraph_node and its aliases can be removed from
1052 callgraph if all direct calls are eliminated. */
1053 bool can_remove_if_no_direct_calls_p (void);
1054
1055 /* Return true when callgraph node is a function with Gimple body defined
1056 in current unit. Functions can also be define externally or they
1057 can be thunks with no Gimple representation.
1058
1059 Note that at WPA stage, the function body may not be present in memory. */
1060 inline bool has_gimple_body_p (void);
1061
1062 /* Return true if function should be optimized for size. */
1063 bool optimize_for_size_p (void);
1064
1065 /* Dump the callgraph to file F. */
1066 static void dump_cgraph (FILE *f);
1067
1068 /* Dump the call graph to stderr. */
3dafb85c
ML
1069 static inline
1070 void debug_cgraph (void)
d52f5295
ML
1071 {
1072 dump_cgraph (stderr);
1073 }
1074
1075 /* Record that DECL1 and DECL2 are semantically identical function
1076 versions. */
1077 static void record_function_versions (tree decl1, tree decl2);
1078
1079 /* Remove the cgraph_function_version_info and cgraph_node for DECL. This
1080 DECL is a duplicate declaration. */
1081 static void delete_function_version (tree decl);
1082
1083 /* Add the function FNDECL to the call graph.
3dafb85c 1084 Unlike finalize_function, this function is intended to be used
d52f5295
ML
1085 by middle end and allows insertion of new function at arbitrary point
1086 of compilation. The function can be either in high, low or SSA form
1087 GIMPLE.
1088
1089 The function is assumed to be reachable and have address taken (so no
1090 API breaking optimizations are performed on it).
1091
1092 Main work done by this function is to enqueue the function for later
1093 processing to avoid need the passes to be re-entrant. */
1094 static void add_new_function (tree fndecl, bool lowered);
1095
1096 /* Return callgraph node for given symbol and check it is a function. */
1097 static inline cgraph_node *get (const_tree decl)
1098 {
1099 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL);
1100 return dyn_cast <cgraph_node *> (symtab_node::get (decl));
1101 }
1102
3dafb85c
ML
1103 /* DECL has been parsed. Take it, queue it, compile it at the whim of the
1104 logic in effect. If NO_COLLECT is true, then our caller cannot stand to
1105 have the garbage collector run at the moment. We would need to either
1106 create a new GC context, or just not compile right now. */
1107 static void finalize_function (tree, bool);
1108
d52f5295
ML
1109 /* Return cgraph node assigned to DECL. Create new one when needed. */
1110 static cgraph_node * create (tree decl);
1111
d52f5295
ML
1112 /* Try to find a call graph node for declaration DECL and if it does not
1113 exist or if it corresponds to an inline clone, create a new one. */
1114 static cgraph_node * get_create (tree);
1115
3dafb85c
ML
1116 /* Return local info for the compiled function. */
1117 static cgraph_local_info *local_info (tree decl);
1118
1119 /* Return global info for the compiled function. */
1120 static cgraph_global_info *global_info (tree);
1121
1122 /* Return local info for the compiled function. */
1123 static cgraph_rtl_info *rtl_info (tree);
1124
d52f5295
ML
1125 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
1126 Return NULL if there's no such node. */
1127 static cgraph_node *get_for_asmname (tree asmname);
1128
1129 /* Attempt to mark ALIAS as an alias to DECL. Return alias node if
1130 successful and NULL otherwise.
1131 Same body aliases are output whenever the body of DECL is output,
1132 and cgraph_node::get (ALIAS) transparently
1133 returns cgraph_node::get (DECL). */
1134 static cgraph_node * create_same_body_alias (tree alias, tree decl);
1135
1136 /* Worker for cgraph_can_remove_if_no_direct_calls_p. */
1137 static bool used_from_object_file_p_worker (cgraph_node *node, void *)
1138 {
1139 return node->used_from_object_file_p ();
1140 }
1141
1142 /* Return true when cgraph_node can not be local.
1143 Worker for cgraph_local_node_p. */
1144 static bool non_local_p (cgraph_node *node, void *);
1145
1146 /* Verify whole cgraph structure. */
1147 static void DEBUG_FUNCTION verify_cgraph_nodes (void);
1148
1149 /* Worker to bring NODE local. */
1150 static bool make_local (cgraph_node *node, void *);
1151
1152 /* Mark ALIAS as an alias to DECL. DECL_NODE is cgraph node representing
1153 the function body is associated
1154 with (not necessarily cgraph_node (DECL). */
1155 static cgraph_node *create_alias (tree alias, tree target);
1156
3dafb85c
ML
1157 cgraph_edge *callees;
1158 cgraph_edge *callers;
e33c6cd6
MJ
1159 /* List of edges representing indirect calls with a yet undetermined
1160 callee. */
3dafb85c 1161 cgraph_edge *indirect_calls;
1c4a429a 1162 /* For nested functions points to function the node is nested in. */
d52f5295 1163 cgraph_node *origin;
1c4a429a 1164 /* Points to first nested function, if any. */
d52f5295 1165 cgraph_node *nested;
1c4a429a 1166 /* Pointer to the next function with same origin, if any. */
d52f5295 1167 cgraph_node *next_nested;
18c6ada9 1168 /* Pointer to the next clone. */
d52f5295
ML
1169 cgraph_node *next_sibling_clone;
1170 cgraph_node *prev_sibling_clone;
1171 cgraph_node *clones;
1172 cgraph_node *clone_of;
70d539ce
JH
1173 /* For functions with many calls sites it holds map from call expression
1174 to the edge to speed up cgraph_edge function. */
3dafb85c 1175 htab_t GTY((param_is (cgraph_edge))) call_site_hash;
97ba0040
JH
1176 /* Declaration node used to be clone of. */
1177 tree former_clone_of;
c22cacf3 1178
0136f8f0
AH
1179 /* If this is a SIMD clone, this points to the SIMD specific
1180 information for it. */
3dafb85c 1181 cgraph_simd_clone *simdclone;
0136f8f0 1182 /* If this function has SIMD clones, this points to the first clone. */
d52f5295 1183 cgraph_node *simd_clones;
0136f8f0 1184
0e3776db
JH
1185 /* Interprocedural passes scheduled to have their transform functions
1186 applied next time we execute local pass on them. We maintain it
1187 per-function in order to allow IPA passes to introduce new functions. */
9771b263 1188 vec<ipa_opt_pass> GTY((skip)) ipa_transforms_to_apply;
0e3776db 1189
3dafb85c
ML
1190 cgraph_local_info local;
1191 cgraph_global_info global;
1192 cgraph_rtl_info rtl;
1193 cgraph_clone_info clone;
1194 cgraph_thunk_info thunk;
c22cacf3 1195
e42922b1
JH
1196 /* Expected number of executions: calculated in profile.c. */
1197 gcov_type count;
db0bf14f
JH
1198 /* How to scale counts at materialization time; used to merge
1199 LTO units with different number of profile runs. */
1200 int count_materialization_scale;
95c755e9
JH
1201 /* Unique id of the node. */
1202 int uid;
2fa3d31b
JH
1203 /* ID assigned by the profiling. */
1204 unsigned int profile_id;
86ce5d2f
ML
1205 /* Time profiler: first run of function. */
1206 int tp_first_run;
3691626c 1207
6b20f353
DS
1208 /* Set when decl is an abstract function pointed to by the
1209 ABSTRACT_DECL_ORIGIN of a reachable function. */
c0c123ef 1210 unsigned used_as_abstract_origin : 1;
50674e96 1211 /* Set once the function is lowered (i.e. its CFG is built). */
b4e19405 1212 unsigned lowered : 1;
25c84396
RH
1213 /* Set once the function has been instantiated and its callee
1214 lists created. */
257eb6e3 1215 unsigned process : 1;
5fefcf92
JH
1216 /* How commonly executed the node is. Initialized during branch
1217 probabilities pass. */
1218 ENUM_BITFIELD (node_frequency) frequency : 2;
844db5d0
JH
1219 /* True when function can only be called at startup (from static ctor). */
1220 unsigned only_called_at_startup : 1;
1221 /* True when function can only be called at startup (from static dtor). */
1222 unsigned only_called_at_exit : 1;
0a35513e
AH
1223 /* True when function is the transactional clone of a function which
1224 is called only from inside transactions. */
1225 /* ?? We should be able to remove this. We have enough bits in
1226 cgraph to calculate it. */
1227 unsigned tm_clone : 1;
3649b9b7
ST
1228 /* True if this decl is a dispatcher for function versions. */
1229 unsigned dispatcher_function : 1;
1f26ac87
JM
1230 /* True if this decl calls a COMDAT-local function. This is set up in
1231 compute_inline_parameters and inline_call. */
1232 unsigned calls_comdat_local : 1;
3649b9b7
ST
1233};
1234
fed5ae11
DK
1235/* A cgraph node set is a collection of cgraph nodes. A cgraph node
1236 can appear in multiple sets. */
1cb1a99f 1237struct cgraph_node_set_def
fed5ae11 1238{
b787e7a2 1239 hash_map<cgraph_node *, size_t> *map;
d52f5295 1240 vec<cgraph_node *> nodes;
fed5ae11
DK
1241};
1242
d52f5295
ML
1243typedef cgraph_node_set_def *cgraph_node_set;
1244typedef struct varpool_node_set_def *varpool_node_set;
2942c502 1245
d52f5295 1246class varpool_node;
2942c502
JH
1247
1248/* A varpool node set is a collection of varpool nodes. A varpool node
1249 can appear in multiple sets. */
1cb1a99f 1250struct varpool_node_set_def
2942c502 1251{
b787e7a2 1252 hash_map<varpool_node *, size_t> * map;
d52f5295 1253 vec<varpool_node *> nodes;
2942c502
JH
1254};
1255
fed5ae11 1256/* Iterator structure for cgraph node sets. */
84562394 1257struct cgraph_node_set_iterator
fed5ae11
DK
1258{
1259 cgraph_node_set set;
1260 unsigned index;
84562394 1261};
fed5ae11 1262
2942c502 1263/* Iterator structure for varpool node sets. */
84562394 1264struct varpool_node_set_iterator
2942c502
JH
1265{
1266 varpool_node_set set;
1267 unsigned index;
84562394 1268};
2942c502 1269
ba392339
JH
1270/* Context of polymorphic call. It represent information about the type of
1271 instance that may reach the call. This is used by ipa-devirt walkers of the
1272 type inheritance graph. */
1273
1274class GTY(()) ipa_polymorphic_call_context {
1275public:
1276 /* The called object appears in an object of type OUTER_TYPE
1277 at offset OFFSET. When information is not 100% reliable, we
1278 use SPECULATIVE_OUTER_TYPE and SPECULATIVE_OFFSET. */
1279 HOST_WIDE_INT offset;
1280 HOST_WIDE_INT speculative_offset;
1281 tree outer_type;
1282 tree speculative_outer_type;
1283 /* True if outer object may be in construction or destruction. */
1284 bool maybe_in_construction;
1285 /* True if outer object may be of derived type. */
1286 bool maybe_derived_type;
1287 /* True if speculative outer object may be of derived type. We always
1288 speculate that construction does not happen. */
1289 bool speculative_maybe_derived_type;
1290 /* True if the context is invalid and all calls should be redirected
1291 to BUILTIN_UNREACHABLE. */
1292 bool invalid;
1293
1294 /* Build empty "I know nothing" context. */
1295 ipa_polymorphic_call_context ();
1296 /* Build polymorphic call context for indirect call E. */
1297 ipa_polymorphic_call_context (cgraph_edge *e);
1298 /* Build polymorphic call context for IP invariant CST.
1299 If specified, OTR_TYPE specify the type of polymorphic call
1300 that takes CST+OFFSET as a prameter. */
1301 ipa_polymorphic_call_context (tree cst, tree otr_type = NULL,
1302 HOST_WIDE_INT offset = 0);
1303 /* Build context for pointer REF contained in FNDECL at statement STMT.
1304 if INSTANCE is non-NULL, return pointer to the object described by
1305 the context. */
1306 ipa_polymorphic_call_context (tree fndecl, tree ref, gimple stmt,
1307 tree *instance = NULL);
1308
1309 /* Look for vtable stores or constructor calls to work out dynamic type
1310 of memory location. */
1311 bool get_dynamic_type (tree, tree, tree, gimple);
1312
1313 /* Make context non-speculative. */
1314 void clear_speculation ();
1315
1316 /* Walk container types and modify context to point to actual class
67a1b94c
JH
1317 containing OTR_TYPE (if non-NULL) as base class.
1318 Return true if resulting context is valid.
1319
1320 When CONSIDER_PLACEMENT_NEW is false, reject contexts that may be made
1321 valid only via alocation of new polymorphic type inside by means
1322 of placement new.
1323
1324 When CONSIDER_BASES is false, only look for actual fields, not base types
1325 of TYPE. */
1326 bool restrict_to_inner_class (tree otr_type,
1327 bool consider_placement_new = true,
1328 bool consider_bases = true);
1329
1330 /* Adjust all offsets in contexts by given number of bits. */
1331 void offset_by (HOST_WIDE_INT);
1332 /* Take non-speculative info, merge it with speculative and clear speculatoin.
1333 Used when we no longer manage to keep track of actual outer type, but we
1334 think it is still there.
1335 If OTR_TYPE is set, the transformation can be done more effectively assuming
1336 that context is going to be used only that way. */
1337 void make_speculative (tree otr_type = NULL);
1338 /* Assume that both THIS and a given context is valid and strenghten THIS
1339 if possible. Return true if any strenghtening was made.
1340 If actual type the context is being used in is known, OTR_TYPE should be
1341 set accordingly. This improves quality of combined result. */
1342 bool combine_with (ipa_polymorphic_call_context, tree otr_type = NULL);
1343
1344 /* Return TRUE if context is fully useless. */
1345 bool useless_p () const;
ba392339
JH
1346
1347 /* Dump human readable context to F. */
1348 void dump (FILE *f) const;
1349 void DEBUG_FUNCTION debug () const;
1350
1351 /* LTO streaming. */
1352 void stream_out (struct output_block *) const;
1353 void stream_in (struct lto_input_block *, struct data_in *data_in);
1354
1355private:
67a1b94c 1356 bool combine_speculation_with (tree, HOST_WIDE_INT, bool, tree);
ba392339
JH
1357 void set_by_decl (tree, HOST_WIDE_INT);
1358 bool set_by_invariant (tree, tree, HOST_WIDE_INT);
1359 void clear_outer_type (tree otr_type = NULL);
67a1b94c 1360 bool speculation_consistent_p (tree, HOST_WIDE_INT, bool, tree);
ba392339
JH
1361};
1362
e33c6cd6
MJ
1363/* Structure containing additional information about an indirect call. */
1364
1365struct GTY(()) cgraph_indirect_call_info
1366{
ba392339
JH
1367 /* When agg_content is set, an offset where the call pointer is located
1368 within the aggregate. */
1369 HOST_WIDE_INT offset;
1370 /* Context of the polymorphic call; use only when POLYMORPHIC flag is set. */
1371 ipa_polymorphic_call_context context;
b258210c
MJ
1372 /* OBJ_TYPE_REF_TOKEN of a polymorphic call (if polymorphic is set). */
1373 HOST_WIDE_INT otr_token;
1374 /* Type of the object from OBJ_TYPE_REF_OBJECT. */
ba392339 1375 tree otr_type;
e33c6cd6
MJ
1376 /* Index of the parameter that is called. */
1377 int param_index;
5f902d76
JH
1378 /* ECF flags determined from the caller. */
1379 int ecf_flags;
634ab819
JH
1380 /* Profile_id of common target obtrained from profile. */
1381 int common_target_id;
1382 /* Probability that call will land in function with COMMON_TARGET_ID. */
1383 int common_target_probability;
b258210c
MJ
1384
1385 /* Set when the call is a virtual call with the parameter being the
1386 associated object pointer rather than a simple direct call. */
1387 unsigned polymorphic : 1;
8b7773a4
MJ
1388 /* Set when the call is a call of a pointer loaded from contents of an
1389 aggregate at offset. */
1390 unsigned agg_contents : 1;
c13bc3d9
MJ
1391 /* Set when this is a call through a member pointer. */
1392 unsigned member_ptr : 1;
8b7773a4
MJ
1393 /* When the previous bit is set, this one determines whether the destination
1394 is loaded from a parameter passed by reference. */
1395 unsigned by_ref : 1;
e33c6cd6
MJ
1396};
1397
d1b38208 1398struct GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"))) cgraph_edge {
3dafb85c
ML
1399 friend class cgraph_node;
1400
1401 /* Remove the edge in the cgraph. */
1402 void remove (void);
1403
1404 /* Change field call_stmt of edge to NEW_STMT.
1405 If UPDATE_SPECULATIVE and E is any component of speculative
1406 edge, then update all components. */
1407 void set_call_stmt (gimple new_stmt, bool update_speculative = true);
1408
1409 /* Redirect callee of the edge to N. The function does not update underlying
1410 call expression. */
1411 void redirect_callee (cgraph_node *n);
1412
1413 /* Make an indirect edge with an unknown callee an ordinary edge leading to
1414 CALLEE. DELTA is an integer constant that is to be added to the this
1415 pointer (first parameter) to compensate for skipping
1416 a thunk adjustment. */
1417 cgraph_edge *make_direct (cgraph_node *callee);
1418
1419 /* Turn edge into speculative call calling N2. Update
1420 the profile so the direct call is taken COUNT times
1421 with FREQUENCY. */
1422 cgraph_edge *make_speculative (cgraph_node *n2, gcov_type direct_count,
1423 int direct_frequency);
1424
1425 /* Given speculative call edge, return all three components. */
1426 void speculative_call_info (cgraph_edge *&direct, cgraph_edge *&indirect,
1427 ipa_ref *&reference);
1428
1429 /* Speculative call edge turned out to be direct call to CALLE_DECL.
1430 Remove the speculative call sequence and return edge representing the call.
1431 It is up to caller to redirect the call as appropriate. */
1432 cgraph_edge *resolve_speculation (tree callee_decl = NULL);
1433
1434 /* If necessary, change the function declaration in the call statement
1435 associated with the edge so that it corresponds to the edge callee. */
1436 gimple redirect_call_stmt_to_callee (void);
1437
1438 /* Create clone of edge in the node N represented
1439 by CALL_EXPR the callgraph. */
1440 cgraph_edge * clone (cgraph_node *n, gimple call_stmt, unsigned stmt_uid,
1441 gcov_type count_scale, int freq_scale, bool update_original);
1442
1443 /* Return true when call of edge can not lead to return from caller
1444 and thus it is safe to ignore its side effects for IPA analysis
1445 when computing side effects of the caller. */
1446 bool cannot_lead_to_return_p (void);
1447
1448 /* Return true when the edge represents a direct recursion. */
1449 bool recursive_p (void);
1450
1451 /* Return true if the call can be hot. */
1452 bool maybe_hot_p (void);
1453
1454 /* Rebuild cgraph edges for current function node. This needs to be run after
1455 passes that don't update the cgraph. */
1456 static unsigned int rebuild_edges (void);
1457
1458 /* Rebuild cgraph references for current function node. This needs to be run
1459 after passes that don't update the cgraph. */
1460 static void rebuild_references (void);
1461
6009ee7b
MJ
1462 /* Expected number of executions: calculated in profile.c. */
1463 gcov_type count;
d52f5295
ML
1464 cgraph_node *caller;
1465 cgraph_node *callee;
3dafb85c
ML
1466 cgraph_edge *prev_caller;
1467 cgraph_edge *next_caller;
1468 cgraph_edge *prev_callee;
1469 cgraph_edge *next_callee;
726a989a 1470 gimple call_stmt;
e33c6cd6
MJ
1471 /* Additional information about an indirect call. Not cleared when an edge
1472 becomes direct. */
3dafb85c 1473 cgraph_indirect_call_info *indirect_info;
18c6ada9 1474 PTR GTY ((skip (""))) aux;
61a05df1
JH
1475 /* When equal to CIF_OK, inline this call. Otherwise, points to the
1476 explanation why function was not inlined. */
84562394 1477 enum cgraph_inline_failed_t inline_failed;
6009ee7b
MJ
1478 /* The stmt_uid of call_stmt. This is used by LTO to recover the call_stmt
1479 when the function is serialized in. */
1480 unsigned int lto_stmt_uid;
b8698a0f 1481 /* Expected frequency of executions within the function.
45a80bb9
JH
1482 When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
1483 per function call. The range is 0 to CGRAPH_FREQ_MAX. */
1484 int frequency;
6009ee7b
MJ
1485 /* Unique id of the edge. */
1486 int uid;
e33c6cd6
MJ
1487 /* Whether this edge was made direct by indirect inlining. */
1488 unsigned int indirect_inlining_edge : 1;
1489 /* Whether this edge describes an indirect call with an undetermined
1490 callee. */
1491 unsigned int indirect_unknown_callee : 1;
1492 /* Whether this edge is still a dangling */
d7f09764
DN
1493 /* True if the corresponding CALL stmt cannot be inlined. */
1494 unsigned int call_stmt_cannot_inline_p : 1;
2505c5ed
JH
1495 /* Can this call throw externally? */
1496 unsigned int can_throw_external : 1;
042ae7d2
JH
1497 /* Edges with SPECULATIVE flag represents indirect calls that was
1498 speculatively turned into direct (i.e. by profile feedback).
1499 The final code sequence will have form:
1500
1501 if (call_target == expected_fn)
1502 expected_fn ();
1503 else
1504 call_target ();
1505
1506 Every speculative call is represented by three components attached
1507 to a same call statement:
1508 1) a direct call (to expected_fn)
1509 2) an indirect call (to call_target)
1510 3) a IPA_REF_ADDR refrence to expected_fn.
1511
1512 Optimizers may later redirect direct call to clone, so 1) and 3)
1513 do not need to necesarily agree with destination. */
1514 unsigned int speculative : 1;
3dafb85c
ML
1515
1516private:
1517 /* Remove the edge from the list of the callers of the callee. */
1518 void remove_caller (void);
1519
1520 /* Remove the edge from the list of the callees of the caller. */
1521 void remove_callee (void);
1c4a429a
JH
1522};
1523
45a80bb9
JH
1524#define CGRAPH_FREQ_BASE 1000
1525#define CGRAPH_FREQ_MAX 100000
1526
8a4a83ed
JH
1527/* The varpool data structure.
1528 Each static variable decl has assigned varpool_node. */
e69529cd 1529
5e20cdc9 1530class GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node {
a3bfa8b8 1531public:
9041d2e6
ML
1532 /* Dump given varpool node to F. */
1533 void dump (FILE *f);
1534
1535 /* Dump given varpool node to stderr. */
1536 void DEBUG_FUNCTION debug (void);
1537
1538 /* Remove variable from symbol table. */
1539 void remove (void);
1540
1541 /* Remove node initializer when it is no longer needed. */
1542 void remove_initializer (void);
1543
1544 void analyze (void);
1545
1546 /* Return variable availability. */
1547 availability get_availability (void);
1548
1549 /* When doing LTO, read variable's constructor from disk if
1550 it is not already present. */
1551 tree get_constructor (void);
1552
1553 /* Return true if variable has constructor that can be used for folding. */
1554 bool ctor_useable_for_folding_p (void);
1555
1556 /* For given variable pool node, walk the alias chain to return the function
1557 the variable is alias of. Do not walk through thunks.
1558 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
1559 inline varpool_node *ultimate_alias_target
1560 (availability *availability = NULL);
1561
1562 /* Return node that alias is aliasing. */
1563 inline varpool_node *get_alias_target (void);
1564
1565 /* Output one variable, if necessary. Return whether we output it. */
1566 bool assemble_decl (void);
1567
1568 /* For variables in named sections make sure get_variable_section
1569 is called before we switch to those sections. Then section
1570 conflicts between read-only and read-only requiring relocations
1571 sections can be resolved. */
1572 void finalize_named_section_flags (void);
1573
1574 /* Call calback on varpool symbol and aliases associated to varpool symbol.
1575 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
1576 skipped. */
1577 bool call_for_node_and_aliases (bool (*callback) (varpool_node *, void *),
1578 void *data,
1579 bool include_overwritable);
1580
1581 /* Return true when variable should be considered externally visible. */
1582 bool externally_visible_p (void);
1583
1584 /* Return true when all references to variable must be visible
1585 in ipa_ref_list.
1586 i.e. if the variable is not externally visible or not used in some magic
1587 way (asm statement or such).
1588 The magic uses are all summarized in force_output flag. */
1589 inline bool all_refs_explicit_p ();
1590
1591 /* Return true when variable can be removed from variable pool
1592 if all direct calls are eliminated. */
1593 inline bool can_remove_if_no_refs_p (void);
1594
3dafb85c
ML
1595 /* Add the variable DECL to the varpool.
1596 Unlike finalize_decl function is intended to be used
1597 by middle end and allows insertion of new variable at arbitrary point
1598 of compilation. */
1599 static void add (tree decl);
1600
9041d2e6
ML
1601 /* Return varpool node for given symbol and check it is a function. */
1602 static inline varpool_node *get (const_tree decl);
1603
1604 /* Mark DECL as finalized. By finalizing the declaration, frontend instruct
1605 the middle end to output the variable to asm file, if needed or externally
1606 visible. */
1607 static void finalize_decl (tree decl);
1608
9041d2e6
ML
1609 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
1610 Extra name aliases are output whenever DECL is output. */
1611 static varpool_node * create_extra_name_alias (tree alias, tree decl);
1612
1613 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
1614 Extra name aliases are output whenever DECL is output. */
1615 static varpool_node * create_alias (tree, tree);
1616
1617 /* Dump the variable pool to F. */
1618 static void dump_varpool (FILE *f);
1619
1620 /* Dump the variable pool to stderr. */
1621 static void DEBUG_FUNCTION debug_varpool (void);
1622
1623 /* Allocate new callgraph node and insert it into basic data structures. */
1624 static varpool_node *create_empty (void);
1625
1626 /* Return varpool node assigned to DECL. Create new one when needed. */
1627 static varpool_node *get_create (tree decl);
1628
1629 /* Given an assembler name, lookup node. */
1630 static varpool_node *get_for_asmname (tree asmname);
1631
6b02a499 1632 /* Set when variable is scheduled to be assembled. */
b4e19405 1633 unsigned output : 1;
eb1d8159 1634
59b36ecf
JJ
1635 /* Set if the variable is dynamically initialized, except for
1636 function local statics. */
1637 unsigned dynamically_initialized : 1;
56363ffd
JH
1638
1639 ENUM_BITFIELD(tls_model) tls_model : 3;
eb6a09a7
JH
1640
1641 /* Set if the variable is known to be used by single function only.
1642 This is computed by ipa_signle_use pass and used by late optimizations
1643 in places where optimization would be valid for local static variable
1644 if we did not do any inter-procedural code movement. */
1645 unsigned used_by_single_function : 1;
d52f5295 1646
9041d2e6
ML
1647private:
1648 /* Assemble thunks and aliases associated to varpool node. */
1649 void assemble_aliases (void);
e69529cd
JH
1650};
1651
65d630d4 1652/* Every top level asm statement is put into a asm_node. */
474eccc6 1653
65d630d4 1654struct GTY(()) asm_node {
3dafb85c
ML
1655
1656
474eccc6 1657 /* Next asm node. */
3dafb85c 1658 asm_node *next;
474eccc6
ILT
1659 /* String for this asm node. */
1660 tree asm_str;
1661 /* Ordering of all cgraph nodes. */
1662 int order;
1663};
1664
5d59b5e1
LC
1665/* Report whether or not THIS symtab node is a function, aka cgraph_node. */
1666
1667template <>
1668template <>
1669inline bool
7de90a6c 1670is_a_helper <cgraph_node *>::test (symtab_node *p)
5d59b5e1 1671{
d52f5295 1672 return p && p->type == SYMTAB_FUNCTION;
5d59b5e1
LC
1673}
1674
1675/* Report whether or not THIS symtab node is a vriable, aka varpool_node. */
1676
1677template <>
1678template <>
1679inline bool
7de90a6c 1680is_a_helper <varpool_node *>::test (symtab_node *p)
5d59b5e1 1681{
d52f5295 1682 return p && p->type == SYMTAB_VARIABLE;
5d59b5e1
LC
1683}
1684
3dafb85c
ML
1685/* Macros to access the next item in the list of free cgraph nodes and
1686 edges. */
1687#define NEXT_FREE_NODE(NODE) dyn_cast<cgraph_node *> ((NODE)->next)
1688#define SET_NEXT_FREE_NODE(NODE,NODE2) ((NODE))->next = NODE2
1689#define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
1690
1691typedef void (*cgraph_edge_hook)(cgraph_edge *, void *);
1692typedef void (*cgraph_node_hook)(cgraph_node *, void *);
1693typedef void (*varpool_node_hook)(varpool_node *, void *);
1694typedef void (*cgraph_2edge_hook)(cgraph_edge *, cgraph_edge *, void *);
1695typedef void (*cgraph_2node_hook)(cgraph_node *, cgraph_node *, void *);
1696
1697struct cgraph_edge_hook_list;
1698struct cgraph_node_hook_list;
1699struct varpool_node_hook_list;
1700struct cgraph_2edge_hook_list;
1701struct cgraph_2node_hook_list;
1702
1703/* Map from a symbol to initialization/finalization priorities. */
1704struct GTY(()) symbol_priority_map {
3dafb85c
ML
1705 priority_type init;
1706 priority_type fini;
1707};
1708
1709enum symtab_state
f45e0ad1 1710{
66058468 1711 /* Frontend is parsing and finalizing functions. */
3dafb85c 1712 PARSING,
f45e0ad1 1713 /* Callgraph is being constructed. It is safe to add new functions. */
3dafb85c 1714 CONSTRUCTION,
ca0f62a8 1715 /* Callgraph is being at LTO time. */
3dafb85c 1716 LTO_STREAMING,
f45e0ad1 1717 /* Callgraph is built and IPA passes are being run. */
3dafb85c 1718 IPA,
7a388ee4 1719 /* Callgraph is built and all functions are transformed to SSA form. */
3dafb85c 1720 IPA_SSA,
f45e0ad1 1721 /* Functions are now ordered and being passed to RTL expanders. */
3dafb85c 1722 EXPANSION,
f45e0ad1 1723 /* All cgraph expansion is done. */
3dafb85c 1724 FINISHED
f45e0ad1 1725};
1c4a429a 1726
3dafb85c
ML
1727class GTY((tag ("SYMTAB"))) symbol_table
1728{
1729public:
1730 friend class symtab_node;
1731 friend class cgraph_node;
1732 friend class cgraph_edge;
1733
1734 /* Initialize callgraph dump file. */
1735 inline void
1736 initialize (void)
1737 {
1738 if (!dump_file)
1739 dump_file = dump_begin (TDI_cgraph, NULL);
1740 }
1741
1742 /* Register a top-level asm statement ASM_STR. */
1743 inline asm_node *finalize_toplevel_asm (tree asm_str);
1744
1745 /* Analyze the whole compilation unit once it is parsed completely. */
1746 void finalize_compilation_unit (void);
1747
1748 /* C++ frontend produce same body aliases all over the place, even before PCH
1749 gets streamed out. It relies on us linking the aliases with their function
1750 in order to do the fixups, but ipa-ref is not PCH safe. Consequentely we
1751 first produce aliases without links, but once C++ FE is sure he won't sream
1752 PCH we build the links via this function. */
1753 void process_same_body_aliases (void);
1754
1755 /* Perform simple optimizations based on callgraph. */
1756 void compile (void);
1757
1758 /* Process CGRAPH_NEW_FUNCTIONS and perform actions necessary to add these
1759 functions into callgraph in a way so they look like ordinary reachable
1760 functions inserted into callgraph already at construction time. */
1761 void process_new_functions (void);
1762
1763 /* Once all functions from compilation unit are in memory, produce all clones
1764 and update all calls. We might also do this on demand if we don't want to
1765 bring all functions to memory prior compilation, but current WHOPR
1766 implementation does that and it is is bit easier to keep everything right
1767 in this order. */
1768 void materialize_all_clones (void);
1769
1770 /* Register a symbol NODE. */
1771 inline void register_symbol (symtab_node *node);
1772
1773 inline void
1774 clear_asm_symbols (void)
1775 {
1776 asmnodes = NULL;
1777 asm_last_node = NULL;
1778 }
1779
1780 /* Perform reachability analysis and reclaim all unreachable nodes. */
1781 bool remove_unreachable_nodes (bool before_inlining_p, FILE *file);
1782
1783 /* Optimization of function bodies might've rendered some variables as
1784 unnecessary so we want to avoid these from being compiled. Re-do
1785 reachability starting from variables that are either externally visible
1786 or was referred from the asm output routines. */
1787 void remove_unreferenced_decls (void);
1788
1789 /* Unregister a symbol NODE. */
1790 inline void unregister (symtab_node *node);
1791
1792 /* Allocate new callgraph node and insert it into basic data structures. */
1793 cgraph_node *create_empty (void);
1794
1795 /* Release a callgraph NODE with UID and put in to the list
1796 of free nodes. */
1797 void release_symbol (cgraph_node *node, int uid);
1798
1799 /* Output all variables enqueued to be assembled. */
1800 bool output_variables (void);
1801
3dafb85c
ML
1802 /* Weakrefs may be associated to external decls and thus not output
1803 at expansion time. Emit all necessary aliases. */
1804 void output_weakrefs (void);
1805
1806 /* Return first static symbol with definition. */
1807 inline symtab_node *first_symbol (void);
1808
1809 /* Return first assembler symbol. */
1810 inline asm_node *
1811 first_asm_symbol (void)
1812 {
1813 return asmnodes;
1814 }
1815
1816 /* Return first static symbol with definition. */
1817 inline symtab_node *first_defined_symbol (void);
1818
1819 /* Return first variable. */
1820 inline varpool_node *first_variable (void);
1821
1822 /* Return next variable after NODE. */
1823 inline varpool_node *next_variable (varpool_node *node);
1824
1825 /* Return first static variable with initializer. */
1826 inline varpool_node *first_static_initializer (void);
1827
1828 /* Return next static variable with initializer after NODE. */
1829 inline varpool_node *next_static_initializer (varpool_node *node);
1830
1831 /* Return first static variable with definition. */
1832 inline varpool_node *first_defined_variable (void);
1833
1834 /* Return next static variable with definition after NODE. */
1835 inline varpool_node *next_defined_variable (varpool_node *node);
1836
1837 /* Return first function with body defined. */
1838 inline cgraph_node *first_defined_function (void);
1839
1840 /* Return next function with body defined after NODE. */
1841 inline cgraph_node *next_defined_function (cgraph_node *node);
1842
1843 /* Return first function. */
1844 inline cgraph_node *first_function (void);
1845
1846 /* Return next function. */
1847 inline cgraph_node *next_function (cgraph_node *node);
1848
1849 /* Return first function with body defined. */
1850 cgraph_node *first_function_with_gimple_body (void);
1851
1852 /* Return next reachable static variable with initializer after NODE. */
1853 inline cgraph_node *next_function_with_gimple_body (cgraph_node *node);
1854
1855 /* Register HOOK to be called with DATA on each removed edge. */
1856 cgraph_edge_hook_list *add_edge_removal_hook (cgraph_edge_hook hook,
1857 void *data);
1858
1859 /* Remove ENTRY from the list of hooks called on removing edges. */
1860 void remove_edge_removal_hook (cgraph_edge_hook_list *entry);
1861
1862 /* Register HOOK to be called with DATA on each removed node. */
1863 cgraph_node_hook_list *add_cgraph_removal_hook (cgraph_node_hook hook,
1864 void *data);
1865
1866 /* Remove ENTRY from the list of hooks called on removing nodes. */
1867 void remove_cgraph_removal_hook (cgraph_node_hook_list *entry);
1868
1869 /* Register HOOK to be called with DATA on each removed node. */
1870 varpool_node_hook_list *add_varpool_removal_hook (varpool_node_hook hook,
1871 void *data);
1872
1873 /* Remove ENTRY from the list of hooks called on removing nodes. */
1874 void remove_varpool_removal_hook (varpool_node_hook_list *entry);
1875
1876 /* Register HOOK to be called with DATA on each inserted node. */
1877 cgraph_node_hook_list *add_cgraph_insertion_hook (cgraph_node_hook hook,
1878 void *data);
1879
1880 /* Remove ENTRY from the list of hooks called on inserted nodes. */
1881 void remove_cgraph_insertion_hook (cgraph_node_hook_list *entry);
1882
1883 /* Register HOOK to be called with DATA on each inserted node. */
1884 varpool_node_hook_list *add_varpool_insertion_hook (varpool_node_hook hook,
1885 void *data);
1886
1887 /* Remove ENTRY from the list of hooks called on inserted nodes. */
1888 void remove_varpool_insertion_hook (varpool_node_hook_list *entry);
1889
1890 /* Register HOOK to be called with DATA on each duplicated edge. */
1891 cgraph_2edge_hook_list *add_edge_duplication_hook (cgraph_2edge_hook hook,
1892 void *data);
1893 /* Remove ENTRY from the list of hooks called on duplicating edges. */
1894 void remove_edge_duplication_hook (cgraph_2edge_hook_list *entry);
1895
1896 /* Register HOOK to be called with DATA on each duplicated node. */
1897 cgraph_2node_hook_list *add_cgraph_duplication_hook (cgraph_2node_hook hook,
1898 void *data);
1899
1900 /* Remove ENTRY from the list of hooks called on duplicating nodes. */
1901 void remove_cgraph_duplication_hook (cgraph_2node_hook_list *entry);
1902
1903 /* Call all edge removal hooks. */
1904 void call_edge_removal_hooks (cgraph_edge *e);
1905
1906 /* Call all node insertion hooks. */
1907 void call_cgraph_insertion_hooks (cgraph_node *node);
1908
1909 /* Call all node removal hooks. */
1910 void call_cgraph_removal_hooks (cgraph_node *node);
1911
1912 /* Call all node duplication hooks. */
1913 void call_cgraph_duplication_hooks (cgraph_node *node, cgraph_node *node2);
1914
1915 /* Call all edge duplication hooks. */
1916 void call_edge_duplication_hooks (cgraph_edge *cs1, cgraph_edge *cs2);
1917
1918 /* Call all node removal hooks. */
1919 void call_varpool_removal_hooks (varpool_node *node);
1920
1921 /* Call all node insertion hooks. */
1922 void call_varpool_insertion_hooks (varpool_node *node);
1923
1924 /* Arrange node to be first in its entry of assembler_name_hash. */
1925 void symtab_prevail_in_asm_name_hash (symtab_node *node);
1926
1927 /* Initalize asm name hash unless. */
1928 void symtab_initialize_asm_name_hash (void);
1929
1930 /* Set the DECL_ASSEMBLER_NAME and update symtab hashtables. */
1931 void change_decl_assembler_name (tree decl, tree name);
e69529cd 1932
3dafb85c
ML
1933 int cgraph_count;
1934 int cgraph_max_uid;
1935
1936 int edges_count;
1937 int edges_max_uid;
1938
1939 symtab_node* GTY(()) nodes;
1940 asm_node* GTY(()) asmnodes;
1941 asm_node* GTY(()) asm_last_node;
1942 cgraph_node* GTY(()) free_nodes;
1943
1944 /* Head of a linked list of unused (freed) call graph edges.
1945 Do not GTY((delete)) this list so UIDs gets reliably recycled. */
1946 cgraph_edge * GTY(()) free_edges;
1947
1948 /* The order index of the next symtab node to be created. This is
1949 used so that we can sort the cgraph nodes in order by when we saw
1950 them, to support -fno-toplevel-reorder. */
1951 int order;
1952
1953 /* Set when whole unit has been analyzed so we can access global info. */
1954 bool global_info_ready;
1955 /* What state callgraph is in right now. */
1956 enum symtab_state state;
1957 /* Set when the cgraph is fully build and the basic flags are computed. */
1958 bool function_flags_ready;
1959
1960 bool cpp_implicit_aliases_done;
1961
1962 /* Hash table used to hold sectoons. */
1963 htab_t GTY((param_is (section_hash_entry))) section_hash;
1964
1965 /* Hash table used to convert assembler names into nodes. */
1966 htab_t GTY((param_is (symtab_node))) assembler_name_hash;
1967
1968 /* Hash table used to hold init priorities. */
b086d530 1969 hash_map<symtab_node *, symbol_priority_map> *init_priority_hash;
3dafb85c
ML
1970
1971 FILE* GTY ((skip)) dump_file;
1972
1973private:
1974 /* Allocate new callgraph node. */
1975 inline cgraph_node * allocate_cgraph_symbol (void);
1976
1977 /* Allocate a cgraph_edge structure and fill it with data according to the
1978 parameters of which only CALLEE can be NULL (when creating an indirect call
1979 edge). */
1980 cgraph_edge *create_edge (cgraph_node *caller, cgraph_node *callee,
1981 gimple call_stmt, gcov_type count, int freq,
1982 bool indir_unknown_callee);
1983
1984 /* Put the edge onto the free list. */
1985 void free_edge (cgraph_edge *e);
1986
1987 /* Insert NODE to assembler name hash. */
1988 void insert_to_assembler_name_hash (symtab_node *node, bool with_clones);
1989
1990 /* Remove NODE from assembler name hash. */
1991 void unlink_from_assembler_name_hash (symtab_node *node, bool with_clones);
1992
1993 /* Hash asmnames ignoring the user specified marks. */
1994 static hashval_t decl_assembler_name_hash (const_tree asmname);
1995
1996 /* Compare ASMNAME with the DECL_ASSEMBLER_NAME of DECL. */
1997 static bool decl_assembler_name_equal (tree decl, const_tree asmname);
1998
1999 /* Returns a hash code for P. */
2000 static hashval_t hash_node_by_assembler_name (const void *p);
2001
2002 /* Returns nonzero if P1 and P2 are equal. */
2003 static int eq_assembler_name (const void *p1, const void *p2);
2004
2005 /* List of hooks triggered when an edge is removed. */
2006 cgraph_edge_hook_list * GTY((skip)) m_first_edge_removal_hook;
2007 /* List of hooks triggem_red when a cgraph node is removed. */
2008 cgraph_node_hook_list * GTY((skip)) m_first_cgraph_removal_hook;
2009 /* List of hooks triggered when an edge is duplicated. */
2010 cgraph_2edge_hook_list * GTY((skip)) m_first_edge_duplicated_hook;
2011 /* List of hooks triggered when a node is duplicated. */
2012 cgraph_2node_hook_list * GTY((skip)) m_first_cgraph_duplicated_hook;
2013 /* List of hooks triggered when an function is inserted. */
2014 cgraph_node_hook_list * GTY((skip)) m_first_cgraph_insertion_hook;
2015 /* List of hooks triggered when an variable is inserted. */
2016 varpool_node_hook_list * GTY((skip)) m_first_varpool_insertion_hook;
2017 /* List of hooks triggered when a node is removed. */
2018 varpool_node_hook_list * GTY((skip)) m_first_varpool_removal_hook;
2019};
2020
2021extern GTY(()) symbol_table *symtab;
2022
2023extern vec<cgraph_node *> cgraph_new_nodes;
2aae7680 2024
1c4a429a 2025/* In cgraph.c */
12123452 2026void release_function_body (tree);
3dafb85c 2027cgraph_indirect_call_info *cgraph_allocate_init_indirect_info (void);
d52f5295 2028
4b685e14 2029void cgraph_update_edges_for_call_stmt (gimple, tree, gimple);
1bb17c21
JH
2030bool cgraph_function_possibly_inlined_p (tree);
2031
61a05df1 2032const char* cgraph_inline_failed_string (cgraph_inline_failed_t);
1cf11770 2033cgraph_inline_failed_type_t cgraph_inline_failed_type (cgraph_inline_failed_t);
6b02a499 2034
be330ed4 2035bool resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution);
4484a35a 2036extern bool gimple_check_call_matching_types (gimple, tree, bool);
9c8305f8
JH
2037
2038/* In cgraphunit.c */
3649b9b7
ST
2039/* Initialize datastructures so DECL is a function in lowered gimple form.
2040 IN_SSA is true if the gimple is in SSA. */
e70670cf 2041basic_block init_lowered_empty_function (tree, bool);
66a20fc2
JH
2042
2043/* In cgraphclones.c */
2044
66a20fc2 2045tree clone_function_name (tree decl, const char *);
d52f5295 2046
d52f5295 2047void tree_function_versioning (tree, tree, vec<ipa_replace_map *, va_gc> *,
9c8305f8 2048 bool, bitmap, bool, bitmap, basic_block);
9c8305f8 2049
917948d3 2050/* In cgraphbuild.c */
9187e02d 2051int compute_call_stmt_bb_frequency (tree, basic_block bb);
9c8305f8 2052void record_references_in_initializer (tree, bool);
917948d3 2053
ca31b95f 2054/* In ipa.c */
9c8305f8 2055void cgraph_build_static_cdtor (char which, tree body, int priority);
4a444e58 2056void ipa_discover_readonly_nonaddressable_vars (void);
ca31b95f 2057
8a4a83ed 2058/* In varpool.c */
6a6dac52 2059tree ctor_for_folding (tree);
68e56cc4 2060
d52f5295
ML
2061/* Return true when the symbol is real symbol, i.e. it is not inline clone
2062 or abstract function kept for debug info purposes only. */
2063inline bool
2064symtab_node::real_symbol_p (void)
2065{
2066 cgraph_node *cnode;
2067
00de328a 2068 if (DECL_ABSTRACT_P (decl))
d52f5295
ML
2069 return false;
2070 if (!is_a <cgraph_node *> (this))
2071 return true;
2072 cnode = dyn_cast <cgraph_node *> (this);
2073 if (cnode->global.inlined_to)
2074 return false;
2075 return true;
2076}
2077
89330618
JH
2078/* Return true if DECL should have entry in symbol table if used.
2079 Those are functions and static & external veriables*/
2080
0241e486 2081static inline bool
89330618
JH
2082decl_in_symtab_p (const_tree decl)
2083{
2084 return (TREE_CODE (decl) == FUNCTION_DECL
2085 || (TREE_CODE (decl) == VAR_DECL
2086 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))));
2087}
2088
d52f5295
ML
2089inline bool
2090symtab_node::in_same_comdat_group_p (symtab_node *target)
aede2c10 2091{
d52f5295 2092 symtab_node *source = this;
aede2c10 2093
d52f5295
ML
2094 if (cgraph_node *cn = dyn_cast <cgraph_node *> (target))
2095 {
2096 if (cn->global.inlined_to)
2097 source = cn->global.inlined_to;
2098 }
2099 if (cgraph_node *cn = dyn_cast <cgraph_node *> (target))
2100 {
2101 if (cn->global.inlined_to)
2102 target = cn->global.inlined_to;
2103 }
2104
2105 return source->get_comdat_group () == target->get_comdat_group ();
1f00098b
JH
2106}
2107
d52f5295
ML
2108/* Return node that alias is aliasing. */
2109
2110inline symtab_node *
2111symtab_node::get_alias_target (void)
1f00098b 2112{
3dafb85c 2113 ipa_ref *ref = NULL;
d52f5295
ML
2114 iterate_reference (0, ref);
2115 gcc_checking_assert (ref->use == IPA_REF_ALIAS);
2116 return ref->referred;
1f00098b
JH
2117}
2118
d52f5295
ML
2119/* Return next reachable static symbol with initializer after the node. */
2120inline symtab_node *
2121symtab_node::next_defined_symbol (void)
1ab24192 2122{
d52f5295
ML
2123 symtab_node *node1 = next;
2124
2125 for (; node1; node1 = node1->next)
2126 if (node1->definition)
2127 return node1;
2128
2129 return NULL;
1ab24192
JH
2130}
2131
2132/* Return varpool node for given symbol and check it is a function. */
3dafb85c 2133
9041d2e6
ML
2134inline varpool_node *
2135varpool_node::get (const_tree decl)
1ab24192
JH
2136{
2137 gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
d52f5295 2138 return dyn_cast<varpool_node *> (symtab_node::get (decl));
1ab24192
JH
2139}
2140
3dafb85c
ML
2141/* Register a symbol NODE. */
2142
2143inline void
2144symbol_table::register_symbol (symtab_node *node)
2145{
2146 node->next = nodes;
2147 node->previous = NULL;
2148
2149 if (nodes)
2150 nodes->previous = node;
2151 nodes = node;
2152
2153 node->order = order++;
2154}
2155
2156/* Register a top-level asm statement ASM_STR. */
2157
2158asm_node *
2159symbol_table::finalize_toplevel_asm (tree asm_str)
2160{
2161 asm_node *node;
2162
2163 node = ggc_cleared_alloc<asm_node> ();
2164 node->asm_str = asm_str;
2165 node->order = order++;
2166 node->next = NULL;
2167
2168 if (asmnodes == NULL)
2169 asmnodes = node;
2170 else
2171 asm_last_node->next = node;
2172
2173 asm_last_node = node;
2174 return node;
2175}
2176
2177/* Unregister a symbol NODE. */
2178inline void
2179symbol_table::unregister (symtab_node *node)
2180{
2181 if (node->previous)
2182 node->previous->next = node->next;
2183 else
2184 nodes = node->next;
2185
2186 if (node->next)
2187 node->next->previous = node->previous;
2188
2189 node->next = NULL;
2190 node->previous = NULL;
2191}
2192
2193/* Allocate new callgraph node and insert it into basic data structures. */
2194
2195inline cgraph_node *
2196symbol_table::create_empty (void)
2197{
2198 cgraph_node *node = allocate_cgraph_symbol ();
2199
2200 node->type = SYMTAB_FUNCTION;
2201 node->frequency = NODE_FREQUENCY_NORMAL;
2202 node->count_materialization_scale = REG_BR_PROB_BASE;
2203 cgraph_count++;
2204
2205 return node;
2206}
2207
2208/* Release a callgraph NODE with UID and put in to the list of free nodes. */
2209
2210inline void
2211symbol_table::release_symbol (cgraph_node *node, int uid)
2212{
2213 cgraph_count--;
2214
2215 /* Clear out the node to NULL all pointers and add the node to the free
2216 list. */
2217 memset (node, 0, sizeof (*node));
2218 node->type = SYMTAB_FUNCTION;
2219 node->uid = uid;
2220 SET_NEXT_FREE_NODE (node, free_nodes);
2221 free_nodes = node;
2222}
2223
2224/* Allocate new callgraph node. */
2225
2226inline cgraph_node *
2227symbol_table::allocate_cgraph_symbol (void)
2228{
2229 cgraph_node *node;
2230
2231 if (free_nodes)
2232 {
2233 node = free_nodes;
2234 free_nodes = NEXT_FREE_NODE (node);
2235 }
2236 else
2237 {
2238 node = ggc_cleared_alloc<cgraph_node> ();
2239 node->uid = cgraph_max_uid++;
2240 }
2241
2242 return node;
2243}
2244
2245
2246/* Return first static symbol with definition. */
2247inline symtab_node *
2248symbol_table::first_symbol (void)
2249{
2250 return nodes;
2251}
2252
1ab24192
JH
2253/* Walk all symbols. */
2254#define FOR_EACH_SYMBOL(node) \
3dafb85c 2255 for ((node) = symtab->first_symbol (); (node); (node) = (node)->next)
1f00098b 2256
d6d229c6 2257/* Return first static symbol with definition. */
3dafb85c
ML
2258inline symtab_node *
2259symbol_table::first_defined_symbol (void)
d6d229c6
JH
2260{
2261 symtab_node *node;
2262
3dafb85c 2263 for (node = nodes; node; node = node->next)
d6d229c6
JH
2264 if (node->definition)
2265 return node;
2266
2267 return NULL;
2268}
2269
d6d229c6
JH
2270/* Walk all symbols with definitions in current unit. */
2271#define FOR_EACH_DEFINED_SYMBOL(node) \
3dafb85c 2272 for ((node) = symtab->first_defined_symbol (); (node); \
d52f5295 2273 (node) = node->next_defined_symbol ())
66058468
JH
2274
2275/* Return first variable. */
3dafb85c
ML
2276inline varpool_node *
2277symbol_table::first_variable (void)
66058468 2278{
5e20cdc9 2279 symtab_node *node;
3dafb85c 2280 for (node = nodes; node; node = node->next)
7de90a6c 2281 if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
5d59b5e1 2282 return vnode;
66058468
JH
2283 return NULL;
2284}
2285
2286/* Return next variable after NODE. */
3dafb85c
ML
2287inline varpool_node *
2288symbol_table::next_variable (varpool_node *node)
66058468 2289{
5e20cdc9 2290 symtab_node *node1 = node->next;
67348ccc 2291 for (; node1; node1 = node1->next)
7de90a6c 2292 if (varpool_node *vnode1 = dyn_cast <varpool_node *> (node1))
5d59b5e1 2293 return vnode1;
66058468
JH
2294 return NULL;
2295}
2296/* Walk all variables. */
2297#define FOR_EACH_VARIABLE(node) \
3dafb85c 2298 for ((node) = symtab->first_variable (); \
66058468 2299 (node); \
3dafb85c 2300 (node) = symtab->next_variable ((node)))
66058468 2301
d6d229c6 2302/* Return first static variable with initializer. */
3dafb85c
ML
2303inline varpool_node *
2304symbol_table::first_static_initializer (void)
68e56cc4 2305{
5e20cdc9 2306 symtab_node *node;
3dafb85c 2307 for (node = nodes; node; node = node->next)
68e56cc4 2308 {
7de90a6c 2309 varpool_node *vnode = dyn_cast <varpool_node *> (node);
67348ccc 2310 if (vnode && DECL_INITIAL (node->decl))
5d59b5e1 2311 return vnode;
68e56cc4
JH
2312 }
2313 return NULL;
2314}
2315
d6d229c6 2316/* Return next static variable with initializer after NODE. */
3dafb85c
ML
2317inline varpool_node *
2318symbol_table::next_static_initializer (varpool_node *node)
68e56cc4 2319{
5e20cdc9 2320 symtab_node *node1 = node->next;
67348ccc 2321 for (; node1; node1 = node1->next)
68e56cc4 2322 {
7de90a6c 2323 varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
67348ccc 2324 if (vnode1 && DECL_INITIAL (node1->decl))
5d59b5e1 2325 return vnode1;
68e56cc4
JH
2326 }
2327 return NULL;
2328}
2329
2330/* Walk all static variables with initializer set. */
2331#define FOR_EACH_STATIC_INITIALIZER(node) \
3dafb85c
ML
2332 for ((node) = symtab->first_static_initializer (); (node); \
2333 (node) = symtab->next_static_initializer (node))
2aae7680 2334
d6d229c6 2335/* Return first static variable with definition. */
3dafb85c
ML
2336inline varpool_node *
2337symbol_table::first_defined_variable (void)
2aae7680 2338{
5e20cdc9 2339 symtab_node *node;
3dafb85c 2340 for (node = nodes; node; node = node->next)
2aae7680 2341 {
7de90a6c 2342 varpool_node *vnode = dyn_cast <varpool_node *> (node);
67348ccc 2343 if (vnode && vnode->definition)
5d59b5e1 2344 return vnode;
2aae7680
JH
2345 }
2346 return NULL;
2347}
2348
d6d229c6 2349/* Return next static variable with definition after NODE. */
3dafb85c
ML
2350inline varpool_node *
2351symbol_table::next_defined_variable (varpool_node *node)
2aae7680 2352{
5e20cdc9 2353 symtab_node *node1 = node->next;
67348ccc 2354 for (; node1; node1 = node1->next)
2aae7680 2355 {
7de90a6c 2356 varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
67348ccc 2357 if (vnode1 && vnode1->definition)
5d59b5e1 2358 return vnode1;
2aae7680
JH
2359 }
2360 return NULL;
2361}
65c70e6b
JH
2362/* Walk all variables with definitions in current unit. */
2363#define FOR_EACH_DEFINED_VARIABLE(node) \
3dafb85c
ML
2364 for ((node) = symtab->first_defined_variable (); (node); \
2365 (node) = symtab->next_defined_variable (node))
68e56cc4 2366
c47d0034 2367/* Return first function with body defined. */
3dafb85c
ML
2368inline cgraph_node *
2369symbol_table::first_defined_function (void)
c47d0034 2370{
5e20cdc9 2371 symtab_node *node;
3dafb85c 2372 for (node = nodes; node; node = node->next)
c47d0034 2373 {
7de90a6c 2374 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
67348ccc 2375 if (cn && cn->definition)
5d59b5e1 2376 return cn;
c47d0034
JH
2377 }
2378 return NULL;
2379}
2380
45896127 2381/* Return next function with body defined after NODE. */
3dafb85c
ML
2382inline cgraph_node *
2383symbol_table::next_defined_function (cgraph_node *node)
c47d0034 2384{
5e20cdc9 2385 symtab_node *node1 = node->next;
67348ccc 2386 for (; node1; node1 = node1->next)
c47d0034 2387 {
7de90a6c 2388 cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
67348ccc 2389 if (cn1 && cn1->definition)
5d59b5e1 2390 return cn1;
c47d0034
JH
2391 }
2392 return NULL;
2393}
2394
2395/* Walk all functions with body defined. */
2396#define FOR_EACH_DEFINED_FUNCTION(node) \
3dafb85c
ML
2397 for ((node) = symtab->first_defined_function (); (node); \
2398 (node) = symtab->next_defined_function ((node)))
2aae7680
JH
2399
2400/* Return first function. */
3dafb85c
ML
2401inline cgraph_node *
2402symbol_table::first_function (void)
2aae7680 2403{
5e20cdc9 2404 symtab_node *node;
3dafb85c 2405 for (node = nodes; node; node = node->next)
7de90a6c 2406 if (cgraph_node *cn = dyn_cast <cgraph_node *> (node))
5d59b5e1 2407 return cn;
2aae7680
JH
2408 return NULL;
2409}
2410
2411/* Return next function. */
3dafb85c
ML
2412inline cgraph_node *
2413symbol_table::next_function (cgraph_node *node)
2aae7680 2414{
5e20cdc9 2415 symtab_node *node1 = node->next;
67348ccc 2416 for (; node1; node1 = node1->next)
7de90a6c 2417 if (cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1))
5d59b5e1 2418 return cn1;
2aae7680
JH
2419 return NULL;
2420}
c47d0034
JH
2421
2422/* Return first function with body defined. */
3dafb85c
ML
2423inline cgraph_node *
2424symbol_table::first_function_with_gimple_body (void)
c47d0034 2425{
5e20cdc9 2426 symtab_node *node;
3dafb85c 2427 for (node = nodes; node; node = node->next)
c47d0034 2428 {
7de90a6c 2429 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
d52f5295 2430 if (cn && cn->has_gimple_body_p ())
5d59b5e1 2431 return cn;
c47d0034
JH
2432 }
2433 return NULL;
2434}
2435
2436/* Return next reachable static variable with initializer after NODE. */
3dafb85c
ML
2437inline cgraph_node *
2438symbol_table::next_function_with_gimple_body (cgraph_node *node)
c47d0034 2439{
5e20cdc9 2440 symtab_node *node1 = node->next;
67348ccc 2441 for (; node1; node1 = node1->next)
c47d0034 2442 {
7de90a6c 2443 cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
d52f5295 2444 if (cn1 && cn1->has_gimple_body_p ())
5d59b5e1 2445 return cn1;
c47d0034
JH
2446 }
2447 return NULL;
2448}
2449
3dafb85c
ML
2450/* Walk all functions. */
2451#define FOR_EACH_FUNCTION(node) \
2452 for ((node) = symtab->first_function (); (node); \
2453 (node) = symtab->next_function ((node)))
2454
2455/* Return true when callgraph node is a function with Gimple body defined
2456 in current unit. Functions can also be define externally or they
2457 can be thunks with no Gimple representation.
2458
2459 Note that at WPA stage, the function body may not be present in memory. */
2460
2461inline bool
2462cgraph_node::has_gimple_body_p (void)
2463{
2464 return definition && !thunk.thunk_p && !alias;
2465}
2466
c47d0034
JH
2467/* Walk all functions with body defined. */
2468#define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \
3dafb85c
ML
2469 for ((node) = symtab->first_function_with_gimple_body (); (node); \
2470 (node) = symtab->next_function_with_gimple_body (node))
c47d0034 2471
43d861a5
RL
2472/* Create a new static variable of type TYPE. */
2473tree add_new_static_var (tree type);
2474
d48e9cea
OR
2475/* Uniquize all constants that appear in memory.
2476 Each constant in memory thus far output is recorded
2477 in `const_desc_table'. */
2478
2479struct GTY(()) constant_descriptor_tree {
2480 /* A MEM for the constant. */
2481 rtx rtl;
b8698a0f 2482
d48e9cea
OR
2483 /* The value of the constant. */
2484 tree value;
2485
2486 /* Hash of value. Computing the hash from value each time
2487 hashfn is called can't work properly, as that means recursive
2488 use of the hash table during hash table expansion. */
2489 hashval_t hash;
2490};
2491
d52f5295 2492/* Return true when function is only called directly or it has alias.
b20996ff
JH
2493 i.e. it is not externally visible, address was not taken and
2494 it is not used in any other non-standard way. */
2495
d52f5295
ML
2496inline bool
2497cgraph_node::only_called_directly_or_aliased_p (void)
2498{
2499 gcc_assert (!global.inlined_to);
2500 return (!force_output && !address_taken
2501 && !used_from_other_partition
2502 && !DECL_VIRTUAL_P (decl)
2503 && !DECL_STATIC_CONSTRUCTOR (decl)
2504 && !DECL_STATIC_DESTRUCTOR (decl)
2505 && !externally_visible);
b20996ff
JH
2506}
2507
9041d2e6 2508/* Return true when variable can be removed from variable pool
df7705b1
JH
2509 if all direct calls are eliminated. */
2510
9041d2e6
ML
2511inline bool
2512varpool_node::can_remove_if_no_refs_p (void)
df7705b1 2513{
9041d2e6 2514 if (DECL_EXTERNAL (decl))
6649df51 2515 return true;
9041d2e6
ML
2516 return (!force_output && !used_from_other_partition
2517 && ((DECL_COMDAT (decl)
2518 && !forced_by_abi
2519 && !used_from_object_file_p ())
2520 || !externally_visible
2521 || DECL_HAS_VALUE_EXPR_P (decl)));
df7705b1
JH
2522}
2523
9041d2e6 2524/* Return true when all references to variable must be visible in ipa_ref_list.
4a444e58
JH
2525 i.e. if the variable is not externally visible or not used in some magic
2526 way (asm statement or such).
61502ca8 2527 The magic uses are all summarized in force_output flag. */
4a444e58 2528
9041d2e6
ML
2529inline bool
2530varpool_node::all_refs_explicit_p ()
4a444e58 2531{
9041d2e6
ML
2532 return (definition
2533 && !externally_visible
2534 && !used_from_other_partition
2535 && !force_output);
4a444e58
JH
2536}
2537
d48e9cea
OR
2538/* Constant pool accessor function. */
2539htab_t constant_pool_htab (void);
fed5ae11 2540
d52f5295 2541/* Return node that alias is aliasing. */
39e2db00 2542
d52f5295
ML
2543inline cgraph_node *
2544cgraph_node::get_alias_target (void)
cd35bcf7 2545{
d52f5295 2546 return dyn_cast <cgraph_node *> (symtab_node::get_alias_target ());
cd35bcf7
JH
2547}
2548
9041d2e6
ML
2549/* Return node that alias is aliasing. */
2550
2551inline varpool_node *
2552varpool_node::get_alias_target (void)
be330ed4 2553{
9041d2e6 2554 return dyn_cast <varpool_node *> (symtab_node::get_alias_target ());
be330ed4
JH
2555}
2556
d52f5295
ML
2557/* Given function symbol, walk the alias chain to return the function node
2558 is alias of. Do not walk through thunks.
073a8998 2559 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
be330ed4 2560
d52f5295
ML
2561inline cgraph_node *
2562cgraph_node::ultimate_alias_target (enum availability *availability)
be330ed4 2563{
d52f5295
ML
2564 cgraph_node *n = dyn_cast <cgraph_node *> (symtab_node::ultimate_alias_target
2565 (availability));
40a7fe1e 2566 if (!n && availability)
39e2db00 2567 *availability = AVAIL_NOT_AVAILABLE;
e70670cf 2568 return n;
be330ed4 2569}
9041d2e6
ML
2570
2571/* For given variable pool node, walk the alias chain to return the function
2572 the variable is alias of. Do not walk through thunks.
073a8998 2573 When AVAILABILITY is non-NULL, get minimal availability in the chain. */
cd35bcf7 2574
9041d2e6
ML
2575inline varpool_node *
2576varpool_node::ultimate_alias_target (availability *availability)
cd35bcf7 2577{
9041d2e6
ML
2578 varpool_node *n = dyn_cast <varpool_node *>
2579 (symtab_node::ultimate_alias_target (availability));
ff36fcbe 2580
40a7fe1e 2581 if (!n && availability)
cd35bcf7 2582 *availability = AVAIL_NOT_AVAILABLE;
e70670cf 2583 return n;
cd35bcf7
JH
2584}
2585
3dafb85c
ML
2586/* Return true when the edge represents a direct recursion. */
2587inline bool
2588cgraph_edge::recursive_p (void)
d7d1d041 2589{
3dafb85c
ML
2590 cgraph_node *c = callee->ultimate_alias_target ();
2591 if (caller->global.inlined_to)
2592 return caller->global.inlined_to->decl == c->decl;
d7d1d041 2593 else
3dafb85c 2594 return caller->decl == c->decl;
d7d1d041 2595}
0a35513e
AH
2596
2597/* Return true if the TM_CLONE bit is set for a given FNDECL. */
2598static inline bool
2599decl_is_tm_clone (const_tree fndecl)
2600{
d52f5295 2601 cgraph_node *n = cgraph_node::get (fndecl);
0a35513e
AH
2602 if (n)
2603 return n->tm_clone;
2604 return false;
2605}
9c8305f8
JH
2606
2607/* Likewise indicate that a node is needed, i.e. reachable via some
2608 external means. */
2609
d52f5295
ML
2610inline void
2611cgraph_node::mark_force_output (void)
1f26ac87 2612{
d52f5295
ML
2613 force_output = 1;
2614 gcc_checking_assert (!global.inlined_to);
1f26ac87
JM
2615}
2616
f7217cde
JH
2617inline symtab_node * symtab_node::get_create (tree node)
2618{
2619 if (TREE_CODE (node) == VAR_DECL)
2620 return varpool_node::get_create (node);
2621 else
2622 return cgraph_node::get_create (node);
2623}
2624
ba392339
JH
2625/* Build polymorphic call context for indirect call E. */
2626
2627inline
2628ipa_polymorphic_call_context::ipa_polymorphic_call_context (cgraph_edge *e)
2629{
2630 gcc_checking_assert (e->indirect_info->polymorphic);
2631 *this = e->indirect_info->context;
2632}
2633
2634/* Build empty "I know nothing" context. */
2635
2636inline
2637ipa_polymorphic_call_context::ipa_polymorphic_call_context ()
2638{
2639 clear_speculation ();
2640 clear_outer_type ();
2641 invalid = false;
2642}
2643
2644/* Make context non-speculative. */
2645
2646inline void
2647ipa_polymorphic_call_context::clear_speculation ()
2648{
2649 speculative_outer_type = NULL;
2650 speculative_offset = 0;
2651 speculative_maybe_derived_type = false;
2652}
2653
2654/* Produce context specifying all derrived types of OTR_TYPE.
2655 If OTR_TYPE is NULL or type of the OBJ_TYPE_REF, the context is set
2656 to dummy "I know nothing" setting. */
2657
2658inline void
2659ipa_polymorphic_call_context::clear_outer_type (tree otr_type)
2660{
2661 outer_type = otr_type ? TYPE_MAIN_VARIANT (otr_type) : NULL;
2662 offset = 0;
2663 maybe_derived_type = true;
2664 maybe_in_construction = true;
2665}
67a1b94c
JH
2666
2667/* Adjust all offsets in contexts by OFF bits. */
2668
2669inline void
2670ipa_polymorphic_call_context::offset_by (HOST_WIDE_INT off)
2671{
2672 if (outer_type)
2673 offset += off;
2674 if (speculative_outer_type)
2675 speculative_offset += off;
2676}
2677
2678/* Return TRUE if context is fully useless. */
2679
2680inline bool
2681ipa_polymorphic_call_context::useless_p () const
2682{
2683 return (!outer_type && !speculative_outer_type);
2684}
1c4a429a 2685#endif /* GCC_CGRAPH_H */