]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ipa.c
re PR tree-optimization/60577 (inefficient FDO instrumentation code)
[thirdparty/gcc.git] / gcc / ipa.c
CommitLineData
ca31b95f 1/* Basic IPA optimizations and utilities.
23a5b65a 2 Copyright (C) 2003-2014 Free Software Foundation, Inc.
ca31b95f
JH
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
ca31b95f
JH
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
ca31b95f
JH
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
23#include "tm.h"
4d648807 24#include "tree.h"
d8a2d370
DN
25#include "calls.h"
26#include "stringpool.h"
ca31b95f 27#include "cgraph.h"
f4b3ca72 28#include "tree-pass.h"
2fb9a547
AM
29#include "pointer-set.h"
30#include "gimple-expr.h"
45b0be94 31#include "gimplify.h"
4a444e58 32#include "flags.h"
9e97ff61
JH
33#include "target.h"
34#include "tree-iterator.h"
af8bca3c 35#include "ipa-utils.h"
04142cc3 36#include "ipa-inline.h"
0208f7da
JH
37#include "tree-inline.h"
38#include "profile.h"
39#include "params.h"
ca31b95f 40
e70670cf
JH
41/* Return true when NODE can not be local. Worker for cgraph_local_node_p. */
42
43static bool
44cgraph_non_local_node_p_1 (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
45{
46 /* FIXME: Aliases can be local, but i386 gets thunks wrong then. */
47 return !(cgraph_only_called_directly_or_aliased_p (node)
67348ccc
DM
48 && !ipa_ref_has_aliases_p (&node->ref_list)
49 && node->definition
50 && !DECL_EXTERNAL (node->decl)
51 && !node->externally_visible
52 && !node->used_from_other_partition
53 && !node->in_other_partition);
e70670cf
JH
54}
55
56/* Return true when function can be marked local. */
57
58static bool
59cgraph_local_node_p (struct cgraph_node *node)
60{
61 struct cgraph_node *n = cgraph_function_or_thunk_node (node, NULL);
62
63 /* FIXME: thunks can be considered local, but we need prevent i386
64 from attempting to change calling convention of them. */
65 if (n->thunk.thunk_p)
66 return false;
67 return !cgraph_for_node_and_aliases (n,
68 cgraph_non_local_node_p_1, NULL, true);
69
70}
71
72/* Return true when NODE has ADDR reference. */
73
74static bool
75has_addr_references_p (struct cgraph_node *node,
76 void *data ATTRIBUTE_UNUSED)
77{
78 int i;
79 struct ipa_ref *ref;
80
67348ccc 81 for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
e70670cf
JH
82 i, ref); i++)
83 if (ref->use == IPA_REF_ADDR)
84 return true;
85 return false;
86}
87
d563610d
JH
88/* Look for all functions inlined to NODE and update their inlined_to pointers
89 to INLINED_TO. */
90
91static void
92update_inlined_to_pointer (struct cgraph_node *node, struct cgraph_node *inlined_to)
93{
94 struct cgraph_edge *e;
95 for (e = node->callees; e; e = e->next_callee)
96 if (e->callee->global.inlined_to)
97 {
98 e->callee->global.inlined_to = inlined_to;
99 update_inlined_to_pointer (e->callee, inlined_to);
100 }
101}
102
04142cc3 103/* Add symtab NODE to queue starting at FIRST.
19fb0b86
JH
104
105 The queue is linked via AUX pointers and terminated by pointer to 1.
106 We enqueue nodes at two occasions: when we find them reachable or when we find
107 their bodies needed for further clonning. In the second case we mark them
108 by pointer to 2 after processing so they are re-queue when they become
109 reachable. */
b34fd25c
JH
110
111static void
5e20cdc9 112enqueue_node (symtab_node *node, symtab_node **first,
04142cc3 113 struct pointer_set_t *reachable)
b34fd25c 114{
19fb0b86 115 /* Node is still in queue; do nothing. */
67348ccc 116 if (node->aux && node->aux != (void *) 2)
19fb0b86
JH
117 return;
118 /* Node was already processed as unreachable, re-enqueue
119 only if it became reachable now. */
67348ccc 120 if (node->aux == (void *)2 && !pointer_set_contains (reachable, node))
19fb0b86 121 return;
67348ccc 122 node->aux = *first;
b34fd25c
JH
123 *first = node;
124}
125
b34fd25c
JH
126/* Process references. */
127
128static void
129process_references (struct ipa_ref_list *list,
5e20cdc9 130 symtab_node **first,
93a18a70
JH
131 bool before_inlining_p,
132 struct pointer_set_t *reachable)
b34fd25c
JH
133{
134 int i;
135 struct ipa_ref *ref;
136 for (i = 0; ipa_ref_list_reference_iterate (list, i, ref); i++)
137 {
5e20cdc9 138 symtab_node *node = ref->referred;
e70670cf 139
67348ccc
DM
140 if (node->definition && !node->in_other_partition
141 && ((!DECL_EXTERNAL (node->decl) || node->alias)
e70670cf
JH
142 || (before_inlining_p
143 /* We use variable constructors during late complation for
144 constant folding. Keep references alive so partitioning
145 knows about potential references. */
67348ccc 146 || (TREE_CODE (node->decl) == VAR_DECL
6a6dac52 147 && flag_wpa
67348ccc 148 && ctor_for_folding (node->decl)
6a6dac52 149 != error_mark_node))))
e70670cf 150 pointer_set_insert (reachable, node);
67348ccc 151 enqueue_node (node, first, reachable);
b34fd25c
JH
152 }
153}
154
3462aa02
JH
155/* EDGE is an polymorphic call. If BEFORE_INLINING_P is set, mark
156 all its potential targets as reachable to permit later inlining if
157 devirtualization happens. After inlining still keep their declarations
158 around, so we can devirtualize to a direct call.
159
160 Also try to make trivial devirutalization when no or only one target is
161 possible. */
162
163static void
164walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
165 struct cgraph_edge *edge,
5e20cdc9 166 symtab_node **first,
3462aa02
JH
167 pointer_set_t *reachable, bool before_inlining_p)
168{
169 unsigned int i;
170 void *cache_token;
171 bool final;
172 vec <cgraph_node *>targets
173 = possible_polymorphic_call_targets
174 (edge, &final, &cache_token);
175
176 if (!pointer_set_insert (reachable_call_targets,
177 cache_token))
178 {
c3284718 179 for (i = 0; i < targets.length (); i++)
3462aa02
JH
180 {
181 struct cgraph_node *n = targets[i];
182
183 /* Do not bother to mark virtual methods in anonymous namespace;
184 either we will find use of virtual table defining it, or it is
185 unused. */
67348ccc 186 if (TREE_CODE (TREE_TYPE (n->decl)) == METHOD_TYPE
3462aa02 187 && type_in_anonymous_namespace_p
67348ccc 188 (method_class_type (TREE_TYPE (n->decl))))
3462aa02
JH
189 continue;
190
191 /* Prior inlining, keep alive bodies of possible targets for
192 devirtualization. */
67348ccc 193 if (n->definition
3462aa02
JH
194 && before_inlining_p)
195 pointer_set_insert (reachable, n);
196
197 /* Even after inlining we want to keep the possible targets in the
198 boundary, so late passes can still produce direct call even if
199 the chance for inlining is lost. */
67348ccc 200 enqueue_node (n, first, reachable);
3462aa02
JH
201 }
202 }
203
204 /* Very trivial devirtualization; when the type is
205 final or anonymous (so we know all its derivation)
206 and there is only one possible virtual call target,
207 make the edge direct. */
208 if (final)
209 {
c3284718 210 if (targets.length () <= 1)
3462aa02 211 {
7b395ddd 212 cgraph_node *target, *node = edge->caller;
3462aa02
JH
213 if (targets.length () == 1)
214 target = targets[0];
215 else
216 target = cgraph_get_create_node
217 (builtin_decl_implicit (BUILT_IN_UNREACHABLE));
218
219 if (dump_file)
220 fprintf (dump_file,
221 "Devirtualizing call in %s/%i to %s/%i\n",
fec39fa6 222 edge->caller->name (),
67348ccc 223 edge->caller->order,
fec39fa6 224 target->name (), target->order);
3462aa02 225 edge = cgraph_make_edge_direct (edge, target);
477145c8 226 if (inline_summary_vec)
7b395ddd 227 inline_update_overall_summary (node);
477145c8
RB
228 else if (edge->call_stmt)
229 cgraph_redirect_edge_call_stmt_to_callee (edge);
3462aa02
JH
230 }
231 }
232}
41817394 233
ca31b95f 234/* Perform reachability analysis and reclaim all unreachable nodes.
04142cc3
JH
235
236 The algorithm is basically mark&sweep but with some extra refinements:
237
238 - reachable extern inline functions needs special handling; the bodies needs
239 to stay in memory until inlining in hope that they will be inlined.
240 After inlining we release their bodies and turn them into unanalyzed
241 nodes even when they are reachable.
242
243 BEFORE_INLINING_P specify whether we are before or after inlining.
244
245 - virtual functions are kept in callgraph even if they seem unreachable in
246 hope calls to them will be devirtualized.
247
248 Again we remove them after inlining. In late optimization some
31519c38 249 devirtualization may happen, but it is not important since we won't inline
04142cc3
JH
250 the call. In theory early opts and IPA should work out all important cases.
251
252 - virtual clones needs bodies of their origins for later materialization;
253 this means that we want to keep the body even if the origin is unreachable
254 otherwise. To avoid origin from sitting in the callgraph and being
255 walked by IPA passes, we turn them into unanalyzed nodes with body
256 defined.
257
258 We maintain set of function declaration where body needs to stay in
259 body_needed_for_clonning
260
261 Inline clones represent special case: their declaration match the
262 declaration of origin and cgraph_remove_node already knows how to
263 reshape callgraph and preserve body when offline copy of function or
264 inline clone is being removed.
265
6649df51
JH
266 - C++ virtual tables keyed to other unit are represented as DECL_EXTERNAL
267 variables with DECL_INITIAL set. We finalize these and keep reachable
268 ones around for constant folding purposes. After inlining we however
269 stop walking their references to let everything static referneced by them
270 to be removed when it is otherwise unreachable.
271
04142cc3
JH
272 We maintain queue of both reachable symbols (i.e. defined symbols that needs
273 to stay) and symbols that are in boundary (i.e. external symbols referenced
274 by reachable symbols or origins of clones). The queue is represented
275 as linked list by AUX pointer terminated by 1.
276
31519c38 277 At the end we keep all reachable symbols. For symbols in boundary we always
04142cc3
JH
278 turn definition into a declaration, but we may keep function body around
279 based on body_needed_for_clonning
280
281 All symbols that enter the queue have AUX pointer non-zero and are in the
282 boundary. Pointer set REACHABLE is used to track reachable symbols.
283
284 Every symbol can be visited twice - once as part of boundary and once
285 as real reachable symbol. enqueue_node needs to decide whether the
286 node needs to be re-queued for second processing. For this purpose
287 we set AUX pointer of processed symbols in the boundary to constant 2. */
ca31b95f
JH
288
289bool
04142cc3 290symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
ca31b95f 291{
5e20cdc9 292 symtab_node *first = (symtab_node *) (void *) 1;
96fc428c 293 struct cgraph_node *node, *next;
2c8326a5 294 varpool_node *vnode, *vnext;
ca31b95f 295 bool changed = false;
93a18a70 296 struct pointer_set_t *reachable = pointer_set_create ();
04142cc3 297 struct pointer_set_t *body_needed_for_clonning = pointer_set_create ();
3462aa02 298 struct pointer_set_t *reachable_call_targets = pointer_set_create ();
ca31b95f 299
3462aa02 300 timevar_push (TV_IPA_UNREACHABLE);
ca31b95f 301#ifdef ENABLE_CHECKING
474ffc72 302 verify_symtab ();
ca31b95f 303#endif
61a74079
JH
304 if (optimize && flag_devirtualize)
305 build_type_inheritance_graph ();
10d22567
ZD
306 if (file)
307 fprintf (file, "\nReclaiming functions:");
ca31b95f 308#ifdef ENABLE_CHECKING
65c70e6b 309 FOR_EACH_FUNCTION (node)
67348ccc 310 gcc_assert (!node->aux);
65c70e6b 311 FOR_EACH_VARIABLE (vnode)
67348ccc 312 gcc_assert (!vnode->aux);
ca31b95f 313#endif
530f3a1b
JH
314 /* Mark functions whose bodies are obviously needed.
315 This is mostly when they can be referenced externally. Inline clones
316 are special since their declarations are shared with master clone and thus
317 cgraph_can_remove_if_no_direct_calls_and_refs_p should not be called on them. */
c0c123ef
JH
318 FOR_EACH_FUNCTION (node)
319 {
320 node->used_as_abstract_origin = false;
67348ccc 321 if (node->definition
c0c123ef 322 && !node->global.inlined_to
67348ccc 323 && !node->in_other_partition
3462aa02 324 && !cgraph_can_remove_if_no_direct_calls_and_refs_p (node))
c0c123ef
JH
325 {
326 gcc_assert (!node->global.inlined_to);
327 pointer_set_insert (reachable, node);
67348ccc 328 enqueue_node (node, &first, reachable);
c0c123ef
JH
329 }
330 else
67348ccc 331 gcc_assert (!node->aux);
c0c123ef 332 }
530f3a1b
JH
333
334 /* Mark variables that are obviously needed. */
04142cc3 335 FOR_EACH_DEFINED_VARIABLE (vnode)
4f63dfc6 336 if (!varpool_can_remove_if_no_refs (vnode)
67348ccc 337 && !vnode->in_other_partition)
04142cc3
JH
338 {
339 pointer_set_insert (reachable, vnode);
67348ccc 340 enqueue_node (vnode, &first, reachable);
04142cc3
JH
341 }
342
343 /* Perform reachability analysis. */
5e20cdc9 344 while (first != (symtab_node *) (void *) 1)
b34fd25c 345 {
04142cc3 346 bool in_boundary_p = !pointer_set_contains (reachable, first);
5e20cdc9 347 symtab_node *node = first;
ca31b95f 348
5e20cdc9 349 first = (symtab_node *)first->aux;
19fb0b86 350
04142cc3
JH
351 /* If we are processing symbol in boundary, mark its AUX pointer for
352 possible later re-processing in enqueue_node. */
353 if (in_boundary_p)
67348ccc 354 node->aux = (void *)2;
04142cc3
JH
355 else
356 {
31dad809
JJ
357 if (TREE_CODE (node->decl) == FUNCTION_DECL
358 && DECL_ABSTRACT_ORIGIN (node->decl))
c0c123ef
JH
359 {
360 struct cgraph_node *origin_node
6f99e449 361 = cgraph_get_create_node (DECL_ABSTRACT_ORIGIN (node->decl));
c0c123ef 362 origin_node->used_as_abstract_origin = true;
67348ccc 363 enqueue_node (origin_node, &first, reachable);
c0c123ef 364 }
04142cc3 365 /* If any symbol in a comdat group is reachable, force
1f26ac87
JM
366 all externally visible symbols in the same comdat
367 group to be reachable as well. Comdat-local symbols
368 can be discarded if all uses were inlined. */
67348ccc 369 if (node->same_comdat_group)
04142cc3 370 {
5e20cdc9 371 symtab_node *next;
67348ccc 372 for (next = node->same_comdat_group;
04142cc3 373 next != node;
67348ccc 374 next = next->same_comdat_group)
1f26ac87
JM
375 if (!symtab_comdat_local_p (next)
376 && !pointer_set_insert (reachable, next))
67348ccc 377 enqueue_node (next, &first, reachable);
04142cc3
JH
378 }
379 /* Mark references as reachable. */
67348ccc 380 process_references (&node->ref_list, &first,
04142cc3
JH
381 before_inlining_p, reachable);
382 }
19fb0b86 383
5d59b5e1 384 if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
b34fd25c 385 {
04142cc3
JH
386 /* Mark the callees reachable unless they are direct calls to extern
387 inline functions we decided to not inline. */
388 if (!in_boundary_p)
8a6295ba 389 {
04142cc3 390 struct cgraph_edge *e;
3462aa02
JH
391 /* Keep alive possible targets for devirtualization. */
392 if (optimize && flag_devirtualize)
393 {
394 struct cgraph_edge *next;
395 for (e = cnode->indirect_calls; e; e = next)
396 {
397 next = e->next_callee;
398 if (e->indirect_info->polymorphic)
399 walk_polymorphic_call_targets (reachable_call_targets,
400 e, &first, reachable,
401 before_inlining_p);
402 }
403 }
04142cc3 404 for (e = cnode->callees; e; e = e->next_callee)
ed62e0d9 405 {
67348ccc
DM
406 if (e->callee->definition
407 && !e->callee->in_other_partition
ed62e0d9 408 && (!e->inline_failed
67348ccc
DM
409 || !DECL_EXTERNAL (e->callee->decl)
410 || e->callee->alias
ed62e0d9 411 || before_inlining_p))
93a18a70 412 pointer_set_insert (reachable, e->callee);
67348ccc 413 enqueue_node (e->callee, &first, reachable);
93a18a70 414 }
04142cc3
JH
415
416 /* When inline clone exists, mark body to be preserved so when removing
417 offline copy of the function we don't kill it. */
4f63dfc6 418 if (cnode->global.inlined_to)
67348ccc 419 pointer_set_insert (body_needed_for_clonning, cnode->decl);
b66887e4 420
4f63dfc6
JH
421 /* For non-inline clones, force their origins to the boundary and ensure
422 that body is not removed. */
423 while (cnode->clone_of)
424 {
67348ccc 425 bool noninline = cnode->clone_of->decl != cnode->decl;
4f63dfc6
JH
426 cnode = cnode->clone_of;
427 if (noninline)
428 {
67348ccc
DM
429 pointer_set_insert (body_needed_for_clonning, cnode->decl);
430 enqueue_node (cnode, &first, reachable);
4f63dfc6 431 }
b34fd25c 432 }
0136f8f0
AH
433
434 }
435 /* If any reachable function has simd clones, mark them as
436 reachable as well. */
437 if (cnode->simd_clones)
438 {
439 cgraph_node *next;
440 for (next = cnode->simd_clones;
441 next;
442 next = next->simdclone->next_clone)
443 if (in_boundary_p
444 || !pointer_set_insert (reachable, next))
445 enqueue_node (next, &first, reachable);
47cb0d7d 446 }
b34fd25c 447 }
6649df51 448 /* When we see constructor of external variable, keep referred nodes in the
5d59b5e1
LC
449 boundary. This will also hold initializers of the external vars NODE
450 refers to. */
451 varpool_node *vnode = dyn_cast <varpool_node> (node);
452 if (vnode
67348ccc
DM
453 && DECL_EXTERNAL (node->decl)
454 && !vnode->alias
6649df51 455 && in_boundary_p)
5d59b5e1 456 {
6649df51 457 struct ipa_ref *ref;
67348ccc 458 for (int i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
6649df51 459 enqueue_node (ref->referred, &first, reachable);
5d59b5e1 460 }
ca31b95f
JH
461 }
462
04142cc3 463 /* Remove unreachable functions. */
2aae7680 464 for (node = cgraph_first_function (); node; node = next)
ca31b95f 465 {
2aae7680 466 next = cgraph_next_function (node);
e70670cf
JH
467
468 /* If node is not needed at all, remove it. */
67348ccc 469 if (!node->aux)
ca31b95f 470 {
10d22567 471 if (file)
fec39fa6 472 fprintf (file, " %s", node->name ());
04142cc3
JH
473 cgraph_remove_node (node);
474 changed = true;
475 }
e70670cf 476 /* If node is unreachable, remove its body. */
04142cc3
JH
477 else if (!pointer_set_contains (reachable, node))
478 {
67348ccc 479 if (!pointer_set_contains (body_needed_for_clonning, node->decl))
e70670cf 480 cgraph_release_function_body (node);
4f63dfc6 481 else if (!node->clone_of)
67348ccc
DM
482 gcc_assert (in_lto_p || DECL_RESULT (node->decl));
483 if (node->definition)
bb853349 484 {
04142cc3 485 if (file)
fec39fa6 486 fprintf (file, " %s", node->name ());
67348ccc
DM
487 node->analyzed = false;
488 node->definition = false;
489 node->cpp_implicit_alias = false;
490 node->alias = false;
491 node->weakref = false;
492 if (!node->in_other_partition)
51a5c0c2
JH
493 node->local.local = false;
494 cgraph_node_remove_callees (node);
67348ccc 495 ipa_remove_all_references (&node->ref_list);
bb853349
JH
496 changed = true;
497 }
ca31b95f 498 }
4f63dfc6
JH
499 else
500 gcc_assert (node->clone_of || !cgraph_function_with_gimple_body_p (node)
67348ccc 501 || in_lto_p || DECL_RESULT (node->decl));
ca31b95f 502 }
04142cc3
JH
503
504 /* Inline clones might be kept around so their materializing allows further
505 cloning. If the function the clone is inlined into is removed, we need
506 to turn it into normal cone. */
65c70e6b 507 FOR_EACH_FUNCTION (node)
9187e02d 508 {
9187e02d
JH
509 if (node->global.inlined_to
510 && !node->callers)
511 {
512 gcc_assert (node->clones);
d563610d
JH
513 node->global.inlined_to = NULL;
514 update_inlined_to_pointer (node, node);
9187e02d 515 }
67348ccc 516 node->aux = NULL;
9187e02d 517 }
4a444e58 518
04142cc3 519 /* Remove unreachable variables. */
4a444e58 520 if (file)
04142cc3 521 fprintf (file, "\nReclaiming variables:");
2aae7680 522 for (vnode = varpool_first_variable (); vnode; vnode = vnext)
b34fd25c 523 {
2aae7680 524 vnext = varpool_next_variable (vnode);
67348ccc 525 if (!vnode->aux
b9bd2075
JH
526 /* For can_refer_decl_in_current_unit_p we want to track for
527 all external variables if they are defined in other partition
528 or not. */
67348ccc 529 && (!flag_ltrans || !DECL_EXTERNAL (vnode->decl)))
04142cc3 530 {
4a444e58 531 if (file)
fec39fa6 532 fprintf (file, " %s", vnode->name ());
4a444e58
JH
533 varpool_remove_node (vnode);
534 changed = true;
b34fd25c 535 }
04142cc3
JH
536 else if (!pointer_set_contains (reachable, vnode))
537 {
6a6dac52 538 tree init;
67348ccc 539 if (vnode->definition)
04142cc3
JH
540 {
541 if (file)
fec39fa6 542 fprintf (file, " %s", vnode->name ());
04142cc3
JH
543 changed = true;
544 }
67348ccc
DM
545 vnode->definition = false;
546 vnode->analyzed = false;
547 vnode->aux = NULL;
e70670cf
JH
548
549 /* Keep body if it may be useful for constant folding. */
67348ccc 550 if ((init = ctor_for_folding (vnode->decl)) == error_mark_node)
e70670cf 551 varpool_remove_initializer (vnode);
6a6dac52 552 else
67348ccc
DM
553 DECL_INITIAL (vnode->decl) = init;
554 ipa_remove_all_references (&vnode->ref_list);
04142cc3
JH
555 }
556 else
67348ccc 557 vnode->aux = NULL;
b34fd25c 558 }
4a444e58 559
04142cc3
JH
560 pointer_set_destroy (reachable);
561 pointer_set_destroy (body_needed_for_clonning);
3462aa02 562 pointer_set_destroy (reachable_call_targets);
4a444e58 563
04142cc3 564 /* Now update address_taken flags and try to promote functions to be local. */
bd3cdcc0
JH
565 if (file)
566 fprintf (file, "\nClearing address taken flags:");
65c70e6b 567 FOR_EACH_DEFINED_FUNCTION (node)
67348ccc
DM
568 if (node->address_taken
569 && !node->used_from_other_partition)
bd3cdcc0 570 {
41817394 571 if (!cgraph_for_node_and_aliases (node, has_addr_references_p, NULL, true))
bd3cdcc0
JH
572 {
573 if (file)
fec39fa6 574 fprintf (file, " %s", node->name ());
67348ccc 575 node->address_taken = false;
4a444e58
JH
576 changed = true;
577 if (cgraph_local_node_p (node))
578 {
579 node->local.local = true;
580 if (file)
581 fprintf (file, " (local)");
582 }
bd3cdcc0
JH
583 }
584 }
10a5dd5d
JH
585 if (file)
586 fprintf (file, "\n");
b34fd25c 587
873aa8f5 588#ifdef ENABLE_CHECKING
474ffc72 589 verify_symtab ();
873aa8f5 590#endif
4537ec0c 591
a8da72b8 592 /* If we removed something, perhaps profile could be improved. */
9771b263 593 if (changed && optimize && inline_edge_summary_vec.exists ())
a8da72b8 594 FOR_EACH_DEFINED_FUNCTION (node)
08f835dc 595 ipa_propagate_frequency (node);
a8da72b8 596
3462aa02 597 timevar_pop (TV_IPA_UNREACHABLE);
ca31b95f
JH
598 return changed;
599}
f4b3ca72 600
4a444e58
JH
601/* Discover variables that have no longer address taken or that are read only
602 and update their flags.
603
604 FIXME: This can not be done in between gimplify and omp_expand since
605 readonly flag plays role on what is shared and what is not. Currently we do
f10ea640
JH
606 this transformation as part of whole program visibility and re-do at
607 ipa-reference pass (to take into account clonning), but it would
608 make sense to do it before early optimizations. */
4a444e58
JH
609
610void
611ipa_discover_readonly_nonaddressable_vars (void)
612{
2c8326a5 613 varpool_node *vnode;
4a444e58
JH
614 if (dump_file)
615 fprintf (dump_file, "Clearing variable flags:");
65c70e6b 616 FOR_EACH_VARIABLE (vnode)
67348ccc
DM
617 if (vnode->definition && varpool_all_refs_explicit_p (vnode)
618 && (TREE_ADDRESSABLE (vnode->decl)
619 || !TREE_READONLY (vnode->decl)))
4a444e58
JH
620 {
621 bool written = false;
622 bool address_taken = false;
623 int i;
624 struct ipa_ref *ref;
67348ccc 625 for (i = 0; ipa_ref_list_referring_iterate (&vnode->ref_list,
960bfb69 626 i, ref)
4a444e58
JH
627 && (!written || !address_taken); i++)
628 switch (ref->use)
629 {
630 case IPA_REF_ADDR:
631 address_taken = true;
632 break;
633 case IPA_REF_LOAD:
634 break;
635 case IPA_REF_STORE:
636 written = true;
637 break;
638 }
67348ccc 639 if (TREE_ADDRESSABLE (vnode->decl) && !address_taken)
4a444e58
JH
640 {
641 if (dump_file)
fec39fa6 642 fprintf (dump_file, " %s (addressable)", vnode->name ());
67348ccc 643 TREE_ADDRESSABLE (vnode->decl) = 0;
4a444e58 644 }
67348ccc 645 if (!TREE_READONLY (vnode->decl) && !address_taken && !written
4a444e58
JH
646 /* Making variable in explicit section readonly can cause section
647 type conflict.
648 See e.g. gcc.c-torture/compile/pr23237.c */
67348ccc 649 && DECL_SECTION_NAME (vnode->decl) == NULL)
4a444e58
JH
650 {
651 if (dump_file)
fec39fa6 652 fprintf (dump_file, " %s (read-only)", vnode->name ());
67348ccc 653 TREE_READONLY (vnode->decl) = 1;
4a444e58
JH
654 }
655 }
656 if (dump_file)
657 fprintf (dump_file, "\n");
658}
659
430c6ceb
JH
660/* Return true when there is a reference to node and it is not vtable. */
661static bool
5e20cdc9 662address_taken_from_non_vtable_p (symtab_node *node)
430c6ceb
JH
663{
664 int i;
665 struct ipa_ref *ref;
67348ccc 666 for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
960bfb69 667 i, ref); i++)
d2640c43
JH
668 if (ref->use == IPA_REF_ADDR)
669 {
2c8326a5 670 varpool_node *node;
5d59b5e1 671 if (is_a <cgraph_node> (ref->referring))
d2640c43 672 return true;
5932a4d4 673 node = ipa_ref_referring_varpool_node (ref);
67348ccc 674 if (!DECL_VIRTUAL_P (node->decl))
d2640c43
JH
675 return true;
676 }
430c6ceb
JH
677 return false;
678}
679
edb983b2
JH
680/* A helper for comdat_can_be_unshared_p. */
681
682static bool
5e20cdc9 683comdat_can_be_unshared_p_1 (symtab_node *node)
edb983b2
JH
684{
685 /* When address is taken, we don't know if equality comparison won't
0987ffe7
JH
686 break eventually. Exception are virutal functions, C++
687 constructors/destructors and vtables, where this is not possible by
688 language standard. */
67348ccc
DM
689 if (!DECL_VIRTUAL_P (node->decl)
690 && (TREE_CODE (node->decl) != FUNCTION_DECL
691 || (!DECL_CXX_CONSTRUCTOR_P (node->decl)
692 && !DECL_CXX_DESTRUCTOR_P (node->decl)))
edb983b2
JH
693 && address_taken_from_non_vtable_p (node))
694 return false;
695
696 /* If the symbol is used in some weird way, better to not touch it. */
67348ccc 697 if (node->force_output)
edb983b2
JH
698 return false;
699
700 /* Explicit instantiations needs to be output when possibly
701 used externally. */
67348ccc
DM
702 if (node->forced_by_abi
703 && TREE_PUBLIC (node->decl)
704 && (node->resolution != LDPR_PREVAILING_DEF_IRONLY
edb983b2
JH
705 && !flag_whole_program))
706 return false;
707
708 /* Non-readonly and volatile variables can not be duplicated. */
709 if (is_a <varpool_node> (node)
67348ccc
DM
710 && (!TREE_READONLY (node->decl)
711 || TREE_THIS_VOLATILE (node->decl)))
edb983b2
JH
712 return false;
713 return true;
714}
715
430c6ceb
JH
716/* COMDAT functions must be shared only if they have address taken,
717 otherwise we can produce our own private implementation with
718 -fwhole-program.
719 Return true when turning COMDAT functoin static can not lead to wrong
720 code when the resulting object links with a library defining same COMDAT.
721
722 Virtual functions do have their addresses taken from the vtables,
723 but in C++ there is no way to compare their addresses for equality. */
724
e70670cf 725static bool
5e20cdc9 726comdat_can_be_unshared_p (symtab_node *node)
430c6ceb 727{
edb983b2 728 if (!comdat_can_be_unshared_p_1 (node))
430c6ceb 729 return false;
67348ccc 730 if (node->same_comdat_group)
430c6ceb 731 {
5e20cdc9 732 symtab_node *next;
430c6ceb
JH
733
734 /* If more than one function is in the same COMDAT group, it must
735 be shared even if just one function in the comdat group has
736 address taken. */
67348ccc
DM
737 for (next = node->same_comdat_group;
738 next != node; next = next->same_comdat_group)
edb983b2
JH
739 if (!comdat_can_be_unshared_p_1 (next))
740 return false;
430c6ceb
JH
741 }
742 return true;
743}
744
4a444e58
JH
745/* Return true when function NODE should be considered externally visible. */
746
b20996ff 747static bool
39e2db00 748cgraph_externally_visible_p (struct cgraph_node *node,
5ac42672 749 bool whole_program)
b20996ff 750{
67348ccc 751 if (!node->definition)
b820a2f9 752 return false;
67348ccc
DM
753 if (!TREE_PUBLIC (node->decl)
754 || DECL_EXTERNAL (node->decl))
b20996ff 755 return false;
5dde3b01 756
bf243ea7
JH
757 /* Do not try to localize built-in functions yet. One of problems is that we
758 end up mangling their asm for WHOPR that makes it impossible to call them
759 using the implicit built-in declarations anymore. Similarly this enables
760 us to remove them as unreachable before actual calls may appear during
761 expansion or folding. */
67348ccc 762 if (DECL_BUILT_IN (node->decl))
bf243ea7
JH
763 return true;
764
0e9ea52b 765 /* If linker counts on us, we must preserve the function. */
67348ccc 766 if (symtab_used_from_object_file_p (node))
0e9ea52b 767 return true;
67348ccc 768 if (DECL_PRESERVE_P (node->decl))
93a3eea4 769 return true;
960bfb69 770 if (lookup_attribute ("externally_visible",
67348ccc 771 DECL_ATTRIBUTES (node->decl)))
93a3eea4 772 return true;
9d602c59 773 if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
960bfb69 774 && lookup_attribute ("dllexport",
67348ccc 775 DECL_ATTRIBUTES (node->decl)))
9d602c59 776 return true;
67348ccc 777 if (node->resolution == LDPR_PREVAILING_DEF_IRONLY)
c3e3f090 778 return false;
430c6ceb
JH
779 /* When doing LTO or whole program, we can bring COMDAT functoins static.
780 This improves code quality and we know we will duplicate them at most twice
781 (in the case that we are not using plugin and link with object file
782 implementing same COMDAT) */
783 if ((in_lto_p || whole_program)
67348ccc
DM
784 && DECL_COMDAT (node->decl)
785 && comdat_can_be_unshared_p (node))
430c6ceb
JH
786 return false;
787
5dde3b01 788 /* When doing link time optimizations, hidden symbols become local. */
0e9ea52b 789 if (in_lto_p
67348ccc
DM
790 && (DECL_VISIBILITY (node->decl) == VISIBILITY_HIDDEN
791 || DECL_VISIBILITY (node->decl) == VISIBILITY_INTERNAL)
99fecd47
JH
792 /* Be sure that node is defined in IR file, not in other object
793 file. In that case we don't set used_from_other_object_file. */
67348ccc 794 && node->definition)
5dde3b01
JH
795 ;
796 else if (!whole_program)
b932b8b1 797 return true;
93a3eea4 798
67348ccc 799 if (MAIN_NAME_P (DECL_NAME (node->decl)))
bb853349 800 return true;
93a3eea4
JH
801
802 return false;
803}
804
805/* Return true when variable VNODE should be considered externally visible. */
806
38877e98 807bool
2c8326a5 808varpool_externally_visible_p (varpool_node *vnode)
93a3eea4 809{
67348ccc 810 if (DECL_EXTERNAL (vnode->decl))
6649df51
JH
811 return true;
812
67348ccc 813 if (!TREE_PUBLIC (vnode->decl))
93a3eea4
JH
814 return false;
815
93a3eea4 816 /* If linker counts on us, we must preserve the function. */
67348ccc 817 if (symtab_used_from_object_file_p (vnode))
93a3eea4
JH
818 return true;
819
67348ccc 820 if (DECL_HARD_REGISTER (vnode->decl))
a296a010 821 return true;
67348ccc 822 if (DECL_PRESERVE_P (vnode->decl))
93a3eea4
JH
823 return true;
824 if (lookup_attribute ("externally_visible",
67348ccc 825 DECL_ATTRIBUTES (vnode->decl)))
93a3eea4 826 return true;
9d602c59
KT
827 if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
828 && lookup_attribute ("dllexport",
67348ccc 829 DECL_ATTRIBUTES (vnode->decl)))
9d602c59 830 return true;
93a3eea4
JH
831
832 /* See if we have linker information about symbol not being used or
833 if we need to make guess based on the declaration.
834
835 Even if the linker clams the symbol is unused, never bring internal
836 symbols that are declared by user as used or externally visible.
837 This is needed for i.e. references from asm statements. */
67348ccc 838 if (symtab_used_from_object_file_p (vnode))
93a3eea4 839 return true;
67348ccc 840 if (vnode->resolution == LDPR_PREVAILING_DEF_IRONLY)
ed0d2da0 841 return false;
93a3eea4 842
073a8998 843 /* As a special case, the COMDAT virtual tables can be unshared.
430c6ceb
JH
844 In LTO mode turn vtables into static variables. The variable is readonly,
845 so this does not enable more optimization, but referring static var
846 is faster for dynamic linking. Also this match logic hidding vtables
847 from LTO symbol tables. */
848 if ((in_lto_p || flag_whole_program)
67348ccc
DM
849 && DECL_COMDAT (vnode->decl)
850 && comdat_can_be_unshared_p (vnode))
430c6ceb
JH
851 return false;
852
93a3eea4
JH
853 /* When doing link time optimizations, hidden symbols become local. */
854 if (in_lto_p
67348ccc
DM
855 && (DECL_VISIBILITY (vnode->decl) == VISIBILITY_HIDDEN
856 || DECL_VISIBILITY (vnode->decl) == VISIBILITY_INTERNAL)
93a3eea4
JH
857 /* Be sure that node is defined in IR file, not in other object
858 file. In that case we don't set used_from_other_object_file. */
67348ccc 859 && vnode->definition)
93a3eea4
JH
860 ;
861 else if (!flag_whole_program)
862 return true;
863
864 /* Do not attempt to privatize COMDATS by default.
865 This would break linking with C++ libraries sharing
866 inline definitions.
867
868 FIXME: We can do so for readonly vars with no address taken and
869 possibly also for vtables since no direct pointer comparsion is done.
870 It might be interesting to do so to reduce linking overhead. */
67348ccc 871 if (DECL_COMDAT (vnode->decl) || DECL_WEAK (vnode->decl))
b20996ff
JH
872 return true;
873 return false;
874}
875
af15184a
JH
876/* Return true if reference to NODE can be replaced by a local alias.
877 Local aliases save dynamic linking overhead and enable more optimizations.
878 */
879
880bool
5e20cdc9 881can_replace_by_local_alias (symtab_node *node)
af15184a
JH
882{
883 return (symtab_node_availability (node) > AVAIL_OVERWRITABLE
09ce3660 884 && !symtab_can_be_discarded (node));
af15184a
JH
885}
886
f4b3ca72
JH
887/* Mark visibility of all functions.
888
889 A local function is one whose calls can occur only in the current
890 compilation unit and all its calls are explicit, so we can change
891 its calling convention. We simply mark all static functions whose
892 address is not taken as local.
893
894 We also change the TREE_PUBLIC flag of all declarations that are public
895 in language point of view but we want to overwrite this default
896 via visibilities for the backend point of view. */
897
4e260309 898static unsigned int
b20996ff 899function_and_variable_visibility (bool whole_program)
f4b3ca72
JH
900{
901 struct cgraph_node *node;
2c8326a5 902 varpool_node *vnode;
5dde3b01 903
5ac42672 904 /* All aliases should be procssed at this point. */
c3284718 905 gcc_checking_assert (!alias_pairs || !alias_pairs->length ());
f4b3ca72 906
65c70e6b 907 FOR_EACH_FUNCTION (node)
f4b3ca72 908 {
67348ccc 909 int flags = flags_from_decl_or_type (node->decl);
8cb114b9
JH
910
911 /* Optimize away PURE and CONST constructors and destructors. */
530f3a1b
JH
912 if (optimize
913 && (flags & (ECF_CONST | ECF_PURE))
914 && !(flags & ECF_LOOPING_CONST_OR_PURE))
915 {
67348ccc
DM
916 DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
917 DECL_STATIC_DESTRUCTOR (node->decl) = 0;
530f3a1b
JH
918 }
919
8cb114b9
JH
920 /* Frontends and alias code marks nodes as needed before parsing is finished.
921 We may end up marking as node external nodes where this flag is meaningless
922 strip it. */
67348ccc 923 if (DECL_EXTERNAL (node->decl) || !node->definition)
edb983b2 924 {
67348ccc
DM
925 node->force_output = 0;
926 node->forced_by_abi = 0;
edb983b2 927 }
8cb114b9 928
589520b6
JH
929 /* C++ FE on lack of COMDAT support create local COMDAT functions
930 (that ought to be shared but can not due to object format
073a8998 931 limitations). It is necessary to keep the flag to make rest of C++ FE
589520b6 932 happy. Clear the flag here to avoid confusion in middle-end. */
67348ccc
DM
933 if (DECL_COMDAT (node->decl) && !TREE_PUBLIC (node->decl))
934 DECL_COMDAT (node->decl) = 0;
08346abd
JH
935
936 /* For external decls stop tracking same_comdat_group. It doesn't matter
937 what comdat group they are in when they won't be emitted in this TU. */
67348ccc 938 if (node->same_comdat_group && DECL_EXTERNAL (node->decl))
3fd54fb0 939 {
78eaf7bf 940#ifdef ENABLE_CHECKING
5e20cdc9 941 symtab_node *n;
78eaf7bf 942
67348ccc
DM
943 for (n = node->same_comdat_group;
944 n != node;
945 n = n->same_comdat_group)
3fd54fb0
JJ
946 /* If at least one of same comdat group functions is external,
947 all of them have to be, otherwise it is a front-end bug. */
67348ccc 948 gcc_assert (DECL_EXTERNAL (n->decl));
78eaf7bf 949#endif
67348ccc 950 symtab_dissolve_same_comdat_group_list (node);
3fd54fb0 951 }
67348ccc
DM
952 gcc_assert ((!DECL_WEAK (node->decl)
953 && !DECL_COMDAT (node->decl))
954 || TREE_PUBLIC (node->decl)
955 || node->weakref
956 || DECL_EXTERNAL (node->decl));
5ac42672 957 if (cgraph_externally_visible_p (node, whole_program))
b20996ff
JH
958 {
959 gcc_assert (!node->global.inlined_to);
67348ccc 960 node->externally_visible = true;
b20996ff
JH
961 }
962 else
edb983b2 963 {
67348ccc
DM
964 node->externally_visible = false;
965 node->forced_by_abi = false;
edb983b2 966 }
67348ccc
DM
967 if (!node->externally_visible
968 && node->definition && !node->weakref
969 && !DECL_EXTERNAL (node->decl))
f4b3ca72 970 {
960bfb69 971 gcc_assert (whole_program || in_lto_p
67348ccc
DM
972 || !TREE_PUBLIC (node->decl));
973 node->unique_name = ((node->resolution == LDPR_PREVAILING_DEF_IRONLY
9ffbf271
JH
974 || node->unique_name
975 || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
976 && TREE_PUBLIC (node->decl));
67348ccc 977 node->resolution = LDPR_PREVAILING_DEF_IRONLY;
1f26ac87 978 if (node->same_comdat_group && TREE_PUBLIC (node->decl))
9ffbf271
JH
979 {
980 symtab_node *next = node;
981
982 /* Set all members of comdat group local. */
983 if (node->same_comdat_group)
984 for (next = node->same_comdat_group;
985 next != node;
986 next = next->same_comdat_group)
987 {
988 symtab_make_decl_local (next->decl);
989 next->unique_name = ((next->resolution == LDPR_PREVAILING_DEF_IRONLY
990 || next->unique_name
991 || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
992 && TREE_PUBLIC (next->decl));
993 }
994 /* cgraph_externally_visible_p has already checked all other nodes
995 in the group and they will all be made local. We need to
996 dissolve the group at once so that the predicate does not
997 segfault though. */
998 symtab_dissolve_same_comdat_group_list (node);
999 }
1f26ac87 1000 symtab_make_decl_local (node->decl);
f4b3ca72 1001 }
c47d0034
JH
1002
1003 if (node->thunk.thunk_p
67348ccc 1004 && TREE_PUBLIC (node->decl))
c47d0034
JH
1005 {
1006 struct cgraph_node *decl_node = node;
1007
39e2db00 1008 decl_node = cgraph_function_node (decl_node->callees->callee, NULL);
c47d0034
JH
1009
1010 /* Thunks have the same visibility as function they are attached to.
2fda8e14 1011 Make sure the C++ front end set this up properly. */
67348ccc 1012 if (DECL_ONE_ONLY (decl_node->decl))
c47d0034 1013 {
67348ccc
DM
1014 gcc_checking_assert (DECL_COMDAT (node->decl)
1015 == DECL_COMDAT (decl_node->decl));
1016 gcc_checking_assert (DECL_COMDAT_GROUP (node->decl)
1017 == DECL_COMDAT_GROUP (decl_node->decl));
1018 gcc_checking_assert (node->same_comdat_group);
c47d0034 1019 }
67348ccc
DM
1020 if (DECL_EXTERNAL (decl_node->decl))
1021 DECL_EXTERNAL (node->decl) = 1;
c47d0034 1022 }
d665f8dd
JH
1023
1024 /* If whole comdat group is used only within LTO code, we can dissolve it,
1025 we handle the unification ourselves.
1026 We keep COMDAT and weak so visibility out of DSO does not change.
1027 Later we may bring the symbols static if they are not exported. */
1028 if (DECL_ONE_ONLY (node->decl)
1029 && (node->resolution == LDPR_PREVAILING_DEF_IRONLY
1030 || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP))
1031 {
1032 symtab_node *next = node;
1033
1034 if (node->same_comdat_group)
1035 for (next = node->same_comdat_group;
1036 next != node;
1037 next = next->same_comdat_group)
1038 if (next->externally_visible
1039 && (next->resolution != LDPR_PREVAILING_DEF_IRONLY
1040 && next->resolution != LDPR_PREVAILING_DEF_IRONLY_EXP))
1041 break;
1042 if (node == next)
1043 {
1044 if (node->same_comdat_group)
1045 for (next = node->same_comdat_group;
1046 next != node;
1047 next = next->same_comdat_group)
7fea98d8 1048 {
d665f8dd 1049 DECL_COMDAT_GROUP (next->decl) = NULL;
7fea98d8
JH
1050 DECL_WEAK (next->decl) = false;
1051 }
d665f8dd
JH
1052 DECL_COMDAT_GROUP (node->decl) = NULL;
1053 symtab_dissolve_same_comdat_group_list (node);
1054 }
1055 }
f4b3ca72 1056 }
65c70e6b 1057 FOR_EACH_DEFINED_FUNCTION (node)
af15184a 1058 {
51a5c0c2 1059 node->local.local |= cgraph_local_node_p (node);
af15184a
JH
1060
1061 /* If we know that function can not be overwritten by a different semantics
1062 and moreover its section can not be discarded, replace all direct calls
1063 by calls to an nonoverwritable alias. This make dynamic linking
1064 cheaper and enable more optimization.
1065
1066 TODO: We can also update virtual tables. */
67348ccc 1067 if (node->callers && can_replace_by_local_alias (node))
af15184a 1068 {
67348ccc 1069 struct cgraph_node *alias = cgraph (symtab_nonoverwritable_alias (node));
af15184a 1070
5b79657a 1071 if (alias && alias != node)
af15184a
JH
1072 {
1073 while (node->callers)
1074 {
1075 struct cgraph_edge *e = node->callers;
1076
1077 cgraph_redirect_edge_callee (e, alias);
67348ccc 1078 if (gimple_has_body_p (e->caller->decl))
af15184a 1079 {
67348ccc 1080 push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
af15184a
JH
1081 cgraph_redirect_edge_call_stmt_to_callee (e);
1082 pop_cfun ();
1083 }
1084 }
1085 }
1086 }
1087 }
65c70e6b 1088 FOR_EACH_VARIABLE (vnode)
e9fecf0e
JH
1089 {
1090 /* weak flag makes no sense on local variables. */
67348ccc
DM
1091 gcc_assert (!DECL_WEAK (vnode->decl)
1092 || vnode->weakref
1093 || TREE_PUBLIC (vnode->decl)
1094 || DECL_EXTERNAL (vnode->decl));
e9fecf0e
JH
1095 /* In several cases declarations can not be common:
1096
1097 - when declaration has initializer
1098 - when it is in weak
1099 - when it has specific section
1100 - when it resides in non-generic address space.
1101 - if declaration is local, it will get into .local common section
1102 so common flag is not needed. Frontends still produce these in
1103 certain cases, such as for:
1104
1105 static int a __attribute__ ((common))
1106
1107 Canonicalize things here and clear the redundant flag. */
67348ccc
DM
1108 if (DECL_COMMON (vnode->decl)
1109 && (!(TREE_PUBLIC (vnode->decl)
1110 || DECL_EXTERNAL (vnode->decl))
1111 || (DECL_INITIAL (vnode->decl)
1112 && DECL_INITIAL (vnode->decl) != error_mark_node)
1113 || DECL_WEAK (vnode->decl)
1114 || DECL_SECTION_NAME (vnode->decl) != NULL
e9fecf0e 1115 || ! (ADDR_SPACE_GENERIC_P
67348ccc
DM
1116 (TYPE_ADDR_SPACE (TREE_TYPE (vnode->decl))))))
1117 DECL_COMMON (vnode->decl) = 0;
e9fecf0e 1118 }
65c70e6b 1119 FOR_EACH_DEFINED_VARIABLE (vnode)
f4b3ca72 1120 {
67348ccc 1121 if (!vnode->definition)
b820a2f9 1122 continue;
5ac42672 1123 if (varpool_externally_visible_p (vnode))
67348ccc 1124 vnode->externally_visible = true;
b20996ff 1125 else
edb983b2 1126 {
67348ccc
DM
1127 vnode->externally_visible = false;
1128 vnode->forced_by_abi = false;
edb983b2 1129 }
67348ccc
DM
1130 if (!vnode->externally_visible
1131 && !vnode->weakref)
f4b3ca72 1132 {
67348ccc
DM
1133 gcc_assert (in_lto_p || whole_program || !TREE_PUBLIC (vnode->decl));
1134 vnode->unique_name = ((vnode->resolution == LDPR_PREVAILING_DEF_IRONLY
1135 || vnode->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
1136 && TREE_PUBLIC (vnode->decl));
1137 symtab_make_decl_local (vnode->decl);
1138 if (vnode->same_comdat_group)
1139 symtab_dissolve_same_comdat_group_list (vnode);
1140 vnode->resolution = LDPR_PREVAILING_DEF_IRONLY;
f4b3ca72 1141 }
f4b3ca72
JH
1142 }
1143
1144 if (dump_file)
1145 {
1146 fprintf (dump_file, "\nMarking local functions:");
65c70e6b 1147 FOR_EACH_DEFINED_FUNCTION (node)
f4b3ca72 1148 if (node->local.local)
fec39fa6 1149 fprintf (dump_file, " %s", node->name ());
f4b3ca72
JH
1150 fprintf (dump_file, "\n\n");
1151 fprintf (dump_file, "\nMarking externally visible functions:");
65c70e6b 1152 FOR_EACH_DEFINED_FUNCTION (node)
67348ccc 1153 if (node->externally_visible)
fec39fa6 1154 fprintf (dump_file, " %s", node->name ());
f4b3ca72 1155 fprintf (dump_file, "\n\n");
a8289259 1156 fprintf (dump_file, "\nMarking externally visible variables:");
65c70e6b 1157 FOR_EACH_DEFINED_VARIABLE (vnode)
67348ccc 1158 if (vnode->externally_visible)
fec39fa6 1159 fprintf (dump_file, " %s", vnode->name ());
a8289259 1160 fprintf (dump_file, "\n\n");
f4b3ca72
JH
1161 }
1162 cgraph_function_flags_ready = true;
4e260309 1163 return 0;
f4b3ca72
JH
1164}
1165
b20996ff
JH
1166/* Local function pass handling visibilities. This happens before LTO streaming
1167 so in particular -fwhole-program should be ignored at this level. */
1168
1169static unsigned int
1170local_function_and_variable_visibility (void)
1171{
014d92e1 1172 return function_and_variable_visibility (flag_whole_program && !flag_lto);
b20996ff
JH
1173}
1174
27a4cd48
DM
1175namespace {
1176
1177const pass_data pass_data_ipa_function_and_variable_visibility =
f4b3ca72 1178{
27a4cd48
DM
1179 SIMPLE_IPA_PASS, /* type */
1180 "visibility", /* name */
1181 OPTGROUP_NONE, /* optinfo_flags */
1182 false, /* has_gate */
1183 true, /* has_execute */
1184 TV_CGRAPHOPT, /* tv_id */
1185 0, /* properties_required */
1186 0, /* properties_provided */
1187 0, /* properties_destroyed */
1188 0, /* todo_flags_start */
1189 ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
f4b3ca72 1190};
fed5ae11 1191
27a4cd48
DM
1192class pass_ipa_function_and_variable_visibility : public simple_ipa_opt_pass
1193{
1194public:
c3284718
RS
1195 pass_ipa_function_and_variable_visibility (gcc::context *ctxt)
1196 : simple_ipa_opt_pass (pass_data_ipa_function_and_variable_visibility,
1197 ctxt)
27a4cd48
DM
1198 {}
1199
1200 /* opt_pass methods: */
1201 unsigned int execute () {
1202 return local_function_and_variable_visibility ();
1203 }
1204
1205}; // class pass_ipa_function_and_variable_visibility
1206
1207} // anon namespace
1208
1209simple_ipa_opt_pass *
1210make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt)
1211{
1212 return new pass_ipa_function_and_variable_visibility (ctxt);
1213}
1214
a8da72b8
L
1215/* Free inline summary. */
1216
1217static unsigned
1218free_inline_summary (void)
1219{
1220 inline_free_summary ();
1221 return 0;
1222}
1223
27a4cd48
DM
1224namespace {
1225
1226const pass_data pass_data_ipa_free_inline_summary =
a8da72b8 1227{
27a4cd48
DM
1228 SIMPLE_IPA_PASS, /* type */
1229 "*free_inline_summary", /* name */
1230 OPTGROUP_NONE, /* optinfo_flags */
1231 false, /* has_gate */
1232 true, /* has_execute */
1233 TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
1234 0, /* properties_required */
1235 0, /* properties_provided */
1236 0, /* properties_destroyed */
1237 0, /* todo_flags_start */
1238 0, /* todo_flags_finish */
a8da72b8
L
1239};
1240
27a4cd48
DM
1241class pass_ipa_free_inline_summary : public simple_ipa_opt_pass
1242{
1243public:
c3284718
RS
1244 pass_ipa_free_inline_summary (gcc::context *ctxt)
1245 : simple_ipa_opt_pass (pass_data_ipa_free_inline_summary, ctxt)
27a4cd48
DM
1246 {}
1247
1248 /* opt_pass methods: */
1249 unsigned int execute () { return free_inline_summary (); }
1250
1251}; // class pass_ipa_free_inline_summary
1252
1253} // anon namespace
1254
1255simple_ipa_opt_pass *
1256make_pass_ipa_free_inline_summary (gcc::context *ctxt)
1257{
1258 return new pass_ipa_free_inline_summary (ctxt);
1259}
1260
b20996ff
JH
1261/* Do not re-run on ltrans stage. */
1262
1263static bool
1264gate_whole_program_function_and_variable_visibility (void)
1265{
1266 return !flag_ltrans;
1267}
1268
073a8998 1269/* Bring functionss local at LTO time with -fwhole-program. */
b20996ff
JH
1270
1271static unsigned int
1272whole_program_function_and_variable_visibility (void)
1273{
b20996ff 1274 function_and_variable_visibility (flag_whole_program);
f10ea640
JH
1275 if (optimize)
1276 ipa_discover_readonly_nonaddressable_vars ();
b20996ff
JH
1277 return 0;
1278}
1279
27a4cd48
DM
1280namespace {
1281
1282const pass_data pass_data_ipa_whole_program_visibility =
b20996ff 1283{
27a4cd48
DM
1284 IPA_PASS, /* type */
1285 "whole-program", /* name */
1286 OPTGROUP_NONE, /* optinfo_flags */
1287 true, /* has_gate */
1288 true, /* has_execute */
1289 TV_CGRAPHOPT, /* tv_id */
1290 0, /* properties_required */
1291 0, /* properties_provided */
1292 0, /* properties_destroyed */
1293 0, /* todo_flags_start */
1294 ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
b20996ff 1295};
fed5ae11 1296
27a4cd48
DM
1297class pass_ipa_whole_program_visibility : public ipa_opt_pass_d
1298{
1299public:
c3284718
RS
1300 pass_ipa_whole_program_visibility (gcc::context *ctxt)
1301 : ipa_opt_pass_d (pass_data_ipa_whole_program_visibility, ctxt,
1302 NULL, /* generate_summary */
1303 NULL, /* write_summary */
1304 NULL, /* read_summary */
1305 NULL, /* write_optimization_summary */
1306 NULL, /* read_optimization_summary */
1307 NULL, /* stmt_fixup */
1308 0, /* function_transform_todo_flags_start */
1309 NULL, /* function_transform */
1310 NULL) /* variable_transform */
27a4cd48
DM
1311 {}
1312
1313 /* opt_pass methods: */
1314 bool gate () {
1315 return gate_whole_program_function_and_variable_visibility ();
1316 }
1317 unsigned int execute () {
1318 return whole_program_function_and_variable_visibility ();
1319 }
1320
1321}; // class pass_ipa_whole_program_visibility
1322
1323} // anon namespace
1324
1325ipa_opt_pass_d *
1326make_pass_ipa_whole_program_visibility (gcc::context *ctxt)
1327{
1328 return new pass_ipa_whole_program_visibility (ctxt);
1329}
1330
9e97ff61 1331/* Generate and emit a static constructor or destructor. WHICH must
089d1227
IE
1332 be one of 'I' (for a constructor) or 'D' (for a destructor). BODY
1333 is a STATEMENT_LIST containing GENERIC statements. PRIORITY is the
1334 initialization priority for this constructor or destructor.
9e97ff61 1335
3a9ed12a
JH
1336 FINAL specify whether the externally visible name for collect2 should
1337 be produced. */
1338
1339static void
1340cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final)
9e97ff61
JH
1341{
1342 static int counter = 0;
1343 char which_buf[16];
1344 tree decl, name, resdecl;
1345
1346 /* The priority is encoded in the constructor or destructor name.
1347 collect2 will sort the names and arrange that they are called at
1348 program startup. */
3a9ed12a
JH
1349 if (final)
1350 sprintf (which_buf, "%c_%.5d_%d", which, priority, counter++);
1351 else
1352 /* Proudce sane name but one not recognizable by collect2, just for the
1353 case we fail to inline the function. */
1354 sprintf (which_buf, "sub_%c_%.5d_%d", which, priority, counter++);
9e97ff61
JH
1355 name = get_file_function_name (which_buf);
1356
1357 decl = build_decl (input_location, FUNCTION_DECL, name,
1358 build_function_type_list (void_type_node, NULL_TREE));
1359 current_function_decl = decl;
1360
1361 resdecl = build_decl (input_location,
1362 RESULT_DECL, NULL_TREE, void_type_node);
1363 DECL_ARTIFICIAL (resdecl) = 1;
1364 DECL_RESULT (decl) = resdecl;
1365 DECL_CONTEXT (resdecl) = decl;
1366
1367 allocate_struct_function (decl, false);
1368
1369 TREE_STATIC (decl) = 1;
1370 TREE_USED (decl) = 1;
1371 DECL_ARTIFICIAL (decl) = 1;
1372 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1373 DECL_SAVED_TREE (decl) = body;
3a9ed12a 1374 if (!targetm.have_ctors_dtors && final)
9e97ff61
JH
1375 {
1376 TREE_PUBLIC (decl) = 1;
1377 DECL_PRESERVE_P (decl) = 1;
1378 }
1379 DECL_UNINLINABLE (decl) = 1;
1380
1381 DECL_INITIAL (decl) = make_node (BLOCK);
1382 TREE_USED (DECL_INITIAL (decl)) = 1;
1383
1384 DECL_SOURCE_LOCATION (decl) = input_location;
1385 cfun->function_end_locus = input_location;
1386
1387 switch (which)
1388 {
1389 case 'I':
1390 DECL_STATIC_CONSTRUCTOR (decl) = 1;
1391 decl_init_priority_insert (decl, priority);
1392 break;
1393 case 'D':
1394 DECL_STATIC_DESTRUCTOR (decl) = 1;
1395 decl_fini_priority_insert (decl, priority);
1396 break;
1397 default:
1398 gcc_unreachable ();
1399 }
1400
1401 gimplify_function_tree (decl);
1402
1403 cgraph_add_new_function (decl, false);
1404
1405 set_cfun (NULL);
1406 current_function_decl = NULL;
1407}
1408
3a9ed12a 1409/* Generate and emit a static constructor or destructor. WHICH must
089d1227
IE
1410 be one of 'I' (for a constructor) or 'D' (for a destructor). BODY
1411 is a STATEMENT_LIST containing GENERIC statements. PRIORITY is the
1412 initialization priority for this constructor or destructor. */
3a9ed12a
JH
1413
1414void
1415cgraph_build_static_cdtor (char which, tree body, int priority)
1416{
1417 cgraph_build_static_cdtor_1 (which, body, priority, false);
1418}
9e97ff61
JH
1419
1420/* A vector of FUNCTION_DECLs declared as static constructors. */
9771b263 1421static vec<tree> static_ctors;
9e97ff61 1422/* A vector of FUNCTION_DECLs declared as static destructors. */
9771b263 1423static vec<tree> static_dtors;
9e97ff61
JH
1424
1425/* When target does not have ctors and dtors, we call all constructor
1426 and destructor by special initialization/destruction function
1427 recognized by collect2.
1428
1429 When we are going to build this function, collect all constructors and
1430 destructors and turn them into normal functions. */
1431
1432static void
1433record_cdtor_fn (struct cgraph_node *node)
1434{
67348ccc
DM
1435 if (DECL_STATIC_CONSTRUCTOR (node->decl))
1436 static_ctors.safe_push (node->decl);
1437 if (DECL_STATIC_DESTRUCTOR (node->decl))
1438 static_dtors.safe_push (node->decl);
1439 node = cgraph_get_node (node->decl);
1440 DECL_DISREGARD_INLINE_LIMITS (node->decl) = 1;
9e97ff61
JH
1441}
1442
1443/* Define global constructors/destructor functions for the CDTORS, of
1444 which they are LEN. The CDTORS are sorted by initialization
1445 priority. If CTOR_P is true, these are constructors; otherwise,
1446 they are destructors. */
1447
1448static void
9771b263 1449build_cdtor (bool ctor_p, vec<tree> cdtors)
9e97ff61
JH
1450{
1451 size_t i,j;
9771b263 1452 size_t len = cdtors.length ();
9e97ff61
JH
1453
1454 i = 0;
1455 while (i < len)
1456 {
1457 tree body;
1458 tree fn;
1459 priority_type priority;
1460
1461 priority = 0;
1462 body = NULL_TREE;
1463 j = i;
1464 do
1465 {
1466 priority_type p;
9771b263 1467 fn = cdtors[j];
9e97ff61
JH
1468 p = ctor_p ? DECL_INIT_PRIORITY (fn) : DECL_FINI_PRIORITY (fn);
1469 if (j == i)
1470 priority = p;
1471 else if (p != priority)
1472 break;
1473 j++;
1474 }
1475 while (j < len);
1476
48c24aca 1477 /* When there is only one cdtor and target supports them, do nothing. */
9e97ff61
JH
1478 if (j == i + 1
1479 && targetm.have_ctors_dtors)
1480 {
1481 i++;
1482 continue;
1483 }
1484 /* Find the next batch of constructors/destructors with the same
1485 initialization priority. */
48c24aca 1486 for (;i < j; i++)
9e97ff61 1487 {
9e97ff61 1488 tree call;
9771b263 1489 fn = cdtors[i];
9e97ff61
JH
1490 call = build_call_expr (fn, 0);
1491 if (ctor_p)
1492 DECL_STATIC_CONSTRUCTOR (fn) = 0;
1493 else
1494 DECL_STATIC_DESTRUCTOR (fn) = 0;
1495 /* We do not want to optimize away pure/const calls here.
1496 When optimizing, these should be already removed, when not
1497 optimizing, we want user to be able to breakpoint in them. */
1498 TREE_SIDE_EFFECTS (call) = 1;
1499 append_to_statement_list (call, &body);
9e97ff61 1500 }
9e97ff61
JH
1501 gcc_assert (body != NULL_TREE);
1502 /* Generate a function to call all the function of like
1503 priority. */
3a9ed12a 1504 cgraph_build_static_cdtor_1 (ctor_p ? 'I' : 'D', body, priority, true);
9e97ff61
JH
1505 }
1506}
1507
1508/* Comparison function for qsort. P1 and P2 are actually of type
1509 "tree *" and point to static constructors. DECL_INIT_PRIORITY is
1510 used to determine the sort order. */
1511
1512static int
1513compare_ctor (const void *p1, const void *p2)
1514{
1515 tree f1;
1516 tree f2;
1517 int priority1;
1518 int priority2;
1519
1520 f1 = *(const tree *)p1;
1521 f2 = *(const tree *)p2;
1522 priority1 = DECL_INIT_PRIORITY (f1);
1523 priority2 = DECL_INIT_PRIORITY (f2);
1524
1525 if (priority1 < priority2)
1526 return -1;
1527 else if (priority1 > priority2)
1528 return 1;
1529 else
1530 /* Ensure a stable sort. Constructors are executed in backwarding
1531 order to make LTO initialize braries first. */
1532 return DECL_UID (f2) - DECL_UID (f1);
1533}
1534
1535/* Comparison function for qsort. P1 and P2 are actually of type
1536 "tree *" and point to static destructors. DECL_FINI_PRIORITY is
1537 used to determine the sort order. */
1538
1539static int
1540compare_dtor (const void *p1, const void *p2)
1541{
1542 tree f1;
1543 tree f2;
1544 int priority1;
1545 int priority2;
1546
1547 f1 = *(const tree *)p1;
1548 f2 = *(const tree *)p2;
1549 priority1 = DECL_FINI_PRIORITY (f1);
1550 priority2 = DECL_FINI_PRIORITY (f2);
1551
1552 if (priority1 < priority2)
1553 return -1;
1554 else if (priority1 > priority2)
1555 return 1;
1556 else
1557 /* Ensure a stable sort. */
1558 return DECL_UID (f1) - DECL_UID (f2);
1559}
1560
1561/* Generate functions to call static constructors and destructors
1562 for targets that do not support .ctors/.dtors sections. These
1563 functions have magic names which are detected by collect2. */
1564
1565static void
1566build_cdtor_fns (void)
1567{
9771b263 1568 if (!static_ctors.is_empty ())
9e97ff61
JH
1569 {
1570 gcc_assert (!targetm.have_ctors_dtors || in_lto_p);
9771b263 1571 static_ctors.qsort (compare_ctor);
48c24aca 1572 build_cdtor (/*ctor_p=*/true, static_ctors);
9e97ff61
JH
1573 }
1574
9771b263 1575 if (!static_dtors.is_empty ())
9e97ff61
JH
1576 {
1577 gcc_assert (!targetm.have_ctors_dtors || in_lto_p);
9771b263 1578 static_dtors.qsort (compare_dtor);
48c24aca 1579 build_cdtor (/*ctor_p=*/false, static_dtors);
9e97ff61
JH
1580 }
1581}
1582
1583/* Look for constructors and destructors and produce function calling them.
1584 This is needed for targets not supporting ctors or dtors, but we perform the
073a8998 1585 transformation also at linktime to merge possibly numerous
9e97ff61
JH
1586 constructors/destructors into single function to improve code locality and
1587 reduce size. */
1588
1589static unsigned int
1590ipa_cdtor_merge (void)
1591{
1592 struct cgraph_node *node;
65c70e6b 1593 FOR_EACH_DEFINED_FUNCTION (node)
67348ccc
DM
1594 if (DECL_STATIC_CONSTRUCTOR (node->decl)
1595 || DECL_STATIC_DESTRUCTOR (node->decl))
9e97ff61
JH
1596 record_cdtor_fn (node);
1597 build_cdtor_fns ();
9771b263
DN
1598 static_ctors.release ();
1599 static_dtors.release ();
9e97ff61
JH
1600 return 0;
1601}
1602
1603/* Perform the pass when we have no ctors/dtors support
1604 or at LTO time to merge multiple constructors into single
1605 function. */
1606
1607static bool
1608gate_ipa_cdtor_merge (void)
1609{
1610 return !targetm.have_ctors_dtors || (optimize && in_lto_p);
1611}
1612
27a4cd48
DM
1613namespace {
1614
1615const pass_data pass_data_ipa_cdtor_merge =
9e97ff61 1616{
27a4cd48
DM
1617 IPA_PASS, /* type */
1618 "cdtor", /* name */
1619 OPTGROUP_NONE, /* optinfo_flags */
1620 true, /* has_gate */
1621 true, /* has_execute */
1622 TV_CGRAPHOPT, /* tv_id */
1623 0, /* properties_required */
1624 0, /* properties_provided */
1625 0, /* properties_destroyed */
1626 0, /* todo_flags_start */
1627 0, /* todo_flags_finish */
9e97ff61 1628};
27a4cd48
DM
1629
1630class pass_ipa_cdtor_merge : public ipa_opt_pass_d
1631{
1632public:
c3284718
RS
1633 pass_ipa_cdtor_merge (gcc::context *ctxt)
1634 : ipa_opt_pass_d (pass_data_ipa_cdtor_merge, ctxt,
1635 NULL, /* generate_summary */
1636 NULL, /* write_summary */
1637 NULL, /* read_summary */
1638 NULL, /* write_optimization_summary */
1639 NULL, /* read_optimization_summary */
1640 NULL, /* stmt_fixup */
1641 0, /* function_transform_todo_flags_start */
1642 NULL, /* function_transform */
1643 NULL) /* variable_transform */
27a4cd48
DM
1644 {}
1645
1646 /* opt_pass methods: */
1647 bool gate () { return gate_ipa_cdtor_merge (); }
1648 unsigned int execute () { return ipa_cdtor_merge (); }
1649
1650}; // class pass_ipa_cdtor_merge
1651
1652} // anon namespace
1653
1654ipa_opt_pass_d *
1655make_pass_ipa_cdtor_merge (gcc::context *ctxt)
1656{
1657 return new pass_ipa_cdtor_merge (ctxt);
1658}