]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cgraphunit.c
PR 67414 Better diagnostics on backtrace failure, gf_strerror bugfix
[thirdparty/gcc.git] / gcc / cgraphunit.c
CommitLineData
9c8305f8 1/* Driver of optimization process
5624e564 2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
1c4a429a
JH
3 Contributed by Jan Hubicka
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
1c4a429a
JH
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
1c4a429a 20
9c8305f8 21/* This module implements main driver of compilation process.
18c6ada9
JH
22
23 The main scope of this file is to act as an interface in between
9c8305f8 24 tree based frontends and the backend.
18c6ada9
JH
25
26 The front-end is supposed to use following functionality:
27
3dafb85c 28 - finalize_function
18c6ada9
JH
29
30 This function is called once front-end has parsed whole body of function
31 and it is certain that the function body nor the declaration will change.
32
efe75b6f
JH
33 (There is one exception needed for implementing GCC extern inline
34 function.)
18c6ada9 35
047ae098 36 - varpool_finalize_decl
18c6ada9 37
1ae58c30 38 This function has same behavior as the above but is used for static
18c6ada9
JH
39 variables.
40
65d630d4
JH
41 - add_asm_node
42
43 Insert new toplevel ASM statement
44
45 - finalize_compilation_unit
18c6ada9 46
efe75b6f
JH
47 This function is called once (source level) compilation unit is finalized
48 and it will no longer change.
18c6ada9 49
9c8305f8
JH
50 The symbol table is constructed starting from the trivially needed
51 symbols finalized by the frontend. Functions are lowered into
52 GIMPLE representation and callgraph/reference lists are constructed.
073a8998 53 Those are used to discover other necessary functions and variables.
9c8305f8
JH
54
55 At the end the bodies of unreachable functions are removed.
18c6ada9 56
efe75b6f 57 The function can be called multiple times when multiple source level
9c8305f8 58 compilation units are combined.
18c6ada9 59
65d630d4 60 - compile
18c6ada9 61
9c8305f8
JH
62 This passes control to the back-end. Optimizations are performed and
63 final assembler is generated. This is done in the following way. Note
64 that with link time optimization the process is split into three
65 stages (compile time, linktime analysis and parallel linktime as
66 indicated bellow).
67
68 Compile time:
69
70 1) Inter-procedural optimization.
71 (ipa_passes)
72
73 This part is further split into:
74
75 a) early optimizations. These are local passes executed in
76 the topological order on the callgraph.
77
78 The purpose of early optimiations is to optimize away simple
79 things that may otherwise confuse IP analysis. Very simple
80 propagation across the callgraph is done i.e. to discover
81 functions without side effects and simple inlining is performed.
82
83 b) early small interprocedural passes.
84
85 Those are interprocedural passes executed only at compilation
688010ba 86 time. These include, for example, transational memory lowering,
9c8305f8
JH
87 unreachable code removal and other simple transformations.
88
89 c) IP analysis stage. All interprocedural passes do their
90 analysis.
91
92 Interprocedural passes differ from small interprocedural
93 passes by their ability to operate across whole program
94 at linktime. Their analysis stage is performed early to
95 both reduce linking times and linktime memory usage by
96 not having to represent whole program in memory.
97
98 d) LTO sreaming. When doing LTO, everything important gets
99 streamed into the object file.
100
101 Compile time and or linktime analysis stage (WPA):
102
103 At linktime units gets streamed back and symbol table is
104 merged. Function bodies are not streamed in and not
105 available.
106 e) IP propagation stage. All IP passes execute their
107 IP propagation. This is done based on the earlier analysis
108 without having function bodies at hand.
109 f) Ltrans streaming. When doing WHOPR LTO, the program
110 is partitioned and streamed into multple object files.
18c6ada9 111
9c8305f8 112 Compile time and/or parallel linktime stage (ltrans)
18c6ada9 113
9c8305f8
JH
114 Each of the object files is streamed back and compiled
115 separately. Now the function bodies becomes available
116 again.
18c6ada9 117
9c8305f8
JH
118 2) Virtual clone materialization
119 (cgraph_materialize_clone)
18c6ada9 120
9c8305f8
JH
121 IP passes can produce copies of existing functoins (such
122 as versioned clones or inline clones) without actually
123 manipulating their bodies by creating virtual clones in
124 the callgraph. At this time the virtual clones are
125 turned into real functions
126 3) IP transformation
18c6ada9 127
9c8305f8
JH
128 All IP passes transform function bodies based on earlier
129 decision of the IP propagation.
18c6ada9 130
9c8305f8 131 4) late small IP passes
18c6ada9 132
9c8305f8 133 Simple IP passes working within single program partition.
18c6ada9 134
9c8305f8 135 5) Expansion
65d630d4 136 (expand_all_functions)
18c6ada9 137
9c8305f8
JH
138 At this stage functions that needs to be output into
139 assembler are identified and compiled in topological order
140 6) Output of variables and aliases
141 Now it is known what variable references was not optimized
142 out and thus all variables are output to the file.
18c6ada9 143
9c8305f8
JH
144 Note that with -fno-toplevel-reorder passes 5 and 6
145 are combined together in cgraph_output_in_order.
18c6ada9 146
9c8305f8
JH
147 Finally there are functions to manipulate the callgraph from
148 backend.
149 - cgraph_add_new_function is used to add backend produced
150 functions introduced after the unit is finalized.
151 The functions are enqueue for later processing and inserted
152 into callgraph with cgraph_process_new_functions.
9b3e897d 153
9c8305f8
JH
154 - cgraph_function_versioning
155
156 produces a copy of function into new one (a version)
157 and apply simple transformations
158*/
6674a6ce 159
1c4a429a
JH
160#include "config.h"
161#include "system.h"
162#include "coretypes.h"
c7131fb2 163#include "backend.h"
9fdcd34e 164#include "cfghooks.h"
1c4a429a 165#include "tree.h"
c7131fb2
AM
166#include "gimple.h"
167#include "rtl.h"
168#include "alias.h"
40e23961 169#include "fold-const.h"
d8a2d370
DN
170#include "varasm.h"
171#include "stor-layout.h"
172#include "stringpool.h"
c7131fb2 173#include "gimple-ssa.h"
0878843f 174#include "output.h"
e677a9d4 175#include "cfgcleanup.h"
2fb9a547
AM
176#include "internal-fn.h"
177#include "gimple-fold.h"
45b0be94 178#include "gimplify.h"
5be5c238 179#include "gimple-iterator.h"
18f429e2 180#include "gimplify-me.h"
442b4905
AM
181#include "tree-cfg.h"
182#include "tree-into-ssa.h"
7a300452 183#include "tree-ssa.h"
1c4a429a
JH
184#include "tree-inline.h"
185#include "langhooks.h"
1c4a429a
JH
186#include "toplev.h"
187#include "flags.h"
1c4a429a
JH
188#include "debug.h"
189#include "target.h"
dafc5b82 190#include "diagnostic.h"
b58b1157 191#include "params.h"
dc0bfe6a 192#include "intl.h"
c582198b
AM
193#include "cgraph.h"
194#include "alloc-pool.h"
dd912cb8 195#include "symbol-summary.h"
57fb5341 196#include "ipa-prop.h"
726a989a 197#include "tree-iterator.h"
b4861090 198#include "tree-pass.h"
a406865a 199#include "tree-dump.h"
9c8305f8 200#include "gimple-pretty-print.h"
cd9c7bd2 201#include "output.h"
3baf459d 202#include "coverage.h"
090fa0ab 203#include "plugin.h"
632b4f8e 204#include "ipa-inline.h"
af8bca3c 205#include "ipa-utils.h"
47c79d56 206#include "lto-streamer.h"
452aa9c5 207#include "except.h"
31ee20ba 208#include "cfgloop.h"
0878843f 209#include "regset.h" /* FIXME: For reg_obstack. */
315f8c0e
DM
210#include "context.h"
211#include "pass_manager.h"
1fe37220 212#include "tree-nested.h"
45852dcc 213#include "gimplify.h"
2b5f0895 214#include "dbgcnt.h"
d5e254e1 215#include "tree-chkp.h"
1f6be682 216#include "lto-section-names.h"
ec6fe917 217#include "omp-low.h"
1bf7c324 218#include "print-tree.h"
b58b1157 219
66058468
JH
220/* Queue of cgraph nodes scheduled to be added into cgraph. This is a
221 secondary queue used during optimization to accommodate passes that
222 may generate new functions that need to be optimized and expanded. */
31acf1bb 223vec<cgraph_node *> cgraph_new_nodes;
66058468 224
65d630d4
JH
225static void expand_all_functions (void);
226static void mark_functions_to_output (void);
877ab5e9 227static void handle_alias_pairs (void);
7dff32e6 228
6744a6ab
JH
229/* Used for vtable lookup in thunk adjusting. */
230static GTY (()) tree vtable_entry_type;
231
3dafb85c 232/* Determine if symbol declaration is needed. That is, visible to something
edb983b2
JH
233 either outside this translation unit, something magic in the system
234 configury */
235bool
3dafb85c 236symtab_node::needed_p (void)
8dafba3c 237{
ead84f73
JH
238 /* Double check that no one output the function into assembly file
239 early. */
240 gcc_checking_assert (!DECL_ASSEMBLER_NAME_SET_P (decl)
40a7fe1e 241 || !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)));
e7d6beb0 242
3dafb85c 243 if (!definition)
edb983b2 244 return false;
a1d31187 245
edb983b2
JH
246 if (DECL_EXTERNAL (decl))
247 return false;
04f77d0f 248
edb983b2 249 /* If the user told us it is used, then it must be so. */
3dafb85c 250 if (force_output)
edb983b2
JH
251 return true;
252
253 /* ABI forced symbols are needed when they are external. */
3dafb85c 254 if (forced_by_abi && TREE_PUBLIC (decl))
edb983b2
JH
255 return true;
256
1bf7c324 257 /* Keep constructors, destructors and virtual functions. */
edb983b2
JH
258 if (TREE_CODE (decl) == FUNCTION_DECL
259 && (DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl)))
260 return true;
261
262 /* Externally visible variables must be output. The exception is
263 COMDAT variables that must be output only when they are needed. */
264 if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
8dafba3c
RH
265 return true;
266
8dafba3c
RH
267 return false;
268}
269
b4d05578
BS
270/* Head and terminator of the queue of nodes to be processed while building
271 callgraph. */
66058468 272
b4d05578
BS
273static symtab_node symtab_terminator;
274static symtab_node *queued_nodes = &symtab_terminator;
66058468 275
b4d05578 276/* Add NODE to queue starting at QUEUED_NODES.
66058468
JH
277 The queue is linked via AUX pointers and terminated by pointer to 1. */
278
279static void
5e20cdc9 280enqueue_node (symtab_node *node)
66058468 281{
67348ccc 282 if (node->aux)
66058468 283 return;
b4d05578
BS
284 gcc_checking_assert (queued_nodes);
285 node->aux = queued_nodes;
286 queued_nodes = node;
66058468
JH
287}
288
d60ab196 289/* Process CGRAPH_NEW_FUNCTIONS and perform actions necessary to add these
f45e0ad1
JH
290 functions into callgraph in a way so they look like ordinary reachable
291 functions inserted into callgraph already at construction time. */
292
b4d05578 293void
3dafb85c 294symbol_table::process_new_functions (void)
f45e0ad1 295{
f45e0ad1 296 tree fndecl;
f45e0ad1 297
31acf1bb 298 if (!cgraph_new_nodes.exists ())
b4d05578 299 return;
31acf1bb 300
877ab5e9 301 handle_alias_pairs ();
f45e0ad1
JH
302 /* Note that this queue may grow as its being processed, as the new
303 functions may generate new ones. */
31acf1bb 304 for (unsigned i = 0; i < cgraph_new_nodes.length (); i++)
f45e0ad1 305 {
31acf1bb 306 cgraph_node *node = cgraph_new_nodes[i];
67348ccc 307 fndecl = node->decl;
3dafb85c 308 switch (state)
f45e0ad1 309 {
3dafb85c 310 case CONSTRUCTION:
f45e0ad1
JH
311 /* At construction time we just need to finalize function and move
312 it into reachable functions list. */
313
3dafb85c
ML
314 cgraph_node::finalize_function (fndecl, false);
315 call_cgraph_insertion_hooks (node);
67348ccc 316 enqueue_node (node);
f45e0ad1
JH
317 break;
318
3dafb85c
ML
319 case IPA:
320 case IPA_SSA:
17e0fc92 321 case IPA_SSA_AFTER_INLINING:
f45e0ad1
JH
322 /* When IPA optimization already started, do all essential
323 transformations that has been already performed on the whole
324 cgraph but not on this function. */
325
726a989a 326 gimple_register_cfg_hooks ();
67348ccc 327 if (!node->analyzed)
d52f5295 328 node->analyze ();
f45e0ad1 329 push_cfun (DECL_STRUCT_FUNCTION (fndecl));
17e0fc92 330 if ((state == IPA_SSA || state == IPA_SSA_AFTER_INLINING)
7a388ee4 331 && !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
f7695dbf 332 g->get_passes ()->execute_early_local_passes ();
9a1e784a 333 else if (inline_summaries != NULL)
632b4f8e 334 compute_inline_parameters (node, true);
f45e0ad1
JH
335 free_dominance_info (CDI_POST_DOMINATORS);
336 free_dominance_info (CDI_DOMINATORS);
337 pop_cfun ();
82afdc6f 338 call_cgraph_insertion_hooks (node);
f45e0ad1
JH
339 break;
340
3dafb85c 341 case EXPANSION:
f45e0ad1
JH
342 /* Functions created during expansion shall be compiled
343 directly. */
257eb6e3 344 node->process = 0;
3dafb85c
ML
345 call_cgraph_insertion_hooks (node);
346 node->expand ();
f45e0ad1
JH
347 break;
348
349 default:
350 gcc_unreachable ();
351 break;
352 }
353 }
31acf1bb
ML
354
355 cgraph_new_nodes.release ();
f45e0ad1
JH
356}
357
d71cc23f
JH
358/* As an GCC extension we allow redefinition of the function. The
359 semantics when both copies of bodies differ is not well defined.
360 We replace the old body with new body so in unit at a time mode
361 we always use new body, while in normal mode we may end up with
362 old body inlined into some functions and new body expanded and
363 inlined in others.
364
365 ??? It may make more sense to use one body for inlining and other
366 body for expanding the function but this is difficult to do. */
367
e70670cf 368void
d52f5295 369cgraph_node::reset (void)
d71cc23f 370{
d52f5295 371 /* If process is set, then we have already begun whole-unit analysis.
7e8b322a
JH
372 This is *not* testing for whether we've already emitted the function.
373 That case can be sort-of legitimately seen with real function redefinition
374 errors. I would argue that the front end should never present us with
375 such a case, but don't enforce that for now. */
d52f5295 376 gcc_assert (!process);
d71cc23f
JH
377
378 /* Reset our data structures so we can analyze the function again. */
d52f5295
ML
379 memset (&local, 0, sizeof (local));
380 memset (&global, 0, sizeof (global));
381 memset (&rtl, 0, sizeof (rtl));
382 analyzed = false;
383 definition = false;
384 alias = false;
385 weakref = false;
386 cpp_implicit_alias = false;
387
388 remove_callees ();
389 remove_all_references ();
d71cc23f 390}
d853a20e 391
d7438551
AH
392/* Return true when there are references to the node. INCLUDE_SELF is
393 true if a self reference counts as a reference. */
838ff415 394
3dafb85c 395bool
d7438551 396symtab_node::referred_to_p (bool include_self)
838ff415 397{
3dafb85c 398 ipa_ref *ref = NULL;
838ff415 399
073a8998 400 /* See if there are any references at all. */
3dafb85c 401 if (iterate_referring (0, ref))
838ff415 402 return true;
65d630d4 403 /* For functions check also calls. */
3dafb85c 404 cgraph_node *cn = dyn_cast <cgraph_node *> (this);
5d59b5e1 405 if (cn && cn->callers)
d7438551
AH
406 {
407 if (include_self)
408 return true;
409 for (cgraph_edge *e = cn->callers; e; e = e->next_caller)
410 if (e->caller != this)
411 return true;
412 }
838ff415
JH
413 return false;
414}
415
6b00c969 416/* DECL has been parsed. Take it, queue it, compile it at the whim of the
15682f24 417 logic in effect. If NO_COLLECT is true, then our caller cannot stand to have
6b00c969
RH
418 the garbage collector run at the moment. We would need to either create
419 a new GC context, or just not compile right now. */
1c4a429a
JH
420
421void
3dafb85c 422cgraph_node::finalize_function (tree decl, bool no_collect)
1c4a429a 423{
3dafb85c 424 cgraph_node *node = cgraph_node::get_create (decl);
1c4a429a 425
67348ccc 426 if (node->definition)
b125ad45 427 {
15682f24
MJ
428 /* Nested functions should only be defined once. */
429 gcc_assert (!DECL_CONTEXT (decl)
430 || TREE_CODE (DECL_CONTEXT (decl)) != FUNCTION_DECL);
d52f5295 431 node->reset ();
b125ad45
JH
432 node->local.redefined_extern_inline = true;
433 }
6b00c969 434
6a1e352e
L
435 /* Set definition first before calling notice_global_symbol so that
436 it is available to notice_global_symbol. */
67348ccc 437 node->definition = true;
6a1e352e 438 notice_global_symbol (decl);
e21aff8a 439 node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
1c4a429a 440
ead84f73
JH
441 /* With -fkeep-inline-functions we are keeping all inline functions except
442 for extern inline ones. */
443 if (flag_keep_inline_functions
444 && DECL_DECLARED_INLINE_P (decl)
445 && !DECL_EXTERNAL (decl)
446 && !DECL_DISREGARD_INLINE_LIMITS (decl))
67348ccc 447 node->force_output = 1;
8dafba3c 448
ead84f73
JH
449 /* When not optimizing, also output the static functions. (see
450 PR24561), but don't do so for always_inline functions, functions
451 declared inline and nested functions. These were optimized out
452 in the original implementation and it is unclear whether we want
453 to change the behavior here. */
2bf86c84 454 if ((!opt_for_fn (decl, optimize)
67348ccc 455 && !node->cpp_implicit_alias
ead84f73
JH
456 && !DECL_DISREGARD_INLINE_LIMITS (decl)
457 && !DECL_DECLARED_INLINE_P (decl)
458 && !(DECL_CONTEXT (decl)
459 && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL))
460 && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
67348ccc 461 node->force_output = 1;
ead84f73 462
8dafba3c 463 /* If we've not yet emitted decl, tell the debug info about it. */
6b00c969 464 if (!TREE_ASM_WRITTEN (decl))
8dafba3c 465 (*debug_hooks->deferred_inline_function) (decl);
d173e685 466
15682f24 467 if (!no_collect)
7e8b322a 468 ggc_collect ();
838ff415 469
3dafb85c
ML
470 if (symtab->state == CONSTRUCTION
471 && (node->needed_p () || node->referred_to_p ()))
67348ccc 472 enqueue_node (node);
1c4a429a
JH
473}
474
452aa9c5 475/* Add the function FNDECL to the call graph.
3dafb85c 476 Unlike finalize_function, this function is intended to be used
452aa9c5
RG
477 by middle end and allows insertion of new function at arbitrary point
478 of compilation. The function can be either in high, low or SSA form
479 GIMPLE.
480
481 The function is assumed to be reachable and have address taken (so no
482 API breaking optimizations are performed on it).
483
484 Main work done by this function is to enqueue the function for later
485 processing to avoid need the passes to be re-entrant. */
486
487void
d52f5295 488cgraph_node::add_new_function (tree fndecl, bool lowered)
452aa9c5 489{
315f8c0e 490 gcc::pass_manager *passes = g->get_passes ();
3dafb85c 491 cgraph_node *node;
9452ef06
TV
492
493 if (dump_file)
494 {
495 struct function *fn = DECL_STRUCT_FUNCTION (fndecl);
496 const char *function_type = ((gimple_has_body_p (fndecl))
497 ? (lowered
498 ? (gimple_in_ssa_p (fn)
499 ? "ssa gimple"
500 : "low gimple")
501 : "high gimple")
502 : "to-be-gimplified");
503 fprintf (dump_file,
504 "Added new %s function %s to callgraph\n",
505 function_type,
506 fndecl_name (fndecl));
507 }
508
3dafb85c 509 switch (symtab->state)
452aa9c5 510 {
3dafb85c
ML
511 case PARSING:
512 cgraph_node::finalize_function (fndecl, false);
66058468 513 break;
3dafb85c 514 case CONSTRUCTION:
452aa9c5 515 /* Just enqueue function to be processed at nearest occurrence. */
d52f5295 516 node = cgraph_node::get_create (fndecl);
452aa9c5
RG
517 if (lowered)
518 node->lowered = true;
31acf1bb 519 cgraph_new_nodes.safe_push (node);
452aa9c5
RG
520 break;
521
3dafb85c
ML
522 case IPA:
523 case IPA_SSA:
17e0fc92 524 case IPA_SSA_AFTER_INLINING:
3dafb85c 525 case EXPANSION:
452aa9c5
RG
526 /* Bring the function into finalized state and enqueue for later
527 analyzing and compilation. */
d52f5295 528 node = cgraph_node::get_create (fndecl);
452aa9c5 529 node->local.local = false;
67348ccc
DM
530 node->definition = true;
531 node->force_output = true;
3dafb85c 532 if (!lowered && symtab->state == EXPANSION)
452aa9c5
RG
533 {
534 push_cfun (DECL_STRUCT_FUNCTION (fndecl));
452aa9c5
RG
535 gimple_register_cfg_hooks ();
536 bitmap_obstack_initialize (NULL);
2cbf2d95 537 execute_pass_list (cfun, passes->all_lowering_passes);
f7695dbf 538 passes->execute_early_local_passes ();
452aa9c5
RG
539 bitmap_obstack_release (NULL);
540 pop_cfun ();
452aa9c5
RG
541
542 lowered = true;
543 }
544 if (lowered)
545 node->lowered = true;
31acf1bb 546 cgraph_new_nodes.safe_push (node);
452aa9c5
RG
547 break;
548
3dafb85c 549 case FINISHED:
452aa9c5
RG
550 /* At the very end of compilation we have to do all the work up
551 to expansion. */
d52f5295 552 node = cgraph_node::create (fndecl);
452aa9c5
RG
553 if (lowered)
554 node->lowered = true;
67348ccc 555 node->definition = true;
d52f5295 556 node->analyze ();
452aa9c5 557 push_cfun (DECL_STRUCT_FUNCTION (fndecl));
452aa9c5
RG
558 gimple_register_cfg_hooks ();
559 bitmap_obstack_initialize (NULL);
560 if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
f7695dbf 561 g->get_passes ()->execute_early_local_passes ();
452aa9c5 562 bitmap_obstack_release (NULL);
452aa9c5 563 pop_cfun ();
3dafb85c 564 node->expand ();
452aa9c5
RG
565 break;
566
567 default:
568 gcc_unreachable ();
569 }
570
571 /* Set a personality if required and we already passed EH lowering. */
572 if (lowered
573 && (function_needs_eh_personality (DECL_STRUCT_FUNCTION (fndecl))
574 == eh_personality_lang))
575 DECL_FUNCTION_PERSONALITY (fndecl) = lang_hooks.eh_personality ();
576}
577
e767b5be 578/* Analyze the function scheduled to be output. */
d52f5295
ML
579void
580cgraph_node::analyze (void)
e767b5be 581{
d52f5295 582 tree decl = this->decl;
9c8305f8
JH
583 location_t saved_loc = input_location;
584 input_location = DECL_SOURCE_LOCATION (decl);
e767b5be 585
d52f5295 586 if (thunk.thunk_p)
c47d0034 587 {
9641fab3
JH
588 cgraph_node *t = cgraph_node::get (thunk.alias);
589
590 create_edge (t, NULL, 0, CGRAPH_FREQ_BASE);
591 /* Target code in expand_thunk may need the thunk's target
592 to be analyzed, so recurse here. */
593 if (!t->analyzed)
594 t->analyze ();
595 if (t->alias)
596 {
597 t = t->get_alias_target ();
598 if (!t->analyzed)
599 t->analyze ();
600 }
d52f5295 601 if (!expand_thunk (false, false))
afdec9bd 602 {
d52f5295 603 thunk.alias = NULL;
afdec9bd
JH
604 return;
605 }
d52f5295 606 thunk.alias = NULL;
c47d0034 607 }
d52f5295
ML
608 if (alias)
609 resolve_alias (cgraph_node::get (alias_target));
610 else if (dispatcher_function)
3649b9b7
ST
611 {
612 /* Generate the dispatcher body of multi-versioned functions. */
3dafb85c 613 cgraph_function_version_info *dispatcher_version_info
d52f5295 614 = function_version ();
3649b9b7
ST
615 if (dispatcher_version_info != NULL
616 && (dispatcher_version_info->dispatcher_resolver
617 == NULL_TREE))
618 {
619 tree resolver = NULL_TREE;
620 gcc_assert (targetm.generate_version_dispatcher_body);
d52f5295 621 resolver = targetm.generate_version_dispatcher_body (this);
3649b9b7
ST
622 gcc_assert (resolver != NULL_TREE);
623 }
624 }
c47d0034
JH
625 else
626 {
c47d0034 627 push_cfun (DECL_STRUCT_FUNCTION (decl));
a406865a 628
d52f5295 629 assign_assembler_name_if_neeeded (decl);
0e0a1359 630
c47d0034
JH
631 /* Make sure to gimplify bodies only once. During analyzing a
632 function we lower it, which will require gimplified nested
633 functions, so we can end up here with an already gimplified
634 body. */
355a7673 635 if (!gimple_has_body_p (decl))
c47d0034 636 gimplify_function_tree (decl);
a406865a 637
26eb69c6 638 /* Lower the function. */
d52f5295 639 if (!lowered)
26eb69c6 640 {
d52f5295
ML
641 if (nested)
642 lower_nested_functions (decl);
643 gcc_assert (!nested);
26eb69c6
RG
644
645 gimple_register_cfg_hooks ();
646 bitmap_obstack_initialize (NULL);
2cbf2d95 647 execute_pass_list (cfun, g->get_passes ()->all_lowering_passes);
26eb69c6
RG
648 free_dominance_info (CDI_POST_DOMINATORS);
649 free_dominance_info (CDI_DOMINATORS);
650 compact_blocks ();
651 bitmap_obstack_release (NULL);
d52f5295 652 lowered = true;
26eb69c6
RG
653 }
654
c47d0034
JH
655 pop_cfun ();
656 }
d52f5295 657 analyzed = true;
e767b5be 658
9c8305f8 659 input_location = saved_loc;
e767b5be
JH
660}
661
39e2db00
JH
662/* C++ frontend produce same body aliases all over the place, even before PCH
663 gets streamed out. It relies on us linking the aliases with their function
664 in order to do the fixups, but ipa-ref is not PCH safe. Consequentely we
665 first produce aliases without links, but once C++ FE is sure he won't sream
666 PCH we build the links via this function. */
667
668void
3dafb85c 669symbol_table::process_same_body_aliases (void)
39e2db00 670{
5e20cdc9 671 symtab_node *node;
40a7fe1e 672 FOR_EACH_SYMBOL (node)
67348ccc 673 if (node->cpp_implicit_alias && !node->analyzed)
d52f5295
ML
674 node->resolve_alias
675 (TREE_CODE (node->alias_target) == VAR_DECL
9041d2e6 676 ? (symtab_node *)varpool_node::get_create (node->alias_target)
d52f5295 677 : (symtab_node *)cgraph_node::get_create (node->alias_target));
40a7fe1e 678 cpp_implicit_aliases_done = true;
39e2db00
JH
679}
680
768e3c60
RG
681/* Process attributes common for vars and functions. */
682
683static void
7861b648 684process_common_attributes (symtab_node *node, tree decl)
768e3c60
RG
685{
686 tree weakref = lookup_attribute ("weakref", DECL_ATTRIBUTES (decl));
687
688 if (weakref && !lookup_attribute ("alias", DECL_ATTRIBUTES (decl)))
689 {
690 warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes,
691 "%<weakref%> attribute should be accompanied with"
692 " an %<alias%> attribute");
693 DECL_WEAK (decl) = 0;
779d4b91
JH
694 DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
695 DECL_ATTRIBUTES (decl));
768e3c60 696 }
7861b648
AK
697
698 if (lookup_attribute ("no_reorder", DECL_ATTRIBUTES (decl)))
699 node->no_reorder = 1;
768e3c60
RG
700}
701
386b46cf
JH
702/* Look for externally_visible and used attributes and mark cgraph nodes
703 accordingly.
704
705 We cannot mark the nodes at the point the attributes are processed (in
706 handle_*_attribute) because the copy of the declarations available at that
707 point may not be canonical. For example, in:
708
709 void f();
710 void f() __attribute__((used));
711
712 the declaration we see in handle_used_attribute will be the second
713 declaration -- but the front end will subsequently merge that declaration
714 with the original declaration and discard the second declaration.
715
3dafb85c 716 Furthermore, we can't mark these nodes in finalize_function because:
386b46cf
JH
717
718 void f() {}
719 void f() __attribute__((externally_visible));
720
721 is valid.
722
723 So, we walk the nodes at the end of the translation unit, applying the
724 attributes at that point. */
725
726static void
3dafb85c 727process_function_and_variable_attributes (cgraph_node *first,
2c8326a5 728 varpool_node *first_var)
386b46cf 729{
3dafb85c 730 cgraph_node *node;
2c8326a5 731 varpool_node *vnode;
386b46cf 732
3dafb85c
ML
733 for (node = symtab->first_function (); node != first;
734 node = symtab->next_function (node))
386b46cf 735 {
67348ccc 736 tree decl = node->decl;
b42186f1 737 if (DECL_PRESERVE_P (decl))
d52f5295 738 node->mark_force_output ();
9d602c59 739 else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
386b46cf 740 {
67348ccc
DM
741 if (! TREE_PUBLIC (node->decl))
742 warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
c5d75364
MLI
743 "%<externally_visible%>"
744 " attribute have effect only on public objects");
386b46cf 745 }
779d4b91 746 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
67348ccc 747 && (node->definition && !node->alias))
779d4b91 748 {
67348ccc 749 warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
779d4b91
JH
750 "%<weakref%> attribute ignored"
751 " because function is defined");
752 DECL_WEAK (decl) = 0;
753 DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
754 DECL_ATTRIBUTES (decl));
755 }
c9fc06dc
CB
756
757 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (decl))
758 && !DECL_DECLARED_INLINE_P (decl)
759 /* redefining extern inline function makes it DECL_UNINLINABLE. */
760 && !DECL_UNINLINABLE (decl))
761 warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes,
762 "always_inline function might not be inlinable");
763
7861b648 764 process_common_attributes (node, decl);
386b46cf 765 }
3dafb85c
ML
766 for (vnode = symtab->first_variable (); vnode != first_var;
767 vnode = symtab->next_variable (vnode))
386b46cf 768 {
67348ccc 769 tree decl = vnode->decl;
6649df51 770 if (DECL_EXTERNAL (decl)
6a6dac52 771 && DECL_INITIAL (decl))
9041d2e6 772 varpool_node::finalize_decl (decl);
b42186f1 773 if (DECL_PRESERVE_P (decl))
67348ccc 774 vnode->force_output = true;
9d602c59 775 else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
386b46cf 776 {
67348ccc
DM
777 if (! TREE_PUBLIC (vnode->decl))
778 warning_at (DECL_SOURCE_LOCATION (vnode->decl), OPT_Wattributes,
c5d75364
MLI
779 "%<externally_visible%>"
780 " attribute have effect only on public objects");
386b46cf 781 }
779d4b91 782 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
67348ccc 783 && vnode->definition
779d4b91
JH
784 && DECL_INITIAL (decl))
785 {
67348ccc 786 warning_at (DECL_SOURCE_LOCATION (vnode->decl), OPT_Wattributes,
779d4b91
JH
787 "%<weakref%> attribute ignored"
788 " because variable is initialized");
789 DECL_WEAK (decl) = 0;
790 DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
791 DECL_ATTRIBUTES (decl));
792 }
7861b648 793 process_common_attributes (vnode, decl);
386b46cf
JH
794 }
795}
796
66058468
JH
797/* Mark DECL as finalized. By finalizing the declaration, frontend instruct the
798 middle end to output the variable to asm file, if needed or externally
799 visible. */
800
801void
9041d2e6 802varpool_node::finalize_decl (tree decl)
66058468 803{
9041d2e6 804 varpool_node *node = varpool_node::get_create (decl);
66058468 805
387df871 806 gcc_assert (TREE_STATIC (decl) || DECL_EXTERNAL (decl));
66058468 807
67348ccc 808 if (node->definition)
66058468 809 return;
6a1e352e
L
810 /* Set definition first before calling notice_global_symbol so that
811 it is available to notice_global_symbol. */
67348ccc 812 node->definition = true;
6a1e352e 813 notice_global_symbol (decl);
66058468
JH
814 if (TREE_THIS_VOLATILE (decl) || DECL_PRESERVE_P (decl)
815 /* Traditionally we do not eliminate static variables when not
816 optimizing and when not doing toplevel reoder. */
7861b648
AK
817 || node->no_reorder
818 || ((!flag_toplevel_reorder
819 && !DECL_COMDAT (node->decl)
820 && !DECL_ARTIFICIAL (node->decl))))
67348ccc 821 node->force_output = true;
66058468 822
3dafb85c
ML
823 if (symtab->state == CONSTRUCTION
824 && (node->needed_p () || node->referred_to_p ()))
67348ccc 825 enqueue_node (node);
3dafb85c 826 if (symtab->state >= IPA_SSA)
9041d2e6 827 node->analyze ();
0d6bf48c
JH
828 /* Some frontends produce various interface variables after compilation
829 finished. */
3dafb85c
ML
830 if (symtab->state == FINISHED
831 || (!flag_toplevel_reorder
832 && symtab->state == EXPANSION))
9041d2e6 833 node->assemble_decl ();
d5e254e1
IE
834
835 if (DECL_INITIAL (decl))
836 chkp_register_var_initializer (decl);
66058468
JH
837}
838
e18412fc
JH
839/* EDGE is an polymorphic call. Mark all possible targets as reachable
840 and if there is only one target, perform trivial devirtualization.
841 REACHABLE_CALL_TARGETS collects target lists we already walked to
842 avoid udplicate work. */
843
844static void
6e2830c3 845walk_polymorphic_call_targets (hash_set<void *> *reachable_call_targets,
3dafb85c 846 cgraph_edge *edge)
e18412fc
JH
847{
848 unsigned int i;
849 void *cache_token;
850 bool final;
851 vec <cgraph_node *>targets
852 = possible_polymorphic_call_targets
853 (edge, &final, &cache_token);
854
6e2830c3 855 if (!reachable_call_targets->add (cache_token))
e18412fc 856 {
3dafb85c 857 if (symtab->dump_file)
e18412fc 858 dump_possible_polymorphic_call_targets
3dafb85c 859 (symtab->dump_file, edge);
e18412fc 860
c3284718 861 for (i = 0; i < targets.length (); i++)
e18412fc
JH
862 {
863 /* Do not bother to mark virtual methods in anonymous namespace;
864 either we will find use of virtual table defining it, or it is
865 unused. */
67348ccc 866 if (targets[i]->definition
e18412fc 867 && TREE_CODE
67348ccc 868 (TREE_TYPE (targets[i]->decl))
e18412fc
JH
869 == METHOD_TYPE
870 && !type_in_anonymous_namespace_p
70e7f2a2
JH
871 (TYPE_METHOD_BASETYPE (TREE_TYPE (targets[i]->decl))))
872 enqueue_node (targets[i]);
e18412fc
JH
873 }
874 }
875
876 /* Very trivial devirtualization; when the type is
877 final or anonymous (so we know all its derivation)
878 and there is only one possible virtual call target,
879 make the edge direct. */
880 if (final)
881 {
2b5f0895 882 if (targets.length () <= 1 && dbg_cnt (devirt))
e18412fc 883 {
3462aa02
JH
884 cgraph_node *target;
885 if (targets.length () == 1)
886 target = targets[0];
887 else
d52f5295
ML
888 target = cgraph_node::create
889 (builtin_decl_implicit (BUILT_IN_UNREACHABLE));
3462aa02 890
3dafb85c 891 if (symtab->dump_file)
e18412fc 892 {
3dafb85c 893 fprintf (symtab->dump_file,
e18412fc 894 "Devirtualizing call: ");
3dafb85c 895 print_gimple_stmt (symtab->dump_file,
e18412fc
JH
896 edge->call_stmt, 0,
897 TDF_SLIM);
898 }
2b5f0895
XDL
899 if (dump_enabled_p ())
900 {
807b7d62 901 location_t locus = gimple_location_safe (edge->call_stmt);
2b5f0895
XDL
902 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus,
903 "devirtualizing call in %s to %s\n",
904 edge->caller->name (), target->name ());
905 }
906
3dafb85c
ML
907 edge->make_direct (target);
908 edge->redirect_call_stmt_to_callee ();
d5e254e1
IE
909
910 /* Call to __builtin_unreachable shouldn't be instrumented. */
911 if (!targets.length ())
912 gimple_call_set_with_bounds (edge->call_stmt, false);
913
3dafb85c 914 if (symtab->dump_file)
e18412fc 915 {
3dafb85c 916 fprintf (symtab->dump_file,
e18412fc 917 "Devirtualized as: ");
3dafb85c 918 print_gimple_stmt (symtab->dump_file,
e18412fc
JH
919 edge->call_stmt, 0,
920 TDF_SLIM);
921 }
922 }
923 }
924}
925
5d59b5e1 926
66058468
JH
927/* Discover all functions and variables that are trivially needed, analyze
928 them as well as all functions and variables referred by them */
3edf64aa
DM
929static cgraph_node *first_analyzed;
930static varpool_node *first_analyzed_var;
1c4a429a 931
d7438551
AH
932/* FIRST_TIME is set to TRUE for the first time we are called for a
933 translation unit from finalize_compilation_unit() or false
934 otherwise. */
935
151e6f24 936static void
d7438551 937analyze_functions (bool first_time)
1c4a429a 938{
cd9c7bd2 939 /* Keep track of already processed nodes when called multiple times for
aabcd309 940 intermodule optimization. */
3dafb85c 941 cgraph_node *first_handled = first_analyzed;
2c8326a5 942 varpool_node *first_handled_var = first_analyzed_var;
6e2830c3 943 hash_set<void *> reachable_call_targets;
66058468 944
5e20cdc9
DM
945 symtab_node *node;
946 symtab_node *next;
66058468 947 int i;
3dafb85c 948 ipa_ref *ref;
66058468 949 bool changed = true;
4f90d3e0 950 location_t saved_loc = input_location;
1c4a429a 951
1389294c 952 bitmap_obstack_initialize (NULL);
3dafb85c 953 symtab->state = CONSTRUCTION;
4f90d3e0 954 input_location = UNKNOWN_LOCATION;
1c4a429a 955
40a7fe1e
JH
956 /* Ugly, but the fixup can not happen at a time same body alias is created;
957 C++ FE is confused about the COMDAT groups being right. */
3dafb85c 958 if (symtab->cpp_implicit_aliases_done)
40a7fe1e 959 FOR_EACH_SYMBOL (node)
67348ccc 960 if (node->cpp_implicit_alias)
d52f5295 961 node->fixup_same_cpp_alias_visibility (node->get_alias_target ());
2bf86c84 962 build_type_inheritance_graph ();
40a7fe1e 963
66058468
JH
964 /* Analysis adds static variables that in turn adds references to new functions.
965 So we need to iterate the process until it stabilize. */
966 while (changed)
1c4a429a 967 {
66058468
JH
968 changed = false;
969 process_function_and_variable_attributes (first_analyzed,
970 first_analyzed_var);
971
972 /* First identify the trivially needed symbols. */
3dafb85c 973 for (node = symtab->first_symbol ();
67348ccc
DM
974 node != first_analyzed
975 && node != first_analyzed_var; node = node->next)
d71cc23f 976 {
d67ff7b7
JM
977 /* Convert COMDAT group designators to IDENTIFIER_NODEs. */
978 node->get_comdat_group_id ();
3dafb85c 979 if (node->needed_p ())
66058468
JH
980 {
981 enqueue_node (node);
3dafb85c
ML
982 if (!changed && symtab->dump_file)
983 fprintf (symtab->dump_file, "Trivially needed symbols:");
66058468 984 changed = true;
3dafb85c
ML
985 if (symtab->dump_file)
986 fprintf (symtab->dump_file, " %s", node->asm_name ());
987 if (!changed && symtab->dump_file)
988 fprintf (symtab->dump_file, "\n");
66058468 989 }
67348ccc
DM
990 if (node == first_analyzed
991 || node == first_analyzed_var)
66058468 992 break;
d71cc23f 993 }
3dafb85c
ML
994 symtab->process_new_functions ();
995 first_analyzed_var = symtab->first_variable ();
996 first_analyzed = symtab->first_function ();
cd4dea62 997
3dafb85c
ML
998 if (changed && symtab->dump_file)
999 fprintf (symtab->dump_file, "\n");
8dafba3c 1000
66058468
JH
1001 /* Lower representation, build callgraph edges and references for all trivially
1002 needed symbols and all symbols referred by them. */
b4d05578 1003 while (queued_nodes != &symtab_terminator)
b66887e4 1004 {
66058468 1005 changed = true;
b4d05578
BS
1006 node = queued_nodes;
1007 queued_nodes = (symtab_node *)queued_nodes->aux;
7de90a6c 1008 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
67348ccc 1009 if (cnode && cnode->definition)
66058468 1010 {
3dafb85c 1011 cgraph_edge *edge;
67348ccc 1012 tree decl = cnode->decl;
66058468 1013
5d59b5e1
LC
1014 /* ??? It is possible to create extern inline function
1015 and later using weak alias attribute to kill its body.
1016 See gcc.c-torture/compile/20011119-1.c */
66058468 1017 if (!DECL_STRUCT_FUNCTION (decl)
67348ccc 1018 && !cnode->alias
3649b9b7
ST
1019 && !cnode->thunk.thunk_p
1020 && !cnode->dispatcher_function)
66058468 1021 {
d52f5295 1022 cnode->reset ();
66058468
JH
1023 cnode->local.redefined_extern_inline = true;
1024 continue;
1025 }
b66887e4 1026
67348ccc 1027 if (!cnode->analyzed)
d52f5295 1028 cnode->analyze ();
6b20f353 1029
66058468 1030 for (edge = cnode->callees; edge; edge = edge->next_callee)
1bf7c324
JH
1031 if (edge->callee->definition
1032 && (!DECL_EXTERNAL (edge->callee->decl)
1033 /* When not optimizing, do not try to analyze extern
1034 inline functions. Doing so is pointless. */
1035 || opt_for_fn (edge->callee->decl, optimize)
1036 /* Weakrefs needs to be preserved. */
1037 || edge->callee->alias
1038 /* always_inline functions are inlined aven at -O0. */
1039 || lookup_attribute
1040 ("always_inline",
1041 DECL_ATTRIBUTES (edge->callee->decl))
1042 /* Multiversioned functions needs the dispatcher to
1043 be produced locally even for extern functions. */
1044 || edge->callee->function_version ()))
67348ccc 1045 enqueue_node (edge->callee);
2bf86c84
JH
1046 if (opt_for_fn (cnode->decl, optimize)
1047 && opt_for_fn (cnode->decl, flag_devirtualize))
eefe9a99 1048 {
3dafb85c 1049 cgraph_edge *next;
e18412fc
JH
1050
1051 for (edge = cnode->indirect_calls; edge; edge = next)
c4be6568
JH
1052 {
1053 next = edge->next_callee;
1054 if (edge->indirect_info->polymorphic)
6e2830c3 1055 walk_polymorphic_call_targets (&reachable_call_targets,
e18412fc 1056 edge);
c4be6568 1057 }
eefe9a99 1058 }
66058468 1059
5d59b5e1
LC
1060 /* If decl is a clone of an abstract function,
1061 mark that abstract function so that we don't release its body.
1062 The DECL_INITIAL() of that abstract function declaration
1063 will be later needed to output debug info. */
66058468
JH
1064 if (DECL_ABSTRACT_ORIGIN (decl))
1065 {
3dafb85c 1066 cgraph_node *origin_node
c84495c0 1067 = cgraph_node::get_create (DECL_ABSTRACT_ORIGIN (decl));
c0c123ef 1068 origin_node->used_as_abstract_origin = true;
66058468 1069 }
66058468 1070 }
5d59b5e1
LC
1071 else
1072 {
7de90a6c 1073 varpool_node *vnode = dyn_cast <varpool_node *> (node);
67348ccc 1074 if (vnode && vnode->definition && !vnode->analyzed)
9041d2e6 1075 vnode->analyze ();
5d59b5e1 1076 }
66058468 1077
67348ccc 1078 if (node->same_comdat_group)
66058468 1079 {
5e20cdc9 1080 symtab_node *next;
67348ccc 1081 for (next = node->same_comdat_group;
66058468 1082 next != node;
67348ccc 1083 next = next->same_comdat_group)
1bf7c324
JH
1084 if (!next->comdat_local_p ())
1085 enqueue_node (next);
66058468 1086 }
d122681a 1087 for (i = 0; node->iterate_reference (i, ref); i++)
1bf7c324
JH
1088 if (ref->referred->definition
1089 && (!DECL_EXTERNAL (ref->referred->decl)
1090 || ((TREE_CODE (ref->referred->decl) != FUNCTION_DECL
1091 && optimize)
1092 || (TREE_CODE (ref->referred->decl) == FUNCTION_DECL
1093 && opt_for_fn (ref->referred->decl, optimize))
38c1b72f 1094 || node->alias
1bf7c324 1095 || ref->referred->alias)))
66058468 1096 enqueue_node (ref->referred);
3dafb85c 1097 symtab->process_new_functions ();
66058468 1098 }
1c4a429a 1099 }
2bf86c84 1100 update_type_inheritance_graph ();
8dafba3c 1101
564738df 1102 /* Collect entry points to the unit. */
3dafb85c 1103 if (symtab->dump_file)
1668aabc 1104 {
3dafb85c
ML
1105 fprintf (symtab->dump_file, "\n\nInitial ");
1106 symtab_node::dump_table (symtab->dump_file);
1668aabc 1107 }
7660e67e 1108
d7438551
AH
1109 if (first_time)
1110 {
1111 symtab_node *snode;
1112 FOR_EACH_SYMBOL (snode)
1113 check_global_declaration (snode->decl);
1114 }
1115
3dafb85c
ML
1116 if (symtab->dump_file)
1117 fprintf (symtab->dump_file, "\nRemoving unused symbols:");
1c4a429a 1118
3dafb85c 1119 for (node = symtab->first_symbol ();
67348ccc
DM
1120 node != first_handled
1121 && node != first_handled_var; node = next)
1c4a429a 1122 {
67348ccc 1123 next = node->next;
3dafb85c 1124 if (!node->aux && !node->referred_to_p ())
1c4a429a 1125 {
3dafb85c
ML
1126 if (symtab->dump_file)
1127 fprintf (symtab->dump_file, " %s", node->name ());
d7438551
AH
1128
1129 /* See if the debugger can use anything before the DECL
1130 passes away. Perhaps it can notice a DECL that is now a
1131 constant and can tag the early DIE with an appropriate
1132 attribute.
1133
1134 Otherwise, this is the last chance the debug_hooks have
1135 at looking at optimized away DECLs, since
1136 late_global_decl will subsequently be called from the
1137 contents of the now pruned symbol table. */
1138 if (!decl_function_context (node->decl))
1139 (*debug_hooks->late_global_decl) (node->decl);
1140
d52f5295 1141 node->remove ();
d71cc23f 1142 continue;
1c4a429a 1143 }
7de90a6c 1144 if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
66058468 1145 {
67348ccc 1146 tree decl = node->decl;
66058468 1147
67348ccc
DM
1148 if (cnode->definition && !gimple_has_body_p (decl)
1149 && !cnode->alias
66058468 1150 && !cnode->thunk.thunk_p)
d52f5295 1151 cnode->reset ();
66058468 1152
67348ccc
DM
1153 gcc_assert (!cnode->definition || cnode->thunk.thunk_p
1154 || cnode->alias
66058468 1155 || gimple_has_body_p (decl));
67348ccc 1156 gcc_assert (cnode->analyzed == cnode->definition);
66058468 1157 }
67348ccc 1158 node->aux = NULL;
1c4a429a 1159 }
67348ccc
DM
1160 for (;node; node = node->next)
1161 node->aux = NULL;
3dafb85c
ML
1162 first_analyzed = symtab->first_function ();
1163 first_analyzed_var = symtab->first_variable ();
1164 if (symtab->dump_file)
7d82fe7c 1165 {
3dafb85c
ML
1166 fprintf (symtab->dump_file, "\n\nReclaimed ");
1167 symtab_node::dump_table (symtab->dump_file);
7d82fe7c 1168 }
1389294c 1169 bitmap_obstack_release (NULL);
1c4a429a 1170 ggc_collect ();
d352b245
JH
1171 /* Initialize assembler name hash, in particular we want to trigger C++
1172 mangling and same body alias creation before we free DECL_ARGUMENTS
1173 used by it. */
1174 if (!seen_error ())
3dafb85c 1175 symtab->symtab_initialize_asm_name_hash ();
4f90d3e0
JH
1176
1177 input_location = saved_loc;
151e6f24
JH
1178}
1179
85ce9375
JH
1180/* Translate the ugly representation of aliases as alias pairs into nice
1181 representation in callgraph. We don't handle all cases yet,
4f219961 1182 unfortunately. */
85ce9375
JH
1183
1184static void
1185handle_alias_pairs (void)
1186{
1187 alias_pair *p;
1188 unsigned i;
85ce9375 1189
9771b263 1190 for (i = 0; alias_pairs && alias_pairs->iterate (i, &p);)
85ce9375 1191 {
3dafb85c 1192 symtab_node *target_node = symtab_node::get_for_asmname (p->target);
38e55ac9 1193
4f219961
EB
1194 /* Weakrefs with target not defined in current unit are easy to handle:
1195 they behave just as external variables except we need to note the
1196 alias flag to later output the weakref pseudo op into asm file. */
1197 if (!target_node
1198 && lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)) != NULL)
25e2c40d 1199 {
d52f5295 1200 symtab_node *node = symtab_node::get (p->decl);
40a7fe1e 1201 if (node)
e01c7cca 1202 {
67348ccc
DM
1203 node->alias_target = p->target;
1204 node->weakref = true;
1205 node->alias = true;
e01c7cca 1206 }
9771b263 1207 alias_pairs->unordered_remove (i);
38e55ac9 1208 continue;
25e2c40d 1209 }
38e55ac9 1210 else if (!target_node)
85ce9375 1211 {
38e55ac9 1212 error ("%q+D aliased to undefined symbol %qE", p->decl, p->target);
d52f5295 1213 symtab_node *node = symtab_node::get (p->decl);
4f219961 1214 if (node)
67348ccc 1215 node->alias = false;
9771b263 1216 alias_pairs->unordered_remove (i);
38e55ac9
JH
1217 continue;
1218 }
1219
67348ccc 1220 if (DECL_EXTERNAL (target_node->decl)
07250f0e
JH
1221 /* We use local aliases for C++ thunks to force the tailcall
1222 to bind locally. This is a hack - to keep it working do
1223 the following (which is not strictly correct). */
abbb94e6 1224 && (TREE_CODE (target_node->decl) != FUNCTION_DECL
67348ccc 1225 || ! DECL_VIRTUAL_P (target_node->decl))
07250f0e
JH
1226 && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
1227 {
1228 error ("%q+D aliased to external symbol %qE",
1229 p->decl, p->target);
1230 }
1231
38e55ac9 1232 if (TREE_CODE (p->decl) == FUNCTION_DECL
7de90a6c 1233 && target_node && is_a <cgraph_node *> (target_node))
38e55ac9 1234 {
3dafb85c 1235 cgraph_node *src_node = cgraph_node::get (p->decl);
67348ccc 1236 if (src_node && src_node->definition)
d52f5295
ML
1237 src_node->reset ();
1238 cgraph_node::create_alias (p->decl, target_node->decl);
9771b263 1239 alias_pairs->unordered_remove (i);
38e55ac9
JH
1240 }
1241 else if (TREE_CODE (p->decl) == VAR_DECL
7de90a6c 1242 && target_node && is_a <varpool_node *> (target_node))
38e55ac9 1243 {
9041d2e6 1244 varpool_node::create_alias (p->decl, target_node->decl);
9771b263 1245 alias_pairs->unordered_remove (i);
38e55ac9
JH
1246 }
1247 else
1248 {
1249 error ("%q+D alias in between function and variable is not supported",
1250 p->decl);
1251 warning (0, "%q+D aliased declaration",
67348ccc 1252 target_node->decl);
9771b263 1253 alias_pairs->unordered_remove (i);
85ce9375
JH
1254 }
1255 }
9771b263 1256 vec_free (alias_pairs);
85ce9375
JH
1257}
1258
5f1a9ebb 1259
1c4a429a
JH
1260/* Figure out what functions we want to assemble. */
1261
1262static void
65d630d4 1263mark_functions_to_output (void)
1c4a429a 1264{
3dafb85c 1265 cgraph_node *node;
b66887e4
JJ
1266#ifdef ENABLE_CHECKING
1267 bool check_same_comdat_groups = false;
1268
65c70e6b 1269 FOR_EACH_FUNCTION (node)
b66887e4
JJ
1270 gcc_assert (!node->process);
1271#endif
1c4a429a 1272
65c70e6b 1273 FOR_EACH_FUNCTION (node)
1c4a429a 1274 {
67348ccc 1275 tree decl = node->decl;
c22cacf3 1276
67348ccc 1277 gcc_assert (!node->process || node->same_comdat_group);
b66887e4
JJ
1278 if (node->process)
1279 continue;
b58b1157 1280
7660e67e
SB
1281 /* We need to output all local functions that are used and not
1282 always inlined, as well as those that are reachable from
1283 outside the current compilation unit. */
67348ccc 1284 if (node->analyzed
c47d0034 1285 && !node->thunk.thunk_p
67348ccc 1286 && !node->alias
18c6ada9 1287 && !node->global.inlined_to
6de9cd9a 1288 && !TREE_ASM_WRITTEN (decl)
1c4a429a 1289 && !DECL_EXTERNAL (decl))
b66887e4
JJ
1290 {
1291 node->process = 1;
67348ccc 1292 if (node->same_comdat_group)
b66887e4 1293 {
3dafb85c 1294 cgraph_node *next;
d52f5295 1295 for (next = dyn_cast<cgraph_node *> (node->same_comdat_group);
b66887e4 1296 next != node;
d52f5295 1297 next = dyn_cast<cgraph_node *> (next->same_comdat_group))
1f26ac87 1298 if (!next->thunk.thunk_p && !next->alias
d52f5295 1299 && !next->comdat_local_p ())
c47d0034 1300 next->process = 1;
b66887e4
JJ
1301 }
1302 }
67348ccc 1303 else if (node->same_comdat_group)
b66887e4
JJ
1304 {
1305#ifdef ENABLE_CHECKING
1306 check_same_comdat_groups = true;
1307#endif
1308 }
341c100f 1309 else
1a2caa7a
NS
1310 {
1311 /* We should've reclaimed all functions that are not needed. */
1312#ifdef ENABLE_CHECKING
726a989a 1313 if (!node->global.inlined_to
39ecc018 1314 && gimple_has_body_p (decl)
a837268b
JH
1315 /* FIXME: in ltrans unit when offline copy is outside partition but inline copies
1316 are inside partition, we can end up not removing the body since we no longer
1317 have analyzed node pointing to it. */
67348ccc
DM
1318 && !node->in_other_partition
1319 && !node->alias
387df871 1320 && !node->clones
1a2caa7a
NS
1321 && !DECL_EXTERNAL (decl))
1322 {
d52f5295 1323 node->debug ();
1a2caa7a
NS
1324 internal_error ("failed to reclaim unneeded function");
1325 }
1326#endif
726a989a 1327 gcc_assert (node->global.inlined_to
39ecc018 1328 || !gimple_has_body_p (decl)
67348ccc 1329 || node->in_other_partition
6649df51
JH
1330 || node->clones
1331 || DECL_ARTIFICIAL (decl)
1a2caa7a
NS
1332 || DECL_EXTERNAL (decl));
1333
1334 }
c22cacf3 1335
18d13f34 1336 }
b66887e4
JJ
1337#ifdef ENABLE_CHECKING
1338 if (check_same_comdat_groups)
65c70e6b 1339 FOR_EACH_FUNCTION (node)
67348ccc 1340 if (node->same_comdat_group && !node->process)
b66887e4 1341 {
67348ccc 1342 tree decl = node->decl;
b66887e4
JJ
1343 if (!node->global.inlined_to
1344 && gimple_has_body_p (decl)
7cbf224d
RG
1345 /* FIXME: in an ltrans unit when the offline copy is outside a
1346 partition but inline copies are inside a partition, we can
1347 end up not removing the body since we no longer have an
1348 analyzed node pointing to it. */
67348ccc 1349 && !node->in_other_partition
07250f0e 1350 && !node->clones
b66887e4
JJ
1351 && !DECL_EXTERNAL (decl))
1352 {
d52f5295 1353 node->debug ();
7cbf224d
RG
1354 internal_error ("failed to reclaim unneeded function in same "
1355 "comdat group");
b66887e4
JJ
1356 }
1357 }
1358#endif
18d13f34
JH
1359}
1360
6744a6ab 1361/* DECL is FUNCTION_DECL. Initialize datastructures so DECL is a function
3649b9b7 1362 in lowered gimple form. IN_SSA is true if the gimple is in SSA.
6744a6ab
JH
1363
1364 Set current_function_decl and cfun to newly constructed empty function body.
1365 return basic block in the function body. */
1366
3649b9b7 1367basic_block
10881cff 1368init_lowered_empty_function (tree decl, bool in_ssa, gcov_type count)
6744a6ab
JH
1369{
1370 basic_block bb;
10881cff 1371 edge e;
6744a6ab
JH
1372
1373 current_function_decl = decl;
1374 allocate_struct_function (decl, false);
1375 gimple_register_cfg_hooks ();
1376 init_empty_tree_cfg ();
3649b9b7
ST
1377
1378 if (in_ssa)
1379 {
1380 init_tree_ssa (cfun);
1381 init_ssa_operands (cfun);
1382 cfun->gimple_df->in_ssa_p = true;
31ee20ba 1383 cfun->curr_properties |= PROP_ssa;
3649b9b7
ST
1384 }
1385
6744a6ab
JH
1386 DECL_INITIAL (decl) = make_node (BLOCK);
1387
1388 DECL_SAVED_TREE (decl) = error_mark_node;
31ee20ba
RB
1389 cfun->curr_properties |= (PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_any
1390 | PROP_cfg | PROP_loops);
1391
766090c2 1392 set_loops_for_fn (cfun, ggc_cleared_alloc<loops> ());
31ee20ba
RB
1393 init_loops_structure (cfun, loops_for_fn (cfun), 1);
1394 loops_for_fn (cfun)->state |= LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
6744a6ab
JH
1395
1396 /* Create BB for body of the function and connect it properly. */
10881cff
JH
1397 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = count;
1398 ENTRY_BLOCK_PTR_FOR_FN (cfun)->frequency = REG_BR_PROB_BASE;
1399 EXIT_BLOCK_PTR_FOR_FN (cfun)->count = count;
1400 EXIT_BLOCK_PTR_FOR_FN (cfun)->frequency = REG_BR_PROB_BASE;
c4d281b2 1401 bb = create_basic_block (NULL, ENTRY_BLOCK_PTR_FOR_FN (cfun));
10881cff
JH
1402 bb->count = count;
1403 bb->frequency = BB_FREQ_MAX;
1404 e = make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), bb, EDGE_FALLTHRU);
1405 e->count = count;
1406 e->probability = REG_BR_PROB_BASE;
1407 e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
1408 e->count = count;
1409 e->probability = REG_BR_PROB_BASE;
fefa31b5 1410 add_bb_to_loop (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->loop_father);
6744a6ab
JH
1411
1412 return bb;
1413}
1414
1415/* Adjust PTR by the constant FIXED_OFFSET, and by the vtable
1416 offset indicated by VIRTUAL_OFFSET, if that is
1417 non-null. THIS_ADJUSTING is nonzero for a this adjusting thunk and
1418 zero for a result adjusting thunk. */
1419
1420static tree
1421thunk_adjust (gimple_stmt_iterator * bsi,
1422 tree ptr, bool this_adjusting,
1423 HOST_WIDE_INT fixed_offset, tree virtual_offset)
1424{
538dd0b7 1425 gassign *stmt;
6744a6ab
JH
1426 tree ret;
1427
313333a6
RG
1428 if (this_adjusting
1429 && fixed_offset != 0)
6744a6ab 1430 {
5d49b6a7
RG
1431 stmt = gimple_build_assign
1432 (ptr, fold_build_pointer_plus_hwi_loc (input_location,
1433 ptr,
1434 fixed_offset));
6744a6ab
JH
1435 gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1436 }
1437
1438 /* If there's a virtual offset, look up that value in the vtable and
1439 adjust the pointer again. */
1440 if (virtual_offset)
1441 {
1442 tree vtabletmp;
1443 tree vtabletmp2;
1444 tree vtabletmp3;
6744a6ab
JH
1445
1446 if (!vtable_entry_type)
1447 {
1448 tree vfunc_type = make_node (FUNCTION_TYPE);
1449 TREE_TYPE (vfunc_type) = integer_type_node;
1450 TYPE_ARG_TYPES (vfunc_type) = NULL_TREE;
1451 layout_type (vfunc_type);
1452
1453 vtable_entry_type = build_pointer_type (vfunc_type);
1454 }
1455
1456 vtabletmp =
7cc434a3 1457 create_tmp_reg (build_pointer_type
7d80ca1f 1458 (build_pointer_type (vtable_entry_type)), "vptr");
6744a6ab
JH
1459
1460 /* The vptr is always at offset zero in the object. */
1461 stmt = gimple_build_assign (vtabletmp,
1462 build1 (NOP_EXPR, TREE_TYPE (vtabletmp),
1463 ptr));
1464 gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
6744a6ab
JH
1465
1466 /* Form the vtable address. */
7cc434a3 1467 vtabletmp2 = create_tmp_reg (TREE_TYPE (TREE_TYPE (vtabletmp)),
7d80ca1f 1468 "vtableaddr");
6744a6ab 1469 stmt = gimple_build_assign (vtabletmp2,
70f34814 1470 build_simple_mem_ref (vtabletmp));
6744a6ab 1471 gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
6744a6ab
JH
1472
1473 /* Find the entry with the vcall offset. */
1474 stmt = gimple_build_assign (vtabletmp2,
5d49b6a7
RG
1475 fold_build_pointer_plus_loc (input_location,
1476 vtabletmp2,
1477 virtual_offset));
6744a6ab
JH
1478 gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1479
1480 /* Get the offset itself. */
7cc434a3 1481 vtabletmp3 = create_tmp_reg (TREE_TYPE (TREE_TYPE (vtabletmp2)),
7d80ca1f 1482 "vcalloffset");
6744a6ab 1483 stmt = gimple_build_assign (vtabletmp3,
70f34814 1484 build_simple_mem_ref (vtabletmp2));
6744a6ab 1485 gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
6744a6ab 1486
6744a6ab 1487 /* Adjust the `this' pointer. */
0d82a1c8
RG
1488 ptr = fold_build_pointer_plus_loc (input_location, ptr, vtabletmp3);
1489 ptr = force_gimple_operand_gsi (bsi, ptr, true, NULL_TREE, false,
1490 GSI_CONTINUE_LINKING);
6744a6ab
JH
1491 }
1492
313333a6
RG
1493 if (!this_adjusting
1494 && fixed_offset != 0)
6744a6ab
JH
1495 /* Adjust the pointer by the constant. */
1496 {
1497 tree ptrtmp;
1498
1499 if (TREE_CODE (ptr) == VAR_DECL)
1500 ptrtmp = ptr;
1501 else
1502 {
7cc434a3 1503 ptrtmp = create_tmp_reg (TREE_TYPE (ptr), "ptr");
6744a6ab
JH
1504 stmt = gimple_build_assign (ptrtmp, ptr);
1505 gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
6744a6ab 1506 }
5d49b6a7
RG
1507 ptr = fold_build_pointer_plus_hwi_loc (input_location,
1508 ptrtmp, fixed_offset);
6744a6ab
JH
1509 }
1510
1511 /* Emit the statement and gimplify the adjustment expression. */
7cc434a3 1512 ret = create_tmp_reg (TREE_TYPE (ptr), "adjusted_this");
6744a6ab 1513 stmt = gimple_build_assign (ret, ptr);
6744a6ab
JH
1514 gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1515
1516 return ret;
1517}
1518
afdec9bd 1519/* Expand thunk NODE to gimple if possible.
d211e471
ML
1520 When FORCE_GIMPLE_THUNK is true, gimple thunk is created and
1521 no assembler is produced.
afdec9bd
JH
1522 When OUTPUT_ASM_THUNK is true, also produce assembler for
1523 thunks that are not lowered. */
6744a6ab 1524
afdec9bd 1525bool
d52f5295 1526cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
6744a6ab 1527{
d52f5295
ML
1528 bool this_adjusting = thunk.this_adjusting;
1529 HOST_WIDE_INT fixed_offset = thunk.fixed_offset;
1530 HOST_WIDE_INT virtual_value = thunk.virtual_value;
6744a6ab 1531 tree virtual_offset = NULL;
d52f5295
ML
1532 tree alias = callees->callee->decl;
1533 tree thunk_fndecl = decl;
bcb650cb
JH
1534 tree a;
1535
a115251c
IE
1536 /* Instrumentation thunk is the same function with
1537 a different signature. Never need to expand it. */
1538 if (thunk.add_pointer_bounds_args)
1539 return false;
d06865bf 1540
d211e471 1541 if (!force_gimple_thunk && this_adjusting
6744a6ab
JH
1542 && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
1543 virtual_value, alias))
1544 {
1545 const char *fnname;
1546 tree fn_block;
4399cf59 1547 tree restype = TREE_TYPE (TREE_TYPE (thunk_fndecl));
afdec9bd
JH
1548
1549 if (!output_asm_thunks)
77b7d74b
MJ
1550 {
1551 analyzed = true;
1552 return false;
1553 }
afdec9bd
JH
1554
1555 if (in_lto_p)
70486010 1556 get_untransformed_body ();
afdec9bd 1557 a = DECL_ARGUMENTS (thunk_fndecl);
6744a6ab 1558
afdec9bd
JH
1559 current_function_decl = thunk_fndecl;
1560
1561 /* Ensure thunks are emitted in their correct sections. */
9641fab3
JH
1562 resolve_unique_section (thunk_fndecl, 0,
1563 flag_function_sections);
afdec9bd 1564
6744a6ab
JH
1565 DECL_RESULT (thunk_fndecl)
1566 = build_decl (DECL_SOURCE_LOCATION (thunk_fndecl),
4399cf59 1567 RESULT_DECL, 0, restype);
afdec9bd 1568 DECL_CONTEXT (DECL_RESULT (thunk_fndecl)) = thunk_fndecl;
15488554 1569 fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk_fndecl));
6744a6ab
JH
1570
1571 /* The back end expects DECL_INITIAL to contain a BLOCK, so we
1572 create one. */
1573 fn_block = make_node (BLOCK);
1574 BLOCK_VARS (fn_block) = a;
1575 DECL_INITIAL (thunk_fndecl) = fn_block;
1576 init_function_start (thunk_fndecl);
1577 cfun->is_thunk = 1;
68a55980
JJ
1578 insn_locations_init ();
1579 set_curr_insn_location (DECL_SOURCE_LOCATION (thunk_fndecl));
1580 prologue_location = curr_insn_location ();
6744a6ab
JH
1581 assemble_start_function (thunk_fndecl, fnname);
1582
1583 targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
1584 fixed_offset, virtual_value, alias);
1585
1586 assemble_end_function (thunk_fndecl, fnname);
68a55980 1587 insn_locations_finalize ();
6744a6ab
JH
1588 init_insn_lengths ();
1589 free_after_compilation (cfun);
1590 set_cfun (NULL);
1591 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
d52f5295
ML
1592 thunk.thunk_p = false;
1593 analyzed = false;
6744a6ab 1594 }
d90cae08
JH
1595 else if (stdarg_p (TREE_TYPE (thunk_fndecl)))
1596 {
1597 error ("generic thunk code fails for method %qD which uses %<...%>",
1598 thunk_fndecl);
1599 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
1600 analyzed = true;
1601 return false;
1602 }
6744a6ab
JH
1603 else
1604 {
1605 tree restype;
1606 basic_block bb, then_bb, else_bb, return_bb;
1607 gimple_stmt_iterator bsi;
1608 int nargs = 0;
1609 tree arg;
1610 int i;
1611 tree resdecl;
1612 tree restmp = NULL;
4f5a53cc 1613 tree resbnd = NULL;
6744a6ab 1614
538dd0b7
DM
1615 gcall *call;
1616 greturn *ret;
c43ade80 1617 bool alias_is_noreturn = TREE_THIS_VOLATILE (alias);
6744a6ab 1618
afdec9bd 1619 if (in_lto_p)
70486010 1620 get_untransformed_body ();
afdec9bd 1621 a = DECL_ARGUMENTS (thunk_fndecl);
b84d4347 1622
afdec9bd
JH
1623 current_function_decl = thunk_fndecl;
1624
1625 /* Ensure thunks are emitted in their correct sections. */
9641fab3
JH
1626 resolve_unique_section (thunk_fndecl, 0,
1627 flag_function_sections);
afdec9bd 1628
6744a6ab
JH
1629 DECL_IGNORED_P (thunk_fndecl) = 1;
1630 bitmap_obstack_initialize (NULL);
1631
d52f5295 1632 if (thunk.virtual_offset_p)
6744a6ab
JH
1633 virtual_offset = size_int (virtual_value);
1634
1635 /* Build the return declaration for the function. */
1636 restype = TREE_TYPE (TREE_TYPE (thunk_fndecl));
1637 if (DECL_RESULT (thunk_fndecl) == NULL_TREE)
1638 {
1639 resdecl = build_decl (input_location, RESULT_DECL, 0, restype);
1640 DECL_ARTIFICIAL (resdecl) = 1;
1641 DECL_IGNORED_P (resdecl) = 1;
1642 DECL_RESULT (thunk_fndecl) = resdecl;
afdec9bd 1643 DECL_CONTEXT (DECL_RESULT (thunk_fndecl)) = thunk_fndecl;
6744a6ab
JH
1644 }
1645 else
1646 resdecl = DECL_RESULT (thunk_fndecl);
1647
10881cff
JH
1648 bb = then_bb = else_bb = return_bb
1649 = init_lowered_empty_function (thunk_fndecl, true, count);
6744a6ab
JH
1650
1651 bsi = gsi_start_bb (bb);
1652
1653 /* Build call to the function being thunked. */
c43ade80 1654 if (!VOID_TYPE_P (restype) && !alias_is_noreturn)
6744a6ab 1655 {
bc0ec027 1656 if (DECL_BY_REFERENCE (resdecl))
8c14c817
ML
1657 {
1658 restmp = gimple_fold_indirect_ref (resdecl);
1659 if (!restmp)
1660 restmp = build2 (MEM_REF,
1661 TREE_TYPE (TREE_TYPE (DECL_RESULT (alias))),
1662 resdecl,
1663 build_int_cst (TREE_TYPE
1664 (DECL_RESULT (alias)), 0));
1665 }
bc0ec027 1666 else if (!is_gimple_reg_type (restype))
6744a6ab 1667 {
bbd1bae2
JJ
1668 if (aggregate_value_p (resdecl, TREE_TYPE (thunk_fndecl)))
1669 {
1670 restmp = resdecl;
5cf18d25 1671
bbd1bae2
JJ
1672 if (TREE_CODE (restmp) == VAR_DECL)
1673 add_local_decl (cfun, restmp);
1674 BLOCK_VARS (DECL_INITIAL (current_function_decl)) = restmp;
1675 }
1676 else
1677 restmp = create_tmp_var (restype, "retval");
6744a6ab
JH
1678 }
1679 else
7cc434a3 1680 restmp = create_tmp_reg (restype, "retval");
6744a6ab
JH
1681 }
1682
910ad8de 1683 for (arg = a; arg; arg = DECL_CHAIN (arg))
6744a6ab 1684 nargs++;
ef062b13 1685 auto_vec<tree> vargs (nargs);
4eaf52aa
JJ
1686 i = 0;
1687 arg = a;
6744a6ab 1688 if (this_adjusting)
4eaf52aa
JJ
1689 {
1690 vargs.quick_push (thunk_adjust (&bsi, a, 1, fixed_offset,
1691 virtual_offset));
1692 arg = DECL_CHAIN (a);
1693 i = 1;
1694 }
bc0ec027
JH
1695
1696 if (nargs)
4eaf52aa 1697 for (; i < nargs; i++, arg = DECL_CHAIN (arg))
fc044323
JM
1698 {
1699 tree tmp = arg;
1700 if (!is_gimple_val (arg))
1701 {
1702 tmp = create_tmp_reg (TYPE_MAIN_VARIANT
1703 (TREE_TYPE (arg)), "arg");
1704 gimple stmt = gimple_build_assign (tmp, arg);
1705 gsi_insert_after (&bsi, stmt, GSI_NEW_STMT);
1706 }
1707 vargs.quick_push (tmp);
1708 }
6744a6ab 1709 call = gimple_build_call_vec (build_fold_addr_expr_loc (0, alias), vargs);
d52f5295 1710 callees->call_stmt = call;
6744a6ab 1711 gimple_call_set_from_thunk (call, true);
d5e254e1 1712 gimple_call_set_with_bounds (call, instrumentation_clone);
b7aa4a3a
JH
1713
1714 /* Return slot optimization is always possible and in fact requred to
1715 return values with DECL_BY_REFERENCE. */
1716 if (aggregate_value_p (resdecl, TREE_TYPE (thunk_fndecl))
1717 && (!is_gimple_reg_type (TREE_TYPE (resdecl))
1718 || DECL_BY_REFERENCE (resdecl)))
1719 gimple_call_set_return_slot_opt (call, true);
1720
c43ade80 1721 if (restmp && !alias_is_noreturn)
bc0ec027
JH
1722 {
1723 gimple_call_set_lhs (call, restmp);
1724 gcc_assert (useless_type_conversion_p (TREE_TYPE (restmp),
1725 TREE_TYPE (TREE_TYPE (alias))));
1726 }
6744a6ab 1727 gsi_insert_after (&bsi, call, GSI_NEW_STMT);
c43ade80 1728 if (!alias_is_noreturn)
bc0ec027 1729 {
4f5a53cc
IE
1730 if (instrumentation_clone
1731 && !DECL_BY_REFERENCE (resdecl)
1732 && restmp
1733 && BOUNDED_P (restmp))
1734 {
1735 resbnd = chkp_insert_retbnd_call (NULL, restmp, &bsi);
1736 create_edge (get_create (gimple_call_fndecl (gsi_stmt (bsi))),
1737 as_a <gcall *> (gsi_stmt (bsi)),
1738 callees->count, callees->frequency);
1739 }
1740
bc0ec027
JH
1741 if (restmp && !this_adjusting
1742 && (fixed_offset || virtual_offset))
1743 {
1744 tree true_label = NULL_TREE;
6744a6ab 1745
bc0ec027
JH
1746 if (TREE_CODE (TREE_TYPE (restmp)) == POINTER_TYPE)
1747 {
1748 gimple stmt;
10881cff 1749 edge e;
bc0ec027
JH
1750 /* If the return type is a pointer, we need to
1751 protect against NULL. We know there will be an
1752 adjustment, because that's why we're emitting a
1753 thunk. */
c4d281b2 1754 then_bb = create_basic_block (NULL, bb);
10881cff
JH
1755 then_bb->count = count - count / 16;
1756 then_bb->frequency = BB_FREQ_MAX - BB_FREQ_MAX / 16;
c4d281b2 1757 return_bb = create_basic_block (NULL, then_bb);
10881cff
JH
1758 return_bb->count = count;
1759 return_bb->frequency = BB_FREQ_MAX;
c4d281b2 1760 else_bb = create_basic_block (NULL, else_bb);
10881cff
JH
1761 then_bb->count = count / 16;
1762 then_bb->frequency = BB_FREQ_MAX / 16;
bc0ec027
JH
1763 add_bb_to_loop (then_bb, bb->loop_father);
1764 add_bb_to_loop (return_bb, bb->loop_father);
1765 add_bb_to_loop (else_bb, bb->loop_father);
1766 remove_edge (single_succ_edge (bb));
1767 true_label = gimple_block_label (then_bb);
1768 stmt = gimple_build_cond (NE_EXPR, restmp,
1769 build_zero_cst (TREE_TYPE (restmp)),
1770 NULL_TREE, NULL_TREE);
1771 gsi_insert_after (&bsi, stmt, GSI_NEW_STMT);
10881cff
JH
1772 e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
1773 e->probability = REG_BR_PROB_BASE - REG_BR_PROB_BASE / 16;
1774 e->count = count - count / 16;
1775 e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
1776 e->probability = REG_BR_PROB_BASE / 16;
1777 e->count = count / 16;
1778 e = make_edge (return_bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
1779 e->probability = REG_BR_PROB_BASE;
1780 e->count = count;
1781 e = make_edge (then_bb, return_bb, EDGE_FALLTHRU);
1782 e->probability = REG_BR_PROB_BASE;
1783 e->count = count - count / 16;
1784 e = make_edge (else_bb, return_bb, EDGE_FALLTHRU);
1785 e->probability = REG_BR_PROB_BASE;
1786 e->count = count / 16;
bc0ec027
JH
1787 bsi = gsi_last_bb (then_bb);
1788 }
6744a6ab 1789
bc0ec027
JH
1790 restmp = thunk_adjust (&bsi, restmp, /*this_adjusting=*/0,
1791 fixed_offset, virtual_offset);
1792 if (true_label)
1793 {
1794 gimple stmt;
1795 bsi = gsi_last_bb (else_bb);
1796 stmt = gimple_build_assign (restmp,
1797 build_zero_cst (TREE_TYPE (restmp)));
1798 gsi_insert_after (&bsi, stmt, GSI_NEW_STMT);
1799 bsi = gsi_last_bb (return_bb);
1800 }
6744a6ab 1801 }
bc0ec027
JH
1802 else
1803 gimple_call_set_tail (call, true);
6744a6ab 1804
bc0ec027 1805 /* Build return value. */
8c14c817
ML
1806 if (!DECL_BY_REFERENCE (resdecl))
1807 ret = gimple_build_return (restmp);
1808 else
1809 ret = gimple_build_return (resdecl);
4f5a53cc 1810 gimple_return_set_retbnd (ret, resbnd);
8c14c817 1811
bc0ec027 1812 gsi_insert_after (&bsi, ret, GSI_NEW_STMT);
6744a6ab
JH
1813 }
1814 else
bc0ec027
JH
1815 {
1816 gimple_call_set_tail (call, true);
1817 remove_edge (single_succ_edge (bb));
1818 }
6744a6ab 1819
afdec9bd 1820 cfun->gimple_df->in_ssa_p = true;
10881cff
JH
1821 profile_status_for_fn (cfun)
1822 = count ? PROFILE_READ : PROFILE_GUESSED;
afdec9bd
JH
1823 /* FIXME: C++ FE should stop setting TREE_ASM_WRITTEN on thunks. */
1824 TREE_ASM_WRITTEN (thunk_fndecl) = false;
6744a6ab
JH
1825 delete_unreachable_blocks ();
1826 update_ssa (TODO_update_ssa);
bc0ec027
JH
1827#ifdef ENABLE_CHECKING
1828 verify_flow_info ();
1829#endif
253eab4f 1830 free_dominance_info (CDI_DOMINATORS);
6744a6ab 1831
6744a6ab
JH
1832 /* Since we want to emit the thunk, we explicitly mark its name as
1833 referenced. */
d52f5295
ML
1834 thunk.thunk_p = false;
1835 lowered = true;
6744a6ab
JH
1836 bitmap_obstack_release (NULL);
1837 }
1838 current_function_decl = NULL;
af16bc76 1839 set_cfun (NULL);
afdec9bd 1840 return true;
6744a6ab
JH
1841}
1842
3dafb85c 1843/* Assemble thunks and aliases associated to node. */
c47d0034 1844
3dafb85c
ML
1845void
1846cgraph_node::assemble_thunks_and_aliases (void)
c47d0034 1847{
3dafb85c
ML
1848 cgraph_edge *e;
1849 ipa_ref *ref;
39e2db00 1850
3dafb85c 1851 for (e = callers; e;)
d5e254e1
IE
1852 if (e->caller->thunk.thunk_p
1853 && !e->caller->thunk.add_pointer_bounds_args)
c47d0034 1854 {
3dafb85c 1855 cgraph_node *thunk = e->caller;
c47d0034
JH
1856
1857 e = e->next_caller;
d52f5295 1858 thunk->expand_thunk (true, false);
3dafb85c 1859 thunk->assemble_thunks_and_aliases ();
c47d0034
JH
1860 }
1861 else
1862 e = e->next_caller;
e55637b7 1863
3dafb85c 1864 FOR_EACH_ALIAS (this, ref)
e55637b7 1865 {
3dafb85c
ML
1866 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
1867 bool saved_written = TREE_ASM_WRITTEN (decl);
e55637b7
ML
1868
1869 /* Force assemble_alias to really output the alias this time instead
1870 of buffering it in same alias pairs. */
3dafb85c 1871 TREE_ASM_WRITTEN (decl) = 1;
e55637b7 1872 do_assemble_alias (alias->decl,
3dafb85c
ML
1873 DECL_ASSEMBLER_NAME (decl));
1874 alias->assemble_thunks_and_aliases ();
1875 TREE_ASM_WRITTEN (decl) = saved_written;
e55637b7 1876 }
c47d0034
JH
1877}
1878
3dafb85c 1879/* Expand function specified by node. */
0878843f 1880
3dafb85c
ML
1881void
1882cgraph_node::expand (void)
0878843f 1883{
0878843f
RG
1884 location_t saved_loc;
1885
9c8305f8 1886 /* We ought to not compile any inline clones. */
3dafb85c 1887 gcc_assert (!global.inlined_to);
9c8305f8
JH
1888
1889 announce_function (decl);
3dafb85c
ML
1890 process = 0;
1891 gcc_assert (lowered);
70486010 1892 get_untransformed_body ();
9c8305f8
JH
1893
1894 /* Generate RTL for the body of DECL. */
1895
0878843f
RG
1896 timevar_push (TV_REST_OF_COMPILATION);
1897
3dafb85c 1898 gcc_assert (symtab->global_info_ready);
0878843f
RG
1899
1900 /* Initialize the default bitmap obstack. */
1901 bitmap_obstack_initialize (NULL);
1902
1903 /* Initialize the RTL code for the function. */
9c8305f8 1904 current_function_decl = decl;
0878843f 1905 saved_loc = input_location;
9c8305f8
JH
1906 input_location = DECL_SOURCE_LOCATION (decl);
1907 init_function_start (decl);
0878843f
RG
1908
1909 gimple_register_cfg_hooks ();
1910
1911 bitmap_obstack_initialize (&reg_obstack); /* FIXME, only at RTL generation*/
1912
1913 execute_all_ipa_transforms ();
1914
1915 /* Perform all tree transforms and optimizations. */
1916
1917 /* Signal the start of passes. */
1918 invoke_plugin_callbacks (PLUGIN_ALL_PASSES_START, NULL);
1919
2cbf2d95 1920 execute_pass_list (cfun, g->get_passes ()->all_passes);
0878843f
RG
1921
1922 /* Signal the end of passes. */
1923 invoke_plugin_callbacks (PLUGIN_ALL_PASSES_END, NULL);
1924
1925 bitmap_obstack_release (&reg_obstack);
1926
1927 /* Release the default bitmap obstack. */
1928 bitmap_obstack_release (NULL);
1929
0878843f
RG
1930 /* If requested, warn about function definitions where the function will
1931 return a value (usually of some struct or union type) which itself will
1932 take up a lot of stack space. */
9c8305f8 1933 if (warn_larger_than && !DECL_EXTERNAL (decl) && TREE_TYPE (decl))
0878843f 1934 {
9c8305f8 1935 tree ret_type = TREE_TYPE (TREE_TYPE (decl));
0878843f
RG
1936
1937 if (ret_type && TYPE_SIZE_UNIT (ret_type)
1938 && TREE_CODE (TYPE_SIZE_UNIT (ret_type)) == INTEGER_CST
1939 && 0 < compare_tree_int (TYPE_SIZE_UNIT (ret_type),
1940 larger_than_size))
1941 {
1942 unsigned int size_as_int
1943 = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (ret_type));
1944
1945 if (compare_tree_int (TYPE_SIZE_UNIT (ret_type), size_as_int) == 0)
1946 warning (OPT_Wlarger_than_, "size of return value of %q+D is %u bytes",
9c8305f8 1947 decl, size_as_int);
0878843f
RG
1948 else
1949 warning (OPT_Wlarger_than_, "size of return value of %q+D is larger than %wd bytes",
9c8305f8 1950 decl, larger_than_size);
0878843f
RG
1951 }
1952 }
1953
9c8305f8
JH
1954 gimple_set_body (decl, NULL);
1955 if (DECL_STRUCT_FUNCTION (decl) == 0
d52f5295 1956 && !cgraph_node::get (decl)->origin)
0878843f
RG
1957 {
1958 /* Stop pointing to the local nodes about to be freed.
1959 But DECL_INITIAL must remain nonzero so we know this
1960 was an actual function definition.
1961 For a nested function, this is done in c_pop_function_context.
1962 If rest_of_compilation set this to 0, leave it 0. */
9c8305f8
JH
1963 if (DECL_INITIAL (decl) != 0)
1964 DECL_INITIAL (decl) = error_mark_node;
0878843f
RG
1965 }
1966
1967 input_location = saved_loc;
1968
1969 ggc_collect ();
1970 timevar_pop (TV_REST_OF_COMPILATION);
5806d9ac
JH
1971
1972 /* Make sure that BE didn't give up on compiling. */
1973 gcc_assert (TREE_ASM_WRITTEN (decl));
af16bc76 1974 set_cfun (NULL);
5806d9ac 1975 current_function_decl = NULL;
1bb7e8f8
JH
1976
1977 /* It would make a lot more sense to output thunks before function body to get more
65d630d4 1978 forward and lest backwarding jumps. This however would need solving problem
1bb7e8f8 1979 with comdats. See PR48668. Also aliases must come after function itself to
65d630d4 1980 make one pass assemblers, like one on AIX, happy. See PR 50689.
1bb7e8f8
JH
1981 FIXME: Perhaps thunks should be move before function IFF they are not in comdat
1982 groups. */
3dafb85c
ML
1983 assemble_thunks_and_aliases ();
1984 release_body ();
39ecc018
JH
1985 /* Eliminate all call edges. This is important so the GIMPLE_CALL no longer
1986 points to the dead function body. */
3dafb85c
ML
1987 remove_callees ();
1988 remove_all_references ();
1c4a429a
JH
1989}
1990
9cec31f4
ML
1991/* Node comparer that is responsible for the order that corresponds
1992 to time when a function was launched for the first time. */
1993
1994static int
1995node_cmp (const void *pa, const void *pb)
1996{
3dafb85c
ML
1997 const cgraph_node *a = *(const cgraph_node * const *) pa;
1998 const cgraph_node *b = *(const cgraph_node * const *) pb;
9cec31f4
ML
1999
2000 /* Functions with time profile must be before these without profile. */
2001 if (!a->tp_first_run || !b->tp_first_run)
2002 return a->tp_first_run - b->tp_first_run;
2003
2004 return a->tp_first_run != b->tp_first_run
2005 ? b->tp_first_run - a->tp_first_run
2006 : b->order - a->order;
2007}
6674a6ce 2008
db0e878d
AJ
2009/* Expand all functions that must be output.
2010
b58b1157
JH
2011 Attempt to topologically sort the nodes so function is output when
2012 all called functions are already assembled to allow data to be
a98ebe2e 2013 propagated across the callgraph. Use a stack to get smaller distance
d1a6adeb 2014 between a function and its callees (later we may choose to use a more
b58b1157
JH
2015 sophisticated algorithm for function reordering; we will likely want
2016 to use subsections to make the output functions appear in top-down
2017 order). */
2018
2019static void
65d630d4 2020expand_all_functions (void)
b58b1157 2021{
3dafb85c
ML
2022 cgraph_node *node;
2023 cgraph_node **order = XCNEWVEC (cgraph_node *,
2024 symtab->cgraph_count);
9cec31f4 2025 unsigned int expanded_func_count = 0, profiled_func_count = 0;
f30cfcb1 2026 int order_pos, new_order_pos = 0;
b58b1157
JH
2027 int i;
2028
af8bca3c 2029 order_pos = ipa_reverse_postorder (order);
3dafb85c 2030 gcc_assert (order_pos == symtab->cgraph_count);
b58b1157 2031
1ae58c30 2032 /* Garbage collector may remove inline clones we eliminate during
18c6ada9
JH
2033 optimization. So we must be sure to not reference them. */
2034 for (i = 0; i < order_pos; i++)
257eb6e3 2035 if (order[i]->process)
18c6ada9
JH
2036 order[new_order_pos++] = order[i];
2037
9cec31f4 2038 if (flag_profile_reorder_functions)
3dafb85c 2039 qsort (order, new_order_pos, sizeof (cgraph_node *), node_cmp);
9cec31f4 2040
18c6ada9 2041 for (i = new_order_pos - 1; i >= 0; i--)
b58b1157
JH
2042 {
2043 node = order[i];
9cec31f4 2044
257eb6e3 2045 if (node->process)
b58b1157 2046 {
21c0a521
DM
2047 expanded_func_count++;
2048 if(node->tp_first_run)
2049 profiled_func_count++;
2050
2051 if (symtab->dump_file)
2052 fprintf (symtab->dump_file,
2053 "Time profile order in expand_all_functions:%s:%d\n",
2054 node->asm_name (), node->tp_first_run);
257eb6e3 2055 node->process = 0;
3dafb85c 2056 node->expand ();
b58b1157
JH
2057 }
2058 }
9cec31f4
ML
2059
2060 if (dump_file)
2061 fprintf (dump_file, "Expanded functions with time profile (%s):%u/%u\n",
2062 main_input_filename, profiled_func_count, expanded_func_count);
2063
3dafb85c
ML
2064 if (symtab->dump_file && flag_profile_reorder_functions)
2065 fprintf (symtab->dump_file, "Expanded functions with time profile:%u/%u\n",
9cec31f4
ML
2066 profiled_func_count, expanded_func_count);
2067
3dafb85c 2068 symtab->process_new_functions ();
45852dcc 2069 free_gimplify_stack ();
50674e96 2070
b58b1157
JH
2071 free (order);
2072}
2073
474eccc6
ILT
2074/* This is used to sort the node types by the cgraph order number. */
2075
24b97832
ILT
2076enum cgraph_order_sort_kind
2077{
2078 ORDER_UNDEFINED = 0,
2079 ORDER_FUNCTION,
2080 ORDER_VAR,
2081 ORDER_ASM
2082};
2083
474eccc6
ILT
2084struct cgraph_order_sort
2085{
24b97832 2086 enum cgraph_order_sort_kind kind;
474eccc6
ILT
2087 union
2088 {
3dafb85c 2089 cgraph_node *f;
2c8326a5 2090 varpool_node *v;
3dafb85c 2091 asm_node *a;
474eccc6
ILT
2092 } u;
2093};
2094
2095/* Output all functions, variables, and asm statements in the order
2096 according to their order fields, which is the order in which they
2097 appeared in the file. This implements -fno-toplevel-reorder. In
2098 this mode we may output functions and variables which don't really
7861b648
AK
2099 need to be output.
2100 When NO_REORDER is true only do this for symbols marked no reorder. */
474eccc6
ILT
2101
2102static void
7861b648 2103output_in_order (bool no_reorder)
474eccc6
ILT
2104{
2105 int max;
3dafb85c 2106 cgraph_order_sort *nodes;
474eccc6 2107 int i;
3dafb85c 2108 cgraph_node *pf;
2c8326a5 2109 varpool_node *pv;
3dafb85c
ML
2110 asm_node *pa;
2111 max = symtab->order;
2112 nodes = XCNEWVEC (cgraph_order_sort, max);
474eccc6 2113
65c70e6b 2114 FOR_EACH_DEFINED_FUNCTION (pf)
474eccc6 2115 {
67348ccc 2116 if (pf->process && !pf->thunk.thunk_p && !pf->alias)
474eccc6 2117 {
7861b648
AK
2118 if (no_reorder && !pf->no_reorder)
2119 continue;
67348ccc 2120 i = pf->order;
474eccc6
ILT
2121 gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
2122 nodes[i].kind = ORDER_FUNCTION;
2123 nodes[i].u.f = pf;
2124 }
2125 }
2126
65c70e6b 2127 FOR_EACH_DEFINED_VARIABLE (pv)
67348ccc 2128 if (!DECL_EXTERNAL (pv->decl))
6649df51 2129 {
7861b648
AK
2130 if (no_reorder && !pv->no_reorder)
2131 continue;
67348ccc 2132 i = pv->order;
6649df51
JH
2133 gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
2134 nodes[i].kind = ORDER_VAR;
2135 nodes[i].u.v = pv;
2136 }
474eccc6 2137
3dafb85c 2138 for (pa = symtab->first_asm_symbol (); pa; pa = pa->next)
474eccc6
ILT
2139 {
2140 i = pa->order;
2141 gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
2142 nodes[i].kind = ORDER_ASM;
2143 nodes[i].u.a = pa;
2144 }
474eccc6 2145
7386e3ee 2146 /* In toplevel reorder mode we output all statics; mark them as needed. */
7386e3ee 2147
7fece979
JJ
2148 for (i = 0; i < max; ++i)
2149 if (nodes[i].kind == ORDER_VAR)
9041d2e6 2150 nodes[i].u.v->finalize_named_section_flags ();
7fece979 2151
474eccc6
ILT
2152 for (i = 0; i < max; ++i)
2153 {
2154 switch (nodes[i].kind)
2155 {
2156 case ORDER_FUNCTION:
257eb6e3 2157 nodes[i].u.f->process = 0;
3dafb85c 2158 nodes[i].u.f->expand ();
474eccc6
ILT
2159 break;
2160
2161 case ORDER_VAR:
9041d2e6 2162 nodes[i].u.v->assemble_decl ();
474eccc6
ILT
2163 break;
2164
2165 case ORDER_ASM:
2166 assemble_asm (nodes[i].u.a->asm_str);
2167 break;
2168
2169 case ORDER_UNDEFINED:
2170 break;
2171
2172 default:
2173 gcc_unreachable ();
2174 }
2175 }
e7b9eb2c 2176
3dafb85c
ML
2177 symtab->clear_asm_symbols ();
2178
33283dad 2179 free (nodes);
474eccc6
ILT
2180}
2181
ef330312
PB
2182static void
2183ipa_passes (void)
2184{
315f8c0e
DM
2185 gcc::pass_manager *passes = g->get_passes ();
2186
db2960f4 2187 set_cfun (NULL);
04b201a2 2188 current_function_decl = NULL;
726a989a 2189 gimple_register_cfg_hooks ();
ef330312 2190 bitmap_obstack_initialize (NULL);
b20996ff 2191
090fa0ab
GF
2192 invoke_plugin_callbacks (PLUGIN_ALL_IPA_PASSES_START, NULL);
2193
b20996ff 2194 if (!in_lto_p)
0430f80c 2195 {
315f8c0e 2196 execute_ipa_pass_list (passes->all_small_ipa_passes);
0430f80c
RG
2197 if (seen_error ())
2198 return;
2199 }
3baf459d 2200
8605403e
JH
2201 /* This extra symtab_remove_unreachable_nodes pass tends to catch some
2202 devirtualization and other changes where removal iterate. */
17e0fc92 2203 symtab->remove_unreachable_nodes (symtab->dump_file);
467a8db0 2204
d7f09764
DN
2205 /* If pass_all_early_optimizations was not scheduled, the state of
2206 the cgraph will not be properly updated. Update it now. */
3dafb85c
ML
2207 if (symtab->state < IPA_SSA)
2208 symtab->state = IPA_SSA;
3baf459d 2209
d7f09764
DN
2210 if (!in_lto_p)
2211 {
2212 /* Generate coverage variables and constructors. */
2213 coverage_finish ();
2214
2215 /* Process new functions added. */
2216 set_cfun (NULL);
2217 current_function_decl = NULL;
3dafb85c 2218 symtab->process_new_functions ();
d7f09764 2219
090fa0ab 2220 execute_ipa_summary_passes
6a5ac314 2221 ((ipa_opt_pass_d *) passes->all_regular_ipa_passes);
fb3f88cc 2222 }
c082f9f3
SB
2223
2224 /* Some targets need to handle LTO assembler output specially. */
f0d78df9 2225 if (flag_generate_lto || flag_generate_offload)
c082f9f3
SB
2226 targetm.asm_out.lto_start ();
2227
d7f09764 2228 if (!in_lto_p)
1f6be682
IV
2229 {
2230 if (g->have_offload)
2231 {
2232 section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
1b34e6e2 2233 lto_stream_offload_p = true;
837bac8c 2234 ipa_write_summaries ();
1b34e6e2 2235 lto_stream_offload_p = false;
1f6be682
IV
2236 }
2237 if (flag_lto)
2238 {
2239 section_name_prefix = LTO_SECTION_NAME_PREFIX;
1b34e6e2 2240 lto_stream_offload_p = false;
837bac8c 2241 ipa_write_summaries ();
1f6be682
IV
2242 }
2243 }
d7f09764 2244
f0d78df9 2245 if (flag_generate_lto || flag_generate_offload)
c082f9f3
SB
2246 targetm.asm_out.lto_end ();
2247
cc8547a7 2248 if (!flag_ltrans && (in_lto_p || !flag_lto || flag_fat_lto_objects))
315f8c0e 2249 execute_ipa_pass_list (passes->all_regular_ipa_passes);
090fa0ab 2250 invoke_plugin_callbacks (PLUGIN_ALL_IPA_PASSES_END, NULL);
3baf459d 2251
ef330312
PB
2252 bitmap_obstack_release (NULL);
2253}
2254
25e2c40d
JH
2255
2256/* Return string alias is alias of. */
2257
2258static tree
2259get_alias_symbol (tree decl)
2260{
2261 tree alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
2262 return get_identifier (TREE_STRING_POINTER
2263 (TREE_VALUE (TREE_VALUE (alias))));
2264}
2265
2266
c9552bff 2267/* Weakrefs may be associated to external decls and thus not output
073a8998 2268 at expansion time. Emit all necessary aliases. */
c9552bff 2269
3dafb85c
ML
2270void
2271symbol_table::output_weakrefs (void)
c9552bff 2272{
5e20cdc9 2273 symtab_node *node;
d5e254e1 2274 cgraph_node *cnode;
40a7fe1e 2275 FOR_EACH_SYMBOL (node)
67348ccc
DM
2276 if (node->alias
2277 && !TREE_ASM_WRITTEN (node->decl)
d5e254e1
IE
2278 && (!(cnode = dyn_cast <cgraph_node *> (node))
2279 || !cnode->instrumented_version
2280 || !TREE_ASM_WRITTEN (cnode->instrumented_version->decl))
67348ccc 2281 && node->weakref)
40a7fe1e
JH
2282 {
2283 tree target;
2284
2285 /* Weakrefs are special by not requiring target definition in current
2286 compilation unit. It is thus bit hard to work out what we want to
2287 alias.
2288 When alias target is defined, we need to fetch it from symtab reference,
2289 otherwise it is pointed to by alias_target. */
67348ccc
DM
2290 if (node->alias_target)
2291 target = (DECL_P (node->alias_target)
2292 ? DECL_ASSEMBLER_NAME (node->alias_target)
2293 : node->alias_target);
2294 else if (node->analyzed)
d52f5295 2295 target = DECL_ASSEMBLER_NAME (node->get_alias_target ()->decl);
40a7fe1e
JH
2296 else
2297 {
2298 gcc_unreachable ();
67348ccc 2299 target = get_alias_symbol (node->decl);
40a7fe1e 2300 }
67348ccc 2301 do_assemble_alias (node->decl, target);
40a7fe1e 2302 }
c9552bff
JH
2303}
2304
711417cd
RG
2305/* Perform simple optimizations based on callgraph. */
2306
2307void
3dafb85c 2308symbol_table::compile (void)
711417cd
RG
2309{
2310 if (seen_error ())
2311 return;
2312
2313#ifdef ENABLE_CHECKING
d52f5295 2314 symtab_node::verify_symtab_nodes ();
711417cd
RG
2315#endif
2316
711417cd
RG
2317 timevar_push (TV_CGRAPHOPT);
2318 if (pre_ipa_mem_report)
2319 {
2320 fprintf (stderr, "Memory consumption before IPA\n");
2321 dump_memory_report (false);
2322 }
2323 if (!quiet_flag)
2324 fprintf (stderr, "Performing interprocedural optimizations\n");
3dafb85c 2325 state = IPA;
711417cd 2326
1f6be682
IV
2327 /* Offloading requires LTO infrastructure. */
2328 if (!in_lto_p && g->have_offload)
f0d78df9 2329 flag_generate_offload = 1;
1f6be682 2330
65d630d4 2331 /* If LTO is enabled, initialize the streamer hooks needed by GIMPLE. */
f0d78df9 2332 if (flag_generate_lto || flag_generate_offload)
65d630d4
JH
2333 lto_streamer_hooks_init ();
2334
711417cd
RG
2335 /* Don't run the IPA passes if there was any error or sorry messages. */
2336 if (!seen_error ())
2337 ipa_passes ();
2338
2339 /* Do nothing else if any IPA pass found errors or if we are just streaming LTO. */
2340 if (seen_error ()
2341 || (!in_lto_p && flag_lto && !flag_fat_lto_objects))
2342 {
2343 timevar_pop (TV_CGRAPHOPT);
2344 return;
2345 }
2346
3dafb85c
ML
2347 global_info_ready = true;
2348 if (dump_file)
711417cd 2349 {
3dafb85c
ML
2350 fprintf (dump_file, "Optimized ");
2351 symtab_node:: dump_table (dump_file);
711417cd
RG
2352 }
2353 if (post_ipa_mem_report)
2354 {
2355 fprintf (stderr, "Memory consumption after IPA\n");
2356 dump_memory_report (false);
2357 }
2358 timevar_pop (TV_CGRAPHOPT);
2359
2360 /* Output everything. */
2361 (*debug_hooks->assembly_start) ();
2362 if (!quiet_flag)
2363 fprintf (stderr, "Assembling functions:\n");
2364#ifdef ENABLE_CHECKING
d52f5295 2365 symtab_node::verify_symtab_nodes ();
711417cd
RG
2366#endif
2367
3dafb85c 2368 materialize_all_clones ();
711417cd 2369 bitmap_obstack_initialize (NULL);
315f8c0e 2370 execute_ipa_pass_list (g->get_passes ()->all_late_ipa_passes);
711417cd 2371 bitmap_obstack_release (NULL);
65d630d4 2372 mark_functions_to_output ();
711417cd 2373
38e55e5c
JH
2374 /* When weakref support is missing, we autmatically translate all
2375 references to NODE to references to its ultimate alias target.
2376 The renaming mechanizm uses flag IDENTIFIER_TRANSPARENT_ALIAS and
2377 TREE_CHAIN.
2378
2379 Set up this mapping before we output any assembler but once we are sure
2380 that all symbol renaming is done.
2381
2382 FIXME: All this uglyness can go away if we just do renaming at gimple
2383 level by physically rewritting the IL. At the moment we can only redirect
2384 calls, so we need infrastructure for renaming references as well. */
2385#ifndef ASM_OUTPUT_WEAKREF
5e20cdc9 2386 symtab_node *node;
38e55e5c
JH
2387
2388 FOR_EACH_SYMBOL (node)
67348ccc
DM
2389 if (node->alias
2390 && lookup_attribute ("weakref", DECL_ATTRIBUTES (node->decl)))
38e55e5c
JH
2391 {
2392 IDENTIFIER_TRANSPARENT_ALIAS
67348ccc
DM
2393 (DECL_ASSEMBLER_NAME (node->decl)) = 1;
2394 TREE_CHAIN (DECL_ASSEMBLER_NAME (node->decl))
2395 = (node->alias_target ? node->alias_target
dacd445e 2396 : DECL_ASSEMBLER_NAME (node->get_alias_target ()->decl));
38e55e5c
JH
2397 }
2398#endif
2399
3dafb85c 2400 state = EXPANSION;
9cec31f4 2401
711417cd 2402 if (!flag_toplevel_reorder)
7861b648 2403 output_in_order (false);
711417cd
RG
2404 else
2405 {
7861b648
AK
2406 /* Output first asm statements and anything ordered. The process
2407 flag is cleared for these nodes, so we skip them later. */
2408 output_in_order (true);
65d630d4 2409 expand_all_functions ();
3dafb85c 2410 output_variables ();
711417cd
RG
2411 }
2412
3dafb85c
ML
2413 process_new_functions ();
2414 state = FINISHED;
07250f0e 2415 output_weakrefs ();
711417cd 2416
3dafb85c 2417 if (dump_file)
711417cd 2418 {
3dafb85c
ML
2419 fprintf (dump_file, "\nFinal ");
2420 symtab_node::dump_table (dump_file);
711417cd
RG
2421 }
2422#ifdef ENABLE_CHECKING
d52f5295 2423 symtab_node::verify_symtab_nodes ();
711417cd
RG
2424 /* Double check that all inline clones are gone and that all
2425 function bodies have been released from memory. */
2426 if (!seen_error ())
2427 {
3dafb85c 2428 cgraph_node *node;
711417cd
RG
2429 bool error_found = false;
2430
65c70e6b
JH
2431 FOR_EACH_DEFINED_FUNCTION (node)
2432 if (node->global.inlined_to
67348ccc 2433 || gimple_has_body_p (node->decl))
711417cd
RG
2434 {
2435 error_found = true;
d52f5295 2436 node->debug ();
711417cd
RG
2437 }
2438 if (error_found)
2439 internal_error ("nodes with unreleased memory found");
2440 }
2441#endif
2442}
2443
2444
2445/* Analyze the whole compilation unit once it is parsed completely. */
2446
2447void
3dafb85c 2448symbol_table::finalize_compilation_unit (void)
711417cd
RG
2449{
2450 timevar_push (TV_CGRAPH);
2451
711417cd
RG
2452 /* If we're here there's no current function anymore. Some frontends
2453 are lazy in clearing these. */
2454 current_function_decl = NULL;
2455 set_cfun (NULL);
2456
2457 /* Do not skip analyzing the functions if there were errors, we
2458 miss diagnostics for following functions otherwise. */
2459
2460 /* Emit size functions we didn't inline. */
2461 finalize_size_functions ();
2462
2463 /* Mark alias targets necessary and emit diagnostics. */
711417cd
RG
2464 handle_alias_pairs ();
2465
2466 if (!quiet_flag)
2467 {
2468 fprintf (stderr, "\nAnalyzing compilation unit\n");
2469 fflush (stderr);
2470 }
2471
2472 if (flag_dump_passes)
2473 dump_passes ();
2474
2475 /* Gimplify and lower all functions, compute reachability and
2476 remove unreachable nodes. */
d7438551 2477 analyze_functions (/*first_time=*/true);
711417cd
RG
2478
2479 /* Mark alias targets necessary and emit diagnostics. */
711417cd
RG
2480 handle_alias_pairs ();
2481
2482 /* Gimplify and lower thunks. */
d7438551
AH
2483 analyze_functions (/*first_time=*/false);
2484
9ba01f82
RB
2485 if (!seen_error ())
2486 {
2487 /* Emit early debug for reachable functions, and by consequence,
2488 locally scoped symbols. */
2489 struct cgraph_node *cnode;
2490 FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (cnode)
2491 (*debug_hooks->early_global_decl) (cnode->decl);
2492
2493 /* Clean up anything that needs cleaning up after initial debug
2494 generation. */
2495 (*debug_hooks->early_finish) ();
2496 }
2497
711417cd 2498 /* Finally drive the pass manager. */
65d630d4 2499 compile ();
711417cd
RG
2500
2501 timevar_pop (TV_CGRAPH);
2502}
2503
3edf64aa
DM
2504/* Reset all state within cgraphunit.c so that we can rerun the compiler
2505 within the same process. For use by toplev::finalize. */
2506
2507void
2508cgraphunit_c_finalize (void)
2509{
2510 gcc_assert (cgraph_new_nodes.length () == 0);
2511 cgraph_new_nodes.truncate (0);
2512
2513 vtable_entry_type = NULL;
2514 queued_nodes = &symtab_terminator;
2515
2516 first_analyzed = NULL;
2517 first_analyzed_var = NULL;
2518}
2519
d52f5295 2520/* Creates a wrapper from cgraph_node to TARGET node. Thunk is used for this
8be2dc8c
ML
2521 kind of wrapper method. */
2522
2523void
3dafb85c 2524cgraph_node::create_wrapper (cgraph_node *target)
8be2dc8c 2525{
3f9f4ae7
ML
2526 /* Preserve DECL_RESULT so we get right by reference flag. */
2527 tree decl_result = DECL_RESULT (decl);
8be2dc8c 2528
3f9f4ae7
ML
2529 /* Remove the function's body but keep arguments to be reused
2530 for thunk. */
2531 release_body (true);
2532 reset ();
8be2dc8c 2533
0a7246ee 2534 DECL_UNINLINABLE (decl) = false;
3f9f4ae7
ML
2535 DECL_RESULT (decl) = decl_result;
2536 DECL_INITIAL (decl) = NULL;
2537 allocate_struct_function (decl, false);
2538 set_cfun (NULL);
8be2dc8c 2539
3f9f4ae7
ML
2540 /* Turn alias into thunk and expand it into GIMPLE representation. */
2541 definition = true;
e68287df
ML
2542
2543 memset (&thunk, 0, sizeof (cgraph_thunk_info));
3f9f4ae7 2544 thunk.thunk_p = true;
10881cff 2545 create_edge (target, NULL, count, CGRAPH_FREQ_BASE);
8be2dc8c 2546
3f9f4ae7 2547 tree arguments = DECL_ARGUMENTS (decl);
d862b343 2548
3f9f4ae7
ML
2549 while (arguments)
2550 {
2551 TREE_ADDRESSABLE (arguments) = false;
2552 arguments = TREE_CHAIN (arguments);
2553 }
d862b343 2554
3f9f4ae7 2555 expand_thunk (false, true);
8be2dc8c 2556
3f9f4ae7
ML
2557 /* Inline summary set-up. */
2558 analyze ();
2559 inline_analyze_function (this);
8be2dc8c 2560}
711417cd 2561
7be82279 2562#include "gt-cgraphunit.h"