1 /* Basic IPA utilities for type inheritance graph construction and
3 Copyright (C) 2013 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 ODR = One Definition Rule
24 In short, the ODR states that:
25 1 In any translation unit, a template, type, function, or object can
26 have no more than one definition. Some of these can have any number
27 of declarations. A definition provides an instance.
28 2 In the entire program, an object or non-inline function cannot have
29 more than one definition; if an object or function is used, it must
30 have exactly one definition. You can declare an object or function
31 that is never used, in which case you don't have to provide
32 a definition. In no event can there be more than one definition.
33 3 Some things, like types, templates, and extern inline functions, can
34 be defined in more than one translation unit. For a given entity,
35 each definition must be the same. Non-extern objects and functions
36 in different translation units are different entities, even if their
37 names and types are the same.
40 This is the Gimple representation of type information of a polymorphic call.
41 It contains two parameters:
42 otr_type is a type of class whose method is called.
43 otr_token is the index into virtual table where address is taken.
46 This is the type inheritance information attached to each tree
47 RECORD_TYPE by the C++ frotend. It provides information about base
48 types and virtual tables.
50 BINFO is linked to the RECORD_TYPE by TYPE_BINFO.
51 BINFO also links to its type by BINFO_TYPE and to the virtual table by
54 Base types of a given type are enumerated by BINFO_BASE_BINFO
55 vector. Members of this vectors are not BINFOs associated
56 with a base type. Rather they are new copies of BINFOs
57 (base BINFOs). Their virtual tables may differ from
58 virtual table of the base type. Also BINFO_OFFSET specifies
59 offset of the base within the type.
61 In the case of single inheritance, the virtual table is shared
62 and BINFO_VTABLE of base BINFO is NULL. In the case of multiple
63 inheritance the individual virtual tables are pointer to by
64 BINFO_VTABLE of base binfos (that differs of BINFO_VTABLE of
65 binfo associated to the base type).
67 BINFO lookup for a given base type and offset can be done by
68 get_binfo_at_offset. It returns proper BINFO whose virtual table
69 can be used for lookup of virtual methods associated with the
73 This is an index of virtual method in virtual table associated
74 to the type defining it. Token can be looked up from OBJ_TYPE_REF
75 or from DECL_VINDEX of a given virtual table.
77 polymorphic (indirect) call
78 This is callgraph represention of virtual method call. Every
79 polymorphic call contains otr_type and otr_token taken from
80 original OBJ_TYPE_REF at callgraph construction time.
84 build_type_inheritance_graph triggers a construction of the type inheritance
87 We reconstruct it based on types of methods we see in the unit.
88 This means that the graph is not complete. Types with no methods are not
89 inserted into the graph. Also types without virtual methods are not
90 represented at all, though it may be easy to add this.
92 The inheritance graph is represented as follows:
94 Vertices are structures odr_type. Every odr_type may correspond
95 to one or more tree type nodes that are equivalent by ODR rule.
96 (the multiple type nodes appear only with linktime optimization)
98 Edges are represented by odr_type->base and odr_type->derived_types.
99 At the moment we do not track offsets of types for multiple inheritance.
102 possible_polymorphic_call_targets returns, given an parameters found in
103 indirect polymorphic edge all possible polymorphic call targets of the call.
105 pass_ipa_devirt performs simple speculative devirtualization.
110 #include "coretypes.h"
114 #include "tree-pass.h"
116 #include "pointer-set.h"
118 #include "hash-table.h"
119 #include "tree-pretty-print.h"
120 #include "ipa-utils.h"
122 #include "ipa-inline.h"
123 #include "diagnostic.h"
125 /* Pointer set of all call targets appearing in the cache. */
126 static pointer_set_t
*cached_polymorphic_call_targets
;
128 /* The node of type inheritance graph. For each type unique in
129 One Defintion Rule (ODR) sense, we produce one node linking all
130 main variants of types equivalent to it, bases and derived types. */
132 struct GTY(()) odr_type_d
137 vec
<odr_type
> GTY((skip
)) bases
;
138 /* All derrived types with virtual methods seen in unit. */
139 vec
<odr_type
> GTY((skip
)) derived_types
;
141 /* All equivalent types, if more than one. */
142 vec
<tree
, va_gc
> *types
;
143 /* Set of all equivalent types, if NON-NULL. */
144 pointer_set_t
* GTY((skip
)) types_set
;
146 /* Unique ID indexing the type in odr_types array. */
148 /* Is it in anonymous namespace? */
149 bool anonymous_namespace
;
153 /* Return true if BINFO corresponds to a type with virtual methods.
155 Every type has several BINFOs. One is the BINFO associated by the type
156 while other represents bases of derived types. The BINFOs representing
157 bases do not have BINFO_VTABLE pointer set when this is the single
158 inheritance (because vtables are shared). Look up the BINFO of type
159 and check presence of its vtable. */
162 polymorphic_type_binfo_p (tree binfo
)
164 /* See if BINFO's type has an virtual table associtated with it. */
165 return BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo
)));
168 /* One Definition Rule hashtable helpers. */
172 typedef odr_type_d value_type
;
173 typedef union tree_node compare_type
;
174 static inline hashval_t
hash (const value_type
*);
175 static inline bool equal (const value_type
*, const compare_type
*);
176 static inline void remove (value_type
*);
179 /* Produce hash based on type name. */
182 hash_type_name (tree t
)
184 gcc_checking_assert (TYPE_MAIN_VARIANT (t
) == t
);
186 /* If not in LTO, all main variants are unique, so we can do
189 return htab_hash_pointer (t
);
191 /* Anonymous types are unique. */
192 if (type_in_anonymous_namespace_p (t
))
193 return htab_hash_pointer (t
);
195 /* For polymorphic types, we can simply hash the virtual table. */
196 if (TYPE_BINFO (t
) && BINFO_VTABLE (TYPE_BINFO (t
)))
198 tree v
= BINFO_VTABLE (TYPE_BINFO (t
));
201 if (TREE_CODE (v
) == POINTER_PLUS_EXPR
)
203 hash
= TREE_INT_CST_LOW (TREE_OPERAND (v
, 1));
204 v
= TREE_OPERAND (TREE_OPERAND (v
, 0), 0);
207 v
= DECL_ASSEMBLER_NAME (v
);
208 hash
= iterative_hash_hashval_t (hash
, htab_hash_pointer (v
));
212 /* Rest is not implemented yet. */
216 /* Return the computed hashcode for ODR_TYPE. */
219 odr_hasher::hash (const value_type
*odr_type
)
221 return hash_type_name (odr_type
->type
);
224 /* Compare types T1 and T2 and return true if they are
228 odr_hasher::equal (const value_type
*t1
, const compare_type
*ct2
)
230 tree t2
= const_cast <tree
> (ct2
);
232 gcc_checking_assert (TYPE_MAIN_VARIANT (ct2
) == ct2
);
237 return types_same_for_odr (t1
->type
, t2
);
240 /* Free ODR type V. */
243 odr_hasher::remove (value_type
*v
)
246 v
->derived_types
.release ();
248 pointer_set_destroy (v
->types_set
);
252 /* ODR type hash used to lookup ODR type based on tree type node. */
254 typedef hash_table
<odr_hasher
> odr_hash_type
;
255 static odr_hash_type odr_hash
;
257 /* ODR types are also stored into ODR_TYPE vector to allow consistent
258 walking. Bases appear before derived types. Vector is garbage collected
259 so we won't end up visiting empty types. */
261 static GTY(()) vec
<odr_type
, va_gc
> *odr_types_ptr
;
262 #define odr_types (*odr_types_ptr)
264 /* TYPE is equivalent to VAL by ODR, but its tree representation differs
265 from VAL->type. This may happen in LTO where tree merging did not merge
266 all variants of the same type. It may or may not mean the ODR violation.
267 Add it to the list of duplicates and warn on some violations. */
270 add_type_duplicate (odr_type val
, tree type
)
273 val
->types_set
= pointer_set_create ();
275 /* See if this duplicate is new. */
276 if (!pointer_set_insert (val
->types_set
, type
))
279 bool base_mismatch
= false;
280 gcc_assert (in_lto_p
);
281 vec_safe_push (val
->types
, type
);
284 /* First we compare memory layout. */
285 if (!types_compatible_p (val
->type
, type
))
288 if (BINFO_VTABLE (TYPE_BINFO (val
->type
))
289 && warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (type
)), 0,
290 "type %qD violates one definition rule ",
292 inform (DECL_SOURCE_LOCATION (TYPE_NAME (val
->type
)),
293 "a type with the same name but different layout is "
294 "defined in another translation unit");
295 debug_tree (BINFO_VTABLE (TYPE_BINFO (type
)));
296 debug_tree (BINFO_VTABLE (TYPE_BINFO (val
->type
)));
297 if (cgraph_dump_file
)
299 fprintf (cgraph_dump_file
, "ODR violation or merging or ODR type bug?\n");
301 print_node (cgraph_dump_file
, "", val
->type
, 0);
302 putc ('\n',cgraph_dump_file
);
303 print_node (cgraph_dump_file
, "", type
, 0);
304 putc ('\n',cgraph_dump_file
);
308 /* Next sanity check that bases are the same. If not, we will end
309 up producing wrong answers. */
310 for (j
= 0, i
= 0; i
< BINFO_N_BASE_BINFOS (TYPE_BINFO (type
)); i
++)
311 if (polymorphic_type_binfo_p (BINFO_BASE_BINFO (TYPE_BINFO (type
), i
)))
313 odr_type base
= get_odr_type
315 (BINFO_BASE_BINFO (TYPE_BINFO (type
),
318 if (val
->bases
.length () <= j
|| val
->bases
[j
] != base
)
319 base_mismatch
= true;
326 if (warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (type
)), 0,
327 "type %qD violates one definition rule ",
329 inform (DECL_SOURCE_LOCATION (TYPE_NAME (val
->type
)),
330 "a type with the same name but different bases is "
331 "defined in another translation unit");
332 if (cgraph_dump_file
)
334 fprintf (cgraph_dump_file
, "ODR bse violation or merging bug?\n");
336 print_node (cgraph_dump_file
, "", val
->type
, 0);
337 putc ('\n',cgraph_dump_file
);
338 print_node (cgraph_dump_file
, "", type
, 0);
339 putc ('\n',cgraph_dump_file
);
343 /* Regularize things a little. During LTO same types may come with
344 different BINFOs. Either because their virtual table was
345 not merged by tree merging and only later at decl merging or
346 because one type comes with external vtable, while other
347 with internal. We want to merge equivalent binfos to conserve
348 memory and streaming overhead.
350 The external vtables are more harmful: they contain references
351 to external declarations of methods that may be defined in the
352 merged LTO unit. For this reason we absolutely need to remove
353 them and replace by internal variants. Not doing so will lead
354 to incomplete answers from possible_polymorphic_call_targets. */
355 if (!flag_ltrans
&& merge
)
357 tree master_binfo
= TYPE_BINFO (val
->type
);
358 tree v1
= BINFO_VTABLE (master_binfo
);
359 tree v2
= BINFO_VTABLE (TYPE_BINFO (type
));
361 if (TREE_CODE (v1
) == POINTER_PLUS_EXPR
)
363 gcc_assert (TREE_CODE (v2
) == POINTER_PLUS_EXPR
364 && operand_equal_p (TREE_OPERAND (v1
, 1),
365 TREE_OPERAND (v2
, 1), 0));
366 v1
= TREE_OPERAND (TREE_OPERAND (v1
, 0), 0);
367 v2
= TREE_OPERAND (TREE_OPERAND (v2
, 0), 0);
369 gcc_assert (DECL_ASSEMBLER_NAME (v1
)
370 == DECL_ASSEMBLER_NAME (v2
));
372 if (DECL_EXTERNAL (v1
) && !DECL_EXTERNAL (v2
))
376 TYPE_BINFO (val
->type
) = TYPE_BINFO (type
);
377 for (i
= 0; i
< val
->types
->length (); i
++)
379 if (TYPE_BINFO ((*val
->types
)[i
])
381 TYPE_BINFO ((*val
->types
)[i
]) = TYPE_BINFO (type
);
385 TYPE_BINFO (type
) = master_binfo
;
390 /* Get ODR type hash entry for TYPE. If INSERT is true, create
391 possibly new entry. */
394 get_odr_type (tree type
, bool insert
)
400 type
= TYPE_MAIN_VARIANT (type
);
401 gcc_checking_assert (TYPE_MAIN_VARIANT (type
) == type
);
402 hash
= hash_type_name (type
);
403 slot
= odr_hash
.find_slot_with_hash (type
, hash
, insert
? INSERT
: NO_INSERT
);
407 /* See if we already have entry for type. */
412 /* With LTO we need to support multiple tree representation of
413 the same ODR type. */
414 if (val
->type
!= type
)
415 add_type_duplicate (val
, type
);
419 tree binfo
= TYPE_BINFO (type
);
422 val
= ggc_alloc_cleared_odr_type_d ();
425 val
->derived_types
= vNULL
;
426 val
->anonymous_namespace
= type_in_anonymous_namespace_p (type
);
428 for (i
= 0; i
< BINFO_N_BASE_BINFOS (binfo
); i
++)
429 /* For now record only polymorphic types. other are
430 pointless for devirtualization and we can not precisely
431 determine ODR equivalency of these during LTO. */
432 if (polymorphic_type_binfo_p (BINFO_BASE_BINFO (binfo
, i
)))
434 odr_type base
= get_odr_type (BINFO_TYPE (BINFO_BASE_BINFO (binfo
,
437 base
->derived_types
.safe_push (val
);
438 val
->bases
.safe_push (base
);
440 /* First record bases, then add into array so ids are increasing. */
442 val
->id
= odr_types
.length ();
443 vec_safe_push (odr_types_ptr
, val
);
448 /* Dump ODR type T and all its derrived type. INDENT specify indentation for
449 recusive printing. */
452 dump_odr_type (FILE *f
, odr_type t
, int indent
=0)
455 fprintf (f
, "%*s type %i: ", indent
* 2, "", t
->id
);
456 print_generic_expr (f
, t
->type
, TDF_SLIM
);
457 fprintf (f
, "%s\n", t
->anonymous_namespace
? " (anonymous namespace)":"");
458 if (TYPE_NAME (t
->type
))
460 fprintf (f
, "%*s defined at: %s:%i\n", indent
* 2, "",
461 DECL_SOURCE_FILE (TYPE_NAME (t
->type
)),
462 DECL_SOURCE_LINE (TYPE_NAME (t
->type
)));
464 if (t
->bases
.length ())
466 fprintf (f
, "%*s base odr type ids: ", indent
* 2, "");
467 for (i
= 0; i
< t
->bases
.length (); i
++)
468 fprintf (f
, " %i", t
->bases
[i
]->id
);
471 if (t
->derived_types
.length ())
473 fprintf (f
, "%*s derived types:\n", indent
* 2, "");
474 for (i
= 0; i
< t
->derived_types
.length (); i
++)
475 dump_odr_type (f
, t
->derived_types
[i
], indent
+ 1);
480 /* Dump the type inheritance graph. */
483 dump_type_inheritance_graph (FILE *f
)
488 fprintf (f
, "\n\nType inheritance graph:\n");
489 for (i
= 0; i
< odr_types
.length (); i
++)
491 if (odr_types
[i
]->bases
.length () == 0)
492 dump_odr_type (f
, odr_types
[i
]);
494 for (i
= 0; i
< odr_types
.length (); i
++)
496 if (odr_types
[i
]->types
&& odr_types
[i
]->types
->length ())
499 fprintf (f
, "Duplicate tree types for odr type %i\n", i
);
500 print_node (f
, "", odr_types
[i
]->type
, 0);
501 for (j
= 0; j
< odr_types
[i
]->types
->length (); j
++)
504 fprintf (f
, "duplicate #%i\n", j
);
505 print_node (f
, "", (*odr_types
[i
]->types
)[j
], 0);
506 t
= (*odr_types
[i
]->types
)[j
];
507 while (TYPE_P (t
) && TYPE_CONTEXT (t
))
509 t
= TYPE_CONTEXT (t
);
510 print_node (f
, "", t
, 0);
518 /* Given method type T, return type of class it belongs to.
519 Lookup this pointer and get its type. */
522 method_class_type (tree t
)
524 tree first_parm_type
= TREE_VALUE (TYPE_ARG_TYPES (t
));
526 return TREE_TYPE (first_parm_type
);
529 /* Initialize IPA devirt and build inheritance tree graph. */
532 build_type_inheritance_graph (void)
534 struct cgraph_node
*n
;
535 FILE *inheritance_dump_file
;
538 if (odr_hash
.is_created ())
540 timevar_push (TV_IPA_INHERITANCE
);
541 inheritance_dump_file
= dump_begin (TDI_inheritance
, &flags
);
542 odr_hash
.create (23);
544 /* We reconstruct the graph starting of types of all methods seen in the
546 FOR_EACH_FUNCTION (n
)
547 if (DECL_VIRTUAL_P (n
->decl
)
548 && symtab_real_symbol_p (n
))
549 get_odr_type (method_class_type (TREE_TYPE (n
->decl
)), true);
550 if (inheritance_dump_file
)
552 dump_type_inheritance_graph (inheritance_dump_file
);
553 dump_end (TDI_inheritance
, inheritance_dump_file
);
555 timevar_pop (TV_IPA_INHERITANCE
);
558 /* If TARGET has associated node, record it in the NODES array. */
561 maybe_record_node (vec
<cgraph_node
*> &nodes
,
562 tree target
, pointer_set_t
*inserted
)
564 struct cgraph_node
*target_node
;
565 enum built_in_function fcode
;
568 /* Those are used to mark impossible scenarios. */
569 && (fcode
= DECL_FUNCTION_CODE (target
))
570 != BUILT_IN_UNREACHABLE
571 && fcode
!= BUILT_IN_TRAP
572 && !pointer_set_insert (inserted
, target
)
573 && (target_node
= cgraph_get_node (target
)) != NULL
574 && (TREE_PUBLIC (target
)
575 || target_node
->definition
)
576 && symtab_real_symbol_p (target_node
))
578 pointer_set_insert (cached_polymorphic_call_targets
,
580 nodes
.safe_push (target_node
);
584 /* See if BINFO's type match OTR_TYPE. If so, lookup method
585 in vtable of TYPE_BINFO and insert method to NODES array.
586 Otherwise recurse to base BINFOs.
587 This match what get_binfo_at_offset does, but with offset
590 TYPE_BINFO is binfo holding an virtual table matching
591 BINFO's type. In the case of single inheritance, this
592 is binfo of BINFO's type ancestor (vtable is shared),
593 otherwise it is binfo of BINFO's type.
595 MATCHED_VTABLES tracks virtual tables we already did lookup
596 for virtual function in.
598 ANONYMOUS is true if BINFO is part of anonymous namespace.
602 record_binfo (vec
<cgraph_node
*> &nodes
,
606 HOST_WIDE_INT otr_token
,
607 pointer_set_t
*inserted
,
608 pointer_set_t
*matched_vtables
,
611 tree type
= BINFO_TYPE (binfo
);
615 gcc_checking_assert (BINFO_VTABLE (type_binfo
));
617 if (types_same_for_odr (type
, otr_type
)
618 && !pointer_set_insert (matched_vtables
, BINFO_VTABLE (type_binfo
)))
620 /* For types in anonymous namespace first check if the respective vtable
621 is alive. If not, we know the type can't be called. */
622 if (!flag_ltrans
&& anonymous
)
624 tree vtable
= BINFO_VTABLE (type_binfo
);
625 struct varpool_node
*vnode
;
627 if (TREE_CODE (vtable
) == POINTER_PLUS_EXPR
)
628 vtable
= TREE_OPERAND (TREE_OPERAND (vtable
, 0), 0);
629 vnode
= varpool_get_node (vtable
);
630 if (!vnode
|| !vnode
->definition
)
633 tree target
= gimple_get_virt_method_for_binfo (otr_token
, type_binfo
);
635 maybe_record_node (nodes
, target
, inserted
);
640 for (i
= 0; BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
641 /* Walking bases that have no virtual method is pointless excercise. */
642 if (polymorphic_type_binfo_p (base_binfo
))
643 record_binfo (nodes
, base_binfo
, otr_type
,
644 /* In the case of single inheritance, the virtual table
645 is shared with the outer type. */
646 BINFO_VTABLE (base_binfo
) ? base_binfo
: type_binfo
,
648 matched_vtables
, anonymous
);
651 /* Lookup virtual methods matching OTR_TYPE (with OFFSET and OTR_TOKEN)
652 of TYPE, insert them to NODES, recurse into derived nodes.
653 INSERTED is used to avoid duplicate insertions of methods into NODES.
654 MATCHED_VTABLES are used to avoid duplicate walking vtables. */
657 possible_polymorphic_call_targets_1 (vec
<cgraph_node
*> &nodes
,
658 pointer_set_t
*inserted
,
659 pointer_set_t
*matched_vtables
,
662 HOST_WIDE_INT otr_token
)
664 tree binfo
= TYPE_BINFO (type
->type
);
667 record_binfo (nodes
, binfo
, otr_type
, binfo
, otr_token
, inserted
,
668 matched_vtables
, type
->anonymous_namespace
);
669 for (i
= 0; i
< type
->derived_types
.length (); i
++)
670 possible_polymorphic_call_targets_1 (nodes
, inserted
,
673 type
->derived_types
[i
],
677 /* Cache of queries for polymorphic call targets.
679 Enumerating all call targets may get expensive when there are many
680 polymorphic calls in the program, so we memoize all the previous
681 queries and avoid duplicated work. */
683 struct polymorphic_call_target_d
686 HOST_WIDE_INT otr_token
;
687 vec
<cgraph_node
*> targets
;
690 /* Polymorphic call target cache helpers. */
692 struct polymorphic_call_target_hasher
694 typedef polymorphic_call_target_d value_type
;
695 typedef polymorphic_call_target_d compare_type
;
696 static inline hashval_t
hash (const value_type
*);
697 static inline bool equal (const value_type
*, const compare_type
*);
698 static inline void remove (value_type
*);
701 /* Return the computed hashcode for ODR_QUERY. */
704 polymorphic_call_target_hasher::hash (const value_type
*odr_query
)
706 return iterative_hash_hashval_t (odr_query
->type
->id
,
707 odr_query
->otr_token
);
710 /* Compare cache entries T1 and T2. */
713 polymorphic_call_target_hasher::equal (const value_type
*t1
,
714 const compare_type
*t2
)
716 return t1
->type
== t2
->type
&& t1
->otr_token
== t2
->otr_token
;
719 /* Remove entry in polymorphic call target cache hash. */
722 polymorphic_call_target_hasher::remove (value_type
*v
)
724 v
->targets
.release ();
728 /* Polymorphic call target query cache. */
730 typedef hash_table
<polymorphic_call_target_hasher
>
731 polymorphic_call_target_hash_type
;
732 static polymorphic_call_target_hash_type polymorphic_call_target_hash
;
734 /* Destroy polymorphic call target query cache. */
737 free_polymorphic_call_targets_hash ()
739 if (cached_polymorphic_call_targets
)
741 polymorphic_call_target_hash
.dispose ();
742 pointer_set_destroy (cached_polymorphic_call_targets
);
743 cached_polymorphic_call_targets
= NULL
;
747 /* When virtual function is removed, we may need to flush the cache. */
750 devirt_node_removal_hook (struct cgraph_node
*n
, void *d ATTRIBUTE_UNUSED
)
752 if (cached_polymorphic_call_targets
753 && pointer_set_contains (cached_polymorphic_call_targets
, n
))
754 free_polymorphic_call_targets_hash ();
757 /* When virtual table is removed, we may need to flush the cache. */
760 devirt_variable_node_removal_hook (struct varpool_node
*n
,
761 void *d ATTRIBUTE_UNUSED
)
763 if (cached_polymorphic_call_targets
764 && DECL_VIRTUAL_P (n
->decl
)
765 && type_in_anonymous_namespace_p (DECL_CONTEXT (n
->decl
)))
766 free_polymorphic_call_targets_hash ();
769 /* Return vector containing possible targets of polymorphic call of type
770 OTR_TYPE caling method OTR_TOKEN with OFFSET. If FINALp is non-NULL,
771 store true if the list is complette.
772 CACHE_TOKEN (if non-NULL) will get stored to an unique ID of entry
773 in the target cache. If user needs to visit every target list
774 just once, it can memoize them.
776 Returned vector is placed into cache. It is NOT caller's responsibility
777 to free it. The vector can be freed on cgraph_remove_node call if
778 the particular node is a virtual function present in the cache. */
781 possible_polymorphic_call_targets (tree otr_type
,
782 HOST_WIDE_INT otr_token
,
786 static struct cgraph_node_hook_list
*node_removal_hook_holder
;
787 pointer_set_t
*inserted
;
788 pointer_set_t
*matched_vtables
;
789 vec
<cgraph_node
*> nodes
=vNULL
;
791 polymorphic_call_target_d key
;
792 polymorphic_call_target_d
**slot
;
799 type
= get_odr_type (otr_type
, false);
800 /* If we do not have type in our hash it means we never seen any method
805 /* For anonymous namespace types we can attempt to build full type.
806 All derivations must be in this unit. */
807 if (type
->anonymous_namespace
&& finalp
&& !flag_ltrans
)
810 /* Initialize query cache. */
811 if (!cached_polymorphic_call_targets
)
813 cached_polymorphic_call_targets
= pointer_set_create ();
814 polymorphic_call_target_hash
.create (23);
815 if (!node_removal_hook_holder
)
817 node_removal_hook_holder
=
818 cgraph_add_node_removal_hook (&devirt_node_removal_hook
, NULL
);
819 varpool_add_node_removal_hook (&devirt_variable_node_removal_hook
,
824 /* Lookup cached answer. */
826 key
.otr_token
= otr_token
;
827 slot
= polymorphic_call_target_hash
.find_slot (&key
, INSERT
);
829 *cache_token
= (void *)*slot
;
831 return (*slot
)->targets
;
833 /* Do actual search. */
834 timevar_push (TV_IPA_VIRTUAL_CALL
);
835 *slot
= XCNEW (polymorphic_call_target_d
);
837 *cache_token
= (void *)*slot
;
838 (*slot
)->type
= type
;
839 (*slot
)->otr_token
= otr_token
;
841 inserted
= pointer_set_create ();
842 matched_vtables
= pointer_set_create ();
844 /* First see virtual method of type itself. */
846 binfo
= TYPE_BINFO (type
->type
);
847 target
= gimple_get_virt_method_for_binfo (otr_token
, binfo
);
849 maybe_record_node (nodes
, target
, inserted
);
850 pointer_set_insert (matched_vtables
, BINFO_VTABLE (binfo
));
852 /* TODO: If method is final, we can stop here and signaize that
853 list is final. We need C++ FE to pass our info about final
854 methods and classes. */
856 /* Walk recursively all derived types. Here we need to lookup proper basetype
857 via their BINFO walk that is done by record_binfo */
858 for (i
= 0; i
< type
->derived_types
.length (); i
++)
859 possible_polymorphic_call_targets_1 (nodes
, inserted
,
861 otr_type
, type
->derived_types
[i
],
863 (*slot
)->targets
= nodes
;
865 pointer_set_destroy (inserted
);
866 pointer_set_destroy (matched_vtables
);
867 timevar_pop (TV_IPA_VIRTUAL_CALL
);
871 /* Dump all possible targets of a polymorphic call. */
874 dump_possible_polymorphic_call_targets (FILE *f
,
876 HOST_WIDE_INT otr_token
)
878 vec
<cgraph_node
*> targets
;
880 odr_type type
= get_odr_type (otr_type
, false);
885 targets
= possible_polymorphic_call_targets (otr_type
, otr_token
,
887 fprintf (f
, "Targets of polymorphic call of type %i ", type
->id
);
888 print_generic_expr (f
, type
->type
, TDF_SLIM
);
889 fprintf (f
, " token %i%s:",
891 final
? " (full list)" : " (partial list, may call to other unit)");
892 for (i
= 0; i
< targets
.length (); i
++)
893 fprintf (f
, " %s/%i", cgraph_node_name (targets
[i
]),
899 /* Return true if N can be possibly target of a polymorphic call of
900 OTR_TYPE/OTR_TOKEN. */
903 possible_polymorphic_call_target_p (tree otr_type
,
904 HOST_WIDE_INT otr_token
,
905 struct cgraph_node
*n
)
907 vec
<cgraph_node
*> targets
;
911 if (!odr_hash
.is_created ())
913 targets
= possible_polymorphic_call_targets (otr_type
, otr_token
, &final
);
914 for (i
= 0; i
< targets
.length (); i
++)
918 /* At a moment we allow middle end to dig out new external declarations
919 as a targets of polymorphic calls. */
920 if (!final
&& !n
->definition
)
926 /* After callgraph construction new external nodes may appear.
927 Add them into the graph. */
930 update_type_inheritance_graph (void)
932 struct cgraph_node
*n
;
934 if (!odr_hash
.is_created ())
936 free_polymorphic_call_targets_hash ();
937 timevar_push (TV_IPA_INHERITANCE
);
938 /* We reconstruct the graph starting of types of all methods seen in the
940 FOR_EACH_FUNCTION (n
)
941 if (DECL_VIRTUAL_P (n
->decl
)
943 && symtab_real_symbol_p (n
))
944 get_odr_type (method_class_type (TREE_TYPE (n
->decl
)), true);
945 timevar_pop (TV_IPA_INHERITANCE
);
949 /* Return true if N looks like likely target of a polymorphic call.
950 Rule out cxa_pure_virtual, noreturns, function declared cold and
951 other obvious cases. */
954 likely_target_p (struct cgraph_node
*n
)
957 /* cxa_pure_virtual and similar things are not likely. */
958 if (TREE_CODE (TREE_TYPE (n
->decl
)) != METHOD_TYPE
)
960 flags
= flags_from_decl_or_type (n
->decl
);
961 if (flags
& ECF_NORETURN
)
963 if (lookup_attribute ("cold",
964 DECL_ATTRIBUTES (n
->decl
)))
966 if (n
->frequency
< NODE_FREQUENCY_NORMAL
)
971 /* The ipa-devirt pass.
972 When polymorphic call has only one likely target in the unit,
973 turn it into speculative call. */
978 struct cgraph_node
*n
;
979 struct pointer_set_t
*bad_call_targets
= pointer_set_create ();
980 struct cgraph_edge
*e
;
982 int npolymorphic
= 0, nspeculated
= 0, nconverted
= 0, ncold
= 0;
983 int nmultiple
= 0, noverwritable
= 0, ndevirtualized
= 0, nnotdefined
= 0;
984 int nwrong
= 0, nok
= 0, nexternal
= 0;;
986 FOR_EACH_DEFINED_FUNCTION (n
)
989 if (dump_file
&& n
->indirect_calls
)
990 fprintf (dump_file
, "\n\nProcesing function %s/%i\n",
991 cgraph_node_name (n
), n
->order
);
992 for (e
= n
->indirect_calls
; e
; e
= e
->next_callee
)
993 if (e
->indirect_info
->polymorphic
)
995 struct cgraph_node
*likely_target
= NULL
;
998 vec
<cgraph_node
*>targets
999 = possible_polymorphic_call_targets
1000 (e
, &final
, &cache_token
);
1004 dump_possible_polymorphic_call_targets
1009 if (!cgraph_maybe_hot_edge_p (e
))
1012 fprintf (dump_file
, "Call is cold\n");
1019 fprintf (dump_file
, "Call is aready speculated\n");
1022 /* When dumping see if we agree with speculation. */
1026 if (pointer_set_contains (bad_call_targets
,
1030 fprintf (dump_file
, "Target list is known to be useless\n");
1034 for (i
= 0; i
< targets
.length (); i
++)
1035 if (likely_target_p (targets
[i
]))
1039 likely_target
= NULL
;
1041 fprintf (dump_file
, "More than one likely target\n");
1045 likely_target
= targets
[i
];
1049 pointer_set_insert (bad_call_targets
, cache_token
);
1052 /* This is reached only when dumping; check if we agree or disagree
1053 with the speculation. */
1056 struct cgraph_edge
*e2
;
1057 struct ipa_ref
*ref
;
1058 cgraph_speculative_call_info (e
, e2
, e
, ref
);
1059 if (cgraph_function_or_thunk_node (e2
->callee
, NULL
)
1060 == cgraph_function_or_thunk_node (likely_target
, NULL
))
1062 fprintf (dump_file
, "We agree with speculation\n");
1067 fprintf (dump_file
, "We disagree with speculation\n");
1072 if (!likely_target
->definition
)
1075 fprintf (dump_file
, "Target is not an definition\n");
1079 /* Do not introduce new references to external symbols. While we
1080 can handle these just well, it is common for programs to
1081 incorrectly with headers defining methods they are linked
1083 if (DECL_EXTERNAL (likely_target
->decl
))
1086 fprintf (dump_file
, "Target is external\n");
1090 if (cgraph_function_body_availability (likely_target
)
1091 <= AVAIL_OVERWRITABLE
1092 && symtab_can_be_discarded (likely_target
))
1095 fprintf (dump_file
, "Target is overwritable\n");
1103 "Speculatively devirtualizing call in %s/%i to %s/%i\n",
1104 cgraph_node_name (n
), n
->order
,
1105 cgraph_node_name (likely_target
),
1106 likely_target
->order
);
1107 if (!symtab_can_be_discarded (likely_target
))
1110 alias
= cgraph (symtab_nonoverwritable_alias
1113 likely_target
= alias
;
1117 cgraph_turn_edge_to_speculative
1118 (e
, likely_target
, e
->count
* 8 / 10, e
->frequency
* 8 / 10);
1122 inline_update_overall_summary (n
);
1124 pointer_set_destroy (bad_call_targets
);
1128 "%i polymorphic calls, %i devirtualized,"
1129 " %i speculatively devirtualized, %i cold\n"
1130 "%i have multiple targets, %i overwritable,"
1131 " %i already speculated (%i agree, %i disagree),"
1132 " %i external, %i not defined\n",
1133 npolymorphic
, ndevirtualized
, nconverted
, ncold
,
1134 nmultiple
, noverwritable
, nspeculated
, nok
, nwrong
,
1135 nexternal
, nnotdefined
);
1136 return ndevirtualized
? TODO_remove_functions
: 0;
1139 /* Gate for IPCP optimization. */
1142 gate_ipa_devirt (void)
1144 return flag_devirtualize_speculatively
&& optimize
;
1149 const pass_data pass_data_ipa_devirt
=
1151 IPA_PASS
, /* type */
1152 "devirt", /* name */
1153 OPTGROUP_NONE
, /* optinfo_flags */
1154 true, /* has_gate */
1155 true, /* has_execute */
1156 TV_IPA_DEVIRT
, /* tv_id */
1157 0, /* properties_required */
1158 0, /* properties_provided */
1159 0, /* properties_destroyed */
1160 0, /* todo_flags_start */
1161 ( TODO_dump_symtab
), /* todo_flags_finish */
1164 class pass_ipa_devirt
: public ipa_opt_pass_d
1167 pass_ipa_devirt (gcc::context
*ctxt
)
1168 : ipa_opt_pass_d (pass_data_ipa_devirt
, ctxt
,
1169 NULL
, /* generate_summary */
1170 NULL
, /* write_summary */
1171 NULL
, /* read_summary */
1172 NULL
, /* write_optimization_summary */
1173 NULL
, /* read_optimization_summary */
1174 NULL
, /* stmt_fixup */
1175 0, /* function_transform_todo_flags_start */
1176 NULL
, /* function_transform */
1177 NULL
) /* variable_transform */
1180 /* opt_pass methods: */
1181 bool gate () { return gate_ipa_devirt (); }
1182 unsigned int execute () { return ipa_devirt (); }
1184 }; // class pass_ipa_devirt
1189 make_pass_ipa_devirt (gcc::context
*ctxt
)
1191 return new pass_ipa_devirt (ctxt
);
1194 #include "gt-ipa-devirt.h"