lto.cc revision 1.1.1.1 1 1.1 mrg /* Top-level LTO routines.
2 1.1 mrg Copyright (C) 2009-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by CodeSourcery, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg #include "config.h"
22 1.1 mrg #include "system.h"
23 1.1 mrg #include "coretypes.h"
24 1.1 mrg #include "tm.h"
25 1.1 mrg #include "function.h"
26 1.1 mrg #include "bitmap.h"
27 1.1 mrg #include "basic-block.h"
28 1.1 mrg #include "tree.h"
29 1.1 mrg #include "gimple.h"
30 1.1 mrg #include "cfghooks.h"
31 1.1 mrg #include "alloc-pool.h"
32 1.1 mrg #include "tree-pass.h"
33 1.1 mrg #include "tree-streamer.h"
34 1.1 mrg #include "cgraph.h"
35 1.1 mrg #include "opts.h"
36 1.1 mrg #include "toplev.h"
37 1.1 mrg #include "stor-layout.h"
38 1.1 mrg #include "symbol-summary.h"
39 1.1 mrg #include "tree-vrp.h"
40 1.1 mrg #include "ipa-prop.h"
41 1.1 mrg #include "debug.h"
42 1.1 mrg #include "lto.h"
43 1.1 mrg #include "lto-section-names.h"
44 1.1 mrg #include "splay-tree.h"
45 1.1 mrg #include "lto-partition.h"
46 1.1 mrg #include "context.h"
47 1.1 mrg #include "pass_manager.h"
48 1.1 mrg #include "ipa-fnsummary.h"
49 1.1 mrg #include "ipa-utils.h"
50 1.1 mrg #include "gomp-constants.h"
51 1.1 mrg #include "lto-symtab.h"
52 1.1 mrg #include "stringpool.h"
53 1.1 mrg #include "fold-const.h"
54 1.1 mrg #include "attribs.h"
55 1.1 mrg #include "builtins.h"
56 1.1 mrg #include "lto-common.h"
57 1.1 mrg
58 1.1 mrg
59 1.1 mrg /* Number of parallel tasks to run, -1 if we want to use GNU Make jobserver. */
60 1.1 mrg static int lto_parallelism;
61 1.1 mrg
62 1.1 mrg /* Return true when NODE has a clone that is analyzed (i.e. we need
63 1.1 mrg to load its body even if the node itself is not needed). */
64 1.1 mrg
65 1.1 mrg static bool
66 1.1 mrg has_analyzed_clone_p (struct cgraph_node *node)
67 1.1 mrg {
68 1.1 mrg struct cgraph_node *orig = node;
69 1.1 mrg node = node->clones;
70 1.1 mrg if (node)
71 1.1 mrg while (node != orig)
72 1.1 mrg {
73 1.1 mrg if (node->analyzed)
74 1.1 mrg return true;
75 1.1 mrg if (node->clones)
76 1.1 mrg node = node->clones;
77 1.1 mrg else if (node->next_sibling_clone)
78 1.1 mrg node = node->next_sibling_clone;
79 1.1 mrg else
80 1.1 mrg {
81 1.1 mrg while (node != orig && !node->next_sibling_clone)
82 1.1 mrg node = node->clone_of;
83 1.1 mrg if (node != orig)
84 1.1 mrg node = node->next_sibling_clone;
85 1.1 mrg }
86 1.1 mrg }
87 1.1 mrg return false;
88 1.1 mrg }
89 1.1 mrg
90 1.1 mrg /* Read the function body for the function associated with NODE. */
91 1.1 mrg
92 1.1 mrg static void
93 1.1 mrg lto_materialize_function (struct cgraph_node *node)
94 1.1 mrg {
95 1.1 mrg tree decl;
96 1.1 mrg
97 1.1 mrg decl = node->decl;
98 1.1 mrg /* Read in functions with body (analyzed nodes)
99 1.1 mrg and also functions that are needed to produce virtual clones. */
100 1.1 mrg if ((node->has_gimple_body_p () && node->analyzed)
101 1.1 mrg || node->used_as_abstract_origin
102 1.1 mrg || has_analyzed_clone_p (node))
103 1.1 mrg {
104 1.1 mrg /* Clones don't need to be read. */
105 1.1 mrg if (node->clone_of)
106 1.1 mrg return;
107 1.1 mrg if (DECL_FUNCTION_PERSONALITY (decl) && !first_personality_decl)
108 1.1 mrg first_personality_decl = DECL_FUNCTION_PERSONALITY (decl);
109 1.1 mrg /* If the file contains a function with a language specific EH
110 1.1 mrg personality set or with EH enabled initialize the backend EH
111 1.1 mrg machinery. */
112 1.1 mrg if (DECL_FUNCTION_PERSONALITY (decl)
113 1.1 mrg || opt_for_fn (decl, flag_exceptions))
114 1.1 mrg lto_init_eh ();
115 1.1 mrg }
116 1.1 mrg
117 1.1 mrg /* Let the middle end know about the function. */
118 1.1 mrg rest_of_decl_compilation (decl, 1, 0);
119 1.1 mrg }
120 1.1 mrg
121 1.1 mrg /* Materialize all the bodies for all the nodes in the callgraph. */
122 1.1 mrg
123 1.1 mrg static void
124 1.1 mrg materialize_cgraph (void)
125 1.1 mrg {
126 1.1 mrg struct cgraph_node *node;
127 1.1 mrg timevar_id_t lto_timer;
128 1.1 mrg
129 1.1 mrg if (!quiet_flag)
130 1.1 mrg fprintf (stderr,
131 1.1 mrg flag_wpa ? "Materializing decls:" : "Reading function bodies:");
132 1.1 mrg
133 1.1 mrg
134 1.1 mrg FOR_EACH_FUNCTION (node)
135 1.1 mrg {
136 1.1 mrg if (node->lto_file_data)
137 1.1 mrg {
138 1.1 mrg lto_materialize_function (node);
139 1.1 mrg lto_stats.num_input_cgraph_nodes++;
140 1.1 mrg }
141 1.1 mrg }
142 1.1 mrg
143 1.1 mrg
144 1.1 mrg /* Start the appropriate timer depending on the mode that we are
145 1.1 mrg operating in. */
146 1.1 mrg lto_timer = (flag_wpa) ? TV_WHOPR_WPA
147 1.1 mrg : (flag_ltrans) ? TV_WHOPR_LTRANS
148 1.1 mrg : TV_LTO;
149 1.1 mrg timevar_push (lto_timer);
150 1.1 mrg
151 1.1 mrg current_function_decl = NULL;
152 1.1 mrg set_cfun (NULL);
153 1.1 mrg
154 1.1 mrg if (!quiet_flag)
155 1.1 mrg fprintf (stderr, "\n");
156 1.1 mrg
157 1.1 mrg timevar_pop (lto_timer);
158 1.1 mrg }
159 1.1 mrg
160 1.1 mrg /* Actually stream out ENCODER into TEMP_FILENAME. */
161 1.1 mrg
162 1.1 mrg static void
163 1.1 mrg stream_out (char *temp_filename, lto_symtab_encoder_t encoder, int part)
164 1.1 mrg {
165 1.1 mrg lto_file *file = lto_obj_file_open (temp_filename, true);
166 1.1 mrg if (!file)
167 1.1 mrg fatal_error (input_location, "%<lto_obj_file_open()%> failed");
168 1.1 mrg lto_set_current_out_file (file);
169 1.1 mrg
170 1.1 mrg gcc_assert (!dump_file);
171 1.1 mrg streamer_dump_file = dump_begin (TDI_lto_stream_out, NULL, part);
172 1.1 mrg ipa_write_optimization_summaries (encoder);
173 1.1 mrg
174 1.1 mrg free (CONST_CAST (char *, file->filename));
175 1.1 mrg
176 1.1 mrg lto_set_current_out_file (NULL);
177 1.1 mrg lto_obj_file_close (file);
178 1.1 mrg free (file);
179 1.1 mrg if (streamer_dump_file)
180 1.1 mrg {
181 1.1 mrg dump_end (TDI_lto_stream_out, streamer_dump_file);
182 1.1 mrg streamer_dump_file = NULL;
183 1.1 mrg }
184 1.1 mrg }
185 1.1 mrg
186 1.1 mrg /* Wait for forked process and signal errors. */
187 1.1 mrg #ifdef HAVE_WORKING_FORK
188 1.1 mrg static void
189 1.1 mrg wait_for_child ()
190 1.1 mrg {
191 1.1 mrg int status;
192 1.1 mrg do
193 1.1 mrg {
194 1.1 mrg #ifndef WCONTINUED
195 1.1 mrg #define WCONTINUED 0
196 1.1 mrg #endif
197 1.1 mrg int w = waitpid (0, &status, WUNTRACED | WCONTINUED);
198 1.1 mrg if (w == -1)
199 1.1 mrg fatal_error (input_location, "waitpid failed");
200 1.1 mrg
201 1.1 mrg if (WIFEXITED (status) && WEXITSTATUS (status))
202 1.1 mrg fatal_error (input_location, "streaming subprocess failed");
203 1.1 mrg else if (WIFSIGNALED (status))
204 1.1 mrg fatal_error (input_location,
205 1.1 mrg "streaming subprocess was killed by signal");
206 1.1 mrg }
207 1.1 mrg while (!WIFEXITED (status) && !WIFSIGNALED (status));
208 1.1 mrg }
209 1.1 mrg #endif
210 1.1 mrg
211 1.1 mrg static void
212 1.1 mrg stream_out_partitions_1 (char *temp_filename, int blen, int min, int max)
213 1.1 mrg {
214 1.1 mrg /* Write all the nodes in SET. */
215 1.1 mrg for (int p = min; p < max; p ++)
216 1.1 mrg {
217 1.1 mrg sprintf (temp_filename + blen, "%u.o", p);
218 1.1 mrg stream_out (temp_filename, ltrans_partitions[p]->encoder, p);
219 1.1 mrg ltrans_partitions[p]->encoder = NULL;
220 1.1 mrg }
221 1.1 mrg }
222 1.1 mrg
223 1.1 mrg /* Stream out ENCODER into TEMP_FILENAME
224 1.1 mrg Fork if that seems to help. */
225 1.1 mrg
226 1.1 mrg static void
227 1.1 mrg stream_out_partitions (char *temp_filename, int blen, int min, int max,
228 1.1 mrg bool ARG_UNUSED (last))
229 1.1 mrg {
230 1.1 mrg #ifdef HAVE_WORKING_FORK
231 1.1 mrg static int nruns;
232 1.1 mrg
233 1.1 mrg if (lto_parallelism <= 1)
234 1.1 mrg {
235 1.1 mrg stream_out_partitions_1 (temp_filename, blen, min, max);
236 1.1 mrg return;
237 1.1 mrg }
238 1.1 mrg
239 1.1 mrg /* Do not run more than LTO_PARALLELISM streamings
240 1.1 mrg FIXME: we ignore limits on jobserver. */
241 1.1 mrg if (lto_parallelism > 0 && nruns >= lto_parallelism)
242 1.1 mrg {
243 1.1 mrg wait_for_child ();
244 1.1 mrg nruns --;
245 1.1 mrg }
246 1.1 mrg /* If this is not the last parallel partition, execute new
247 1.1 mrg streaming process. */
248 1.1 mrg if (!last)
249 1.1 mrg {
250 1.1 mrg pid_t cpid = fork ();
251 1.1 mrg
252 1.1 mrg if (!cpid)
253 1.1 mrg {
254 1.1 mrg setproctitle ("lto1-wpa-streaming");
255 1.1 mrg stream_out_partitions_1 (temp_filename, blen, min, max);
256 1.1 mrg exit (0);
257 1.1 mrg }
258 1.1 mrg /* Fork failed; lets do the job ourseleves. */
259 1.1 mrg else if (cpid == -1)
260 1.1 mrg stream_out_partitions_1 (temp_filename, blen, min, max);
261 1.1 mrg else
262 1.1 mrg nruns++;
263 1.1 mrg }
264 1.1 mrg /* Last partition; stream it and wait for all children to die. */
265 1.1 mrg else
266 1.1 mrg {
267 1.1 mrg int i;
268 1.1 mrg stream_out_partitions_1 (temp_filename, blen, min, max);
269 1.1 mrg for (i = 0; i < nruns; i++)
270 1.1 mrg wait_for_child ();
271 1.1 mrg }
272 1.1 mrg asm_nodes_output = true;
273 1.1 mrg #else
274 1.1 mrg stream_out_partitions_1 (temp_filename, blen, min, max);
275 1.1 mrg #endif
276 1.1 mrg }
277 1.1 mrg
278 1.1 mrg /* Write all output files in WPA mode and the file with the list of
279 1.1 mrg LTRANS units. */
280 1.1 mrg
281 1.1 mrg static void
282 1.1 mrg lto_wpa_write_files (void)
283 1.1 mrg {
284 1.1 mrg unsigned i, n_sets;
285 1.1 mrg ltrans_partition part;
286 1.1 mrg FILE *ltrans_output_list_stream;
287 1.1 mrg char *temp_filename;
288 1.1 mrg auto_vec <char *>temp_filenames;
289 1.1 mrg auto_vec <int>temp_priority;
290 1.1 mrg size_t blen;
291 1.1 mrg
292 1.1 mrg /* Open the LTRANS output list. */
293 1.1 mrg if (!ltrans_output_list)
294 1.1 mrg fatal_error (input_location, "no LTRANS output list filename provided");
295 1.1 mrg
296 1.1 mrg timevar_push (TV_WHOPR_WPA);
297 1.1 mrg
298 1.1 mrg FOR_EACH_VEC_ELT (ltrans_partitions, i, part)
299 1.1 mrg lto_stats.num_output_symtab_nodes
300 1.1 mrg += lto_symtab_encoder_size (part->encoder);
301 1.1 mrg
302 1.1 mrg timevar_pop (TV_WHOPR_WPA);
303 1.1 mrg
304 1.1 mrg timevar_push (TV_WHOPR_WPA_IO);
305 1.1 mrg
306 1.1 mrg cgraph_node *node;
307 1.1 mrg /* Do body modifications needed for streaming before we fork out
308 1.1 mrg worker processes. */
309 1.1 mrg FOR_EACH_FUNCTION (node)
310 1.1 mrg if (!node->clone_of && gimple_has_body_p (node->decl))
311 1.1 mrg lto_prepare_function_for_streaming (node);
312 1.1 mrg
313 1.1 mrg ggc_trim ();
314 1.1 mrg report_heap_memory_use ();
315 1.1 mrg
316 1.1 mrg /* Generate a prefix for the LTRANS unit files. */
317 1.1 mrg blen = strlen (ltrans_output_list);
318 1.1 mrg temp_filename = (char *) xmalloc (blen + sizeof ("2147483648.o"));
319 1.1 mrg strcpy (temp_filename, ltrans_output_list);
320 1.1 mrg if (blen > sizeof (".out")
321 1.1 mrg && strcmp (temp_filename + blen - sizeof (".out") + 1,
322 1.1 mrg ".out") == 0)
323 1.1 mrg temp_filename[blen - sizeof (".out") + 1] = '\0';
324 1.1 mrg blen = strlen (temp_filename);
325 1.1 mrg
326 1.1 mrg n_sets = ltrans_partitions.length ();
327 1.1 mrg unsigned sets_per_worker = n_sets;
328 1.1 mrg if (lto_parallelism > 1)
329 1.1 mrg {
330 1.1 mrg if (lto_parallelism > (int)n_sets)
331 1.1 mrg lto_parallelism = n_sets;
332 1.1 mrg sets_per_worker = (n_sets + lto_parallelism - 1) / lto_parallelism;
333 1.1 mrg }
334 1.1 mrg
335 1.1 mrg for (i = 0; i < n_sets; i++)
336 1.1 mrg {
337 1.1 mrg ltrans_partition part = ltrans_partitions[i];
338 1.1 mrg
339 1.1 mrg /* Write all the nodes in SET. */
340 1.1 mrg sprintf (temp_filename + blen, "%u.o", i);
341 1.1 mrg
342 1.1 mrg if (!quiet_flag)
343 1.1 mrg fprintf (stderr, " %s (%s %i insns)", temp_filename, part->name,
344 1.1 mrg part->insns);
345 1.1 mrg if (symtab->dump_file)
346 1.1 mrg {
347 1.1 mrg lto_symtab_encoder_iterator lsei;
348 1.1 mrg
349 1.1 mrg fprintf (symtab->dump_file,
350 1.1 mrg "Writing partition %s to file %s, %i insns\n",
351 1.1 mrg part->name, temp_filename, part->insns);
352 1.1 mrg fprintf (symtab->dump_file, " Symbols in partition: ");
353 1.1 mrg for (lsei = lsei_start_in_partition (part->encoder);
354 1.1 mrg !lsei_end_p (lsei);
355 1.1 mrg lsei_next_in_partition (&lsei))
356 1.1 mrg {
357 1.1 mrg symtab_node *node = lsei_node (lsei);
358 1.1 mrg fprintf (symtab->dump_file, "%s ", node->dump_asm_name ());
359 1.1 mrg }
360 1.1 mrg fprintf (symtab->dump_file, "\n Symbols in boundary: ");
361 1.1 mrg for (lsei = lsei_start (part->encoder); !lsei_end_p (lsei);
362 1.1 mrg lsei_next (&lsei))
363 1.1 mrg {
364 1.1 mrg symtab_node *node = lsei_node (lsei);
365 1.1 mrg if (!lto_symtab_encoder_in_partition_p (part->encoder, node))
366 1.1 mrg {
367 1.1 mrg fprintf (symtab->dump_file, "%s ", node->dump_asm_name ());
368 1.1 mrg cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
369 1.1 mrg if (cnode
370 1.1 mrg && lto_symtab_encoder_encode_body_p (part->encoder,
371 1.1 mrg cnode))
372 1.1 mrg fprintf (symtab->dump_file, "(body included)");
373 1.1 mrg else
374 1.1 mrg {
375 1.1 mrg varpool_node *vnode = dyn_cast <varpool_node *> (node);
376 1.1 mrg if (vnode
377 1.1 mrg && lto_symtab_encoder_encode_initializer_p (part->encoder,
378 1.1 mrg vnode))
379 1.1 mrg fprintf (symtab->dump_file, "(initializer included)");
380 1.1 mrg }
381 1.1 mrg }
382 1.1 mrg }
383 1.1 mrg fprintf (symtab->dump_file, "\n");
384 1.1 mrg }
385 1.1 mrg gcc_checking_assert (lto_symtab_encoder_size (part->encoder) || !i);
386 1.1 mrg
387 1.1 mrg temp_priority.safe_push (part->insns);
388 1.1 mrg temp_filenames.safe_push (xstrdup (temp_filename));
389 1.1 mrg }
390 1.1 mrg memory_block_pool::trim (0);
391 1.1 mrg
392 1.1 mrg for (int set = 0; set < MAX (lto_parallelism, 1); set++)
393 1.1 mrg {
394 1.1 mrg stream_out_partitions (temp_filename, blen, set * sets_per_worker,
395 1.1 mrg MIN ((set + 1) * sets_per_worker, n_sets),
396 1.1 mrg set == MAX (lto_parallelism, 1) - 1);
397 1.1 mrg }
398 1.1 mrg
399 1.1 mrg ltrans_output_list_stream = fopen (ltrans_output_list, "w");
400 1.1 mrg if (ltrans_output_list_stream == NULL)
401 1.1 mrg fatal_error (input_location,
402 1.1 mrg "opening LTRANS output list %s: %m", ltrans_output_list);
403 1.1 mrg for (i = 0; i < n_sets; i++)
404 1.1 mrg {
405 1.1 mrg unsigned int len = strlen (temp_filenames[i]);
406 1.1 mrg if (fprintf (ltrans_output_list_stream, "%i\n", temp_priority[i]) < 0
407 1.1 mrg || fwrite (temp_filenames[i], 1, len, ltrans_output_list_stream) < len
408 1.1 mrg || fwrite ("\n", 1, 1, ltrans_output_list_stream) < 1)
409 1.1 mrg fatal_error (input_location, "writing to LTRANS output list %s: %m",
410 1.1 mrg ltrans_output_list);
411 1.1 mrg free (temp_filenames[i]);
412 1.1 mrg }
413 1.1 mrg
414 1.1 mrg lto_stats.num_output_files += n_sets;
415 1.1 mrg
416 1.1 mrg /* Close the LTRANS output list. */
417 1.1 mrg if (fclose (ltrans_output_list_stream))
418 1.1 mrg fatal_error (input_location,
419 1.1 mrg "closing LTRANS output list %s: %m", ltrans_output_list);
420 1.1 mrg
421 1.1 mrg free_ltrans_partitions ();
422 1.1 mrg free (temp_filename);
423 1.1 mrg
424 1.1 mrg timevar_pop (TV_WHOPR_WPA_IO);
425 1.1 mrg }
426 1.1 mrg
427 1.1 mrg /* Create artificial pointers for "omp declare target link" vars. */
428 1.1 mrg
429 1.1 mrg static void
430 1.1 mrg offload_handle_link_vars (void)
431 1.1 mrg {
432 1.1 mrg #ifdef ACCEL_COMPILER
433 1.1 mrg varpool_node *var;
434 1.1 mrg FOR_EACH_VARIABLE (var)
435 1.1 mrg if (lookup_attribute ("omp declare target link",
436 1.1 mrg DECL_ATTRIBUTES (var->decl)))
437 1.1 mrg {
438 1.1 mrg tree type = build_pointer_type (TREE_TYPE (var->decl));
439 1.1 mrg tree link_ptr_var = build_decl (UNKNOWN_LOCATION, VAR_DECL,
440 1.1 mrg clone_function_name (var->decl,
441 1.1 mrg "linkptr"), type);
442 1.1 mrg TREE_USED (link_ptr_var) = 1;
443 1.1 mrg TREE_STATIC (link_ptr_var) = 1;
444 1.1 mrg TREE_PUBLIC (link_ptr_var) = TREE_PUBLIC (var->decl);
445 1.1 mrg DECL_ARTIFICIAL (link_ptr_var) = 1;
446 1.1 mrg SET_DECL_ASSEMBLER_NAME (link_ptr_var, DECL_NAME (link_ptr_var));
447 1.1 mrg SET_DECL_VALUE_EXPR (var->decl, build_simple_mem_ref (link_ptr_var));
448 1.1 mrg DECL_HAS_VALUE_EXPR_P (var->decl) = 1;
449 1.1 mrg }
450 1.1 mrg #endif
451 1.1 mrg }
452 1.1 mrg
453 1.1 mrg /* Perform whole program analysis (WPA) on the callgraph and write out the
454 1.1 mrg optimization plan. */
455 1.1 mrg
456 1.1 mrg static void
457 1.1 mrg do_whole_program_analysis (void)
458 1.1 mrg {
459 1.1 mrg symtab_node *node;
460 1.1 mrg
461 1.1 mrg lto_parallelism = 1;
462 1.1 mrg
463 1.1 mrg /* TODO: jobserver communication is not supported, yet. */
464 1.1 mrg if (!strcmp (flag_wpa, "jobserver"))
465 1.1 mrg lto_parallelism = param_max_lto_streaming_parallelism;
466 1.1 mrg else
467 1.1 mrg {
468 1.1 mrg lto_parallelism = atoi (flag_wpa);
469 1.1 mrg if (lto_parallelism <= 0)
470 1.1 mrg lto_parallelism = 0;
471 1.1 mrg if (lto_parallelism >= param_max_lto_streaming_parallelism)
472 1.1 mrg lto_parallelism = param_max_lto_streaming_parallelism;
473 1.1 mrg }
474 1.1 mrg
475 1.1 mrg timevar_start (TV_PHASE_OPT_GEN);
476 1.1 mrg
477 1.1 mrg /* Note that since we are in WPA mode, materialize_cgraph will not
478 1.1 mrg actually read in all the function bodies. It only materializes
479 1.1 mrg the decls and cgraph nodes so that analysis can be performed. */
480 1.1 mrg materialize_cgraph ();
481 1.1 mrg
482 1.1 mrg /* Reading in the cgraph uses different timers, start timing WPA now. */
483 1.1 mrg timevar_push (TV_WHOPR_WPA);
484 1.1 mrg
485 1.1 mrg if (pre_ipa_mem_report)
486 1.1 mrg dump_memory_report ("Memory consumption before IPA");
487 1.1 mrg
488 1.1 mrg symtab->function_flags_ready = true;
489 1.1 mrg
490 1.1 mrg if (symtab->dump_file)
491 1.1 mrg symtab->dump (symtab->dump_file);
492 1.1 mrg bitmap_obstack_initialize (NULL);
493 1.1 mrg symtab->state = IPA_SSA;
494 1.1 mrg
495 1.1 mrg execute_ipa_pass_list (g->get_passes ()->all_regular_ipa_passes);
496 1.1 mrg
497 1.1 mrg /* When WPA analysis raises errors, do not bother to output anything. */
498 1.1 mrg if (seen_error ())
499 1.1 mrg return;
500 1.1 mrg
501 1.1 mrg /* We are about to launch the final LTRANS phase, stop the WPA timer. */
502 1.1 mrg timevar_pop (TV_WHOPR_WPA);
503 1.1 mrg
504 1.1 mrg /* We are no longer going to stream in anything. Free some memory. */
505 1.1 mrg lto_free_file_name_hash ();
506 1.1 mrg
507 1.1 mrg
508 1.1 mrg timevar_push (TV_WHOPR_PARTITIONING);
509 1.1 mrg
510 1.1 mrg gcc_assert (!dump_file);
511 1.1 mrg dump_file = dump_begin (partition_dump_id, NULL);
512 1.1 mrg
513 1.1 mrg if (dump_file)
514 1.1 mrg symtab->dump (dump_file);
515 1.1 mrg
516 1.1 mrg symtab_node::checking_verify_symtab_nodes ();
517 1.1 mrg bitmap_obstack_release (NULL);
518 1.1 mrg if (flag_lto_partition == LTO_PARTITION_1TO1)
519 1.1 mrg lto_1_to_1_map ();
520 1.1 mrg else if (flag_lto_partition == LTO_PARTITION_MAX)
521 1.1 mrg lto_max_map ();
522 1.1 mrg else if (flag_lto_partition == LTO_PARTITION_ONE)
523 1.1 mrg lto_balanced_map (1, INT_MAX);
524 1.1 mrg else if (flag_lto_partition == LTO_PARTITION_BALANCED)
525 1.1 mrg lto_balanced_map (param_lto_partitions,
526 1.1 mrg param_max_partition_size);
527 1.1 mrg else
528 1.1 mrg gcc_unreachable ();
529 1.1 mrg
530 1.1 mrg /* Size summaries are needed for balanced partitioning. Free them now so
531 1.1 mrg the memory can be used for streamer caches. */
532 1.1 mrg ipa_free_size_summary ();
533 1.1 mrg
534 1.1 mrg /* AUX pointers are used by partitioning code to bookkeep number of
535 1.1 mrg partitions symbol is in. This is no longer needed. */
536 1.1 mrg FOR_EACH_SYMBOL (node)
537 1.1 mrg node->aux = NULL;
538 1.1 mrg
539 1.1 mrg lto_stats.num_cgraph_partitions += ltrans_partitions.length ();
540 1.1 mrg
541 1.1 mrg /* Find out statics that need to be promoted
542 1.1 mrg to globals with hidden visibility because they are accessed from multiple
543 1.1 mrg partitions. */
544 1.1 mrg lto_promote_cross_file_statics ();
545 1.1 mrg offload_handle_link_vars ();
546 1.1 mrg if (dump_file)
547 1.1 mrg dump_end (partition_dump_id, dump_file);
548 1.1 mrg dump_file = NULL;
549 1.1 mrg timevar_pop (TV_WHOPR_PARTITIONING);
550 1.1 mrg
551 1.1 mrg timevar_stop (TV_PHASE_OPT_GEN);
552 1.1 mrg
553 1.1 mrg /* Collect a last time - in lto_wpa_write_files we may end up forking
554 1.1 mrg with the idea that this doesn't increase memory usage. So we
555 1.1 mrg absoultely do not want to collect after that. */
556 1.1 mrg ggc_collect ();
557 1.1 mrg
558 1.1 mrg timevar_start (TV_PHASE_STREAM_OUT);
559 1.1 mrg if (!quiet_flag)
560 1.1 mrg {
561 1.1 mrg fprintf (stderr, "\nStreaming out");
562 1.1 mrg fflush (stderr);
563 1.1 mrg }
564 1.1 mrg lto_wpa_write_files ();
565 1.1 mrg if (!quiet_flag)
566 1.1 mrg fprintf (stderr, "\n");
567 1.1 mrg timevar_stop (TV_PHASE_STREAM_OUT);
568 1.1 mrg
569 1.1 mrg if (post_ipa_mem_report)
570 1.1 mrg dump_memory_report ("Memory consumption after IPA");
571 1.1 mrg
572 1.1 mrg /* Show the LTO report before launching LTRANS. */
573 1.1 mrg if (flag_lto_report || (flag_wpa && flag_lto_report_wpa))
574 1.1 mrg print_lto_report_1 ();
575 1.1 mrg if (mem_report_wpa)
576 1.1 mrg dump_memory_report ("Final");
577 1.1 mrg }
578 1.1 mrg
579 1.1 mrg unsigned int
580 1.1 mrg lto_option_lang_mask (void)
581 1.1 mrg {
582 1.1 mrg return CL_LTO;
583 1.1 mrg }
584 1.1 mrg
585 1.1 mrg /* Main entry point for the GIMPLE front end. This front end has
586 1.1 mrg three main personalities:
587 1.1 mrg
588 1.1 mrg - LTO (-flto). All the object files on the command line are
589 1.1 mrg loaded in memory and processed as a single translation unit.
590 1.1 mrg This is the traditional link-time optimization behavior.
591 1.1 mrg
592 1.1 mrg - WPA (-fwpa). Only the callgraph and summary information for
593 1.1 mrg files in the command file are loaded. A single callgraph
594 1.1 mrg (without function bodies) is instantiated for the whole set of
595 1.1 mrg files. IPA passes are only allowed to analyze the call graph
596 1.1 mrg and make transformation decisions. The callgraph is
597 1.1 mrg partitioned, each partition is written to a new object file
598 1.1 mrg together with the transformation decisions.
599 1.1 mrg
600 1.1 mrg - LTRANS (-fltrans). Similar to -flto but it prevents the IPA
601 1.1 mrg summary files from running again. Since WPA computed summary
602 1.1 mrg information and decided what transformations to apply, LTRANS
603 1.1 mrg simply applies them. */
604 1.1 mrg
605 1.1 mrg void
606 1.1 mrg lto_main (void)
607 1.1 mrg {
608 1.1 mrg /* LTO is called as a front end, even though it is not a front end.
609 1.1 mrg Because it is called as a front end, TV_PHASE_PARSING and
610 1.1 mrg TV_PARSE_GLOBAL are active, and we need to turn them off while
611 1.1 mrg doing LTO. Later we turn them back on so they are active up in
612 1.1 mrg toplev.cc. */
613 1.1 mrg timevar_pop (TV_PARSE_GLOBAL);
614 1.1 mrg timevar_stop (TV_PHASE_PARSING);
615 1.1 mrg
616 1.1 mrg timevar_start (TV_PHASE_SETUP);
617 1.1 mrg
618 1.1 mrg /* Initialize the LTO front end. */
619 1.1 mrg lto_fe_init ();
620 1.1 mrg
621 1.1 mrg timevar_stop (TV_PHASE_SETUP);
622 1.1 mrg timevar_start (TV_PHASE_STREAM_IN);
623 1.1 mrg
624 1.1 mrg /* Read all the symbols and call graph from all the files in the
625 1.1 mrg command line. */
626 1.1 mrg read_cgraph_and_symbols (num_in_fnames, in_fnames);
627 1.1 mrg
628 1.1 mrg timevar_stop (TV_PHASE_STREAM_IN);
629 1.1 mrg
630 1.1 mrg if (!seen_error ())
631 1.1 mrg {
632 1.1 mrg offload_handle_link_vars ();
633 1.1 mrg
634 1.1 mrg /* If WPA is enabled analyze the whole call graph and create an
635 1.1 mrg optimization plan. Otherwise, read in all the function
636 1.1 mrg bodies and continue with optimization. */
637 1.1 mrg if (flag_wpa)
638 1.1 mrg do_whole_program_analysis ();
639 1.1 mrg else
640 1.1 mrg {
641 1.1 mrg timevar_start (TV_PHASE_OPT_GEN);
642 1.1 mrg
643 1.1 mrg materialize_cgraph ();
644 1.1 mrg if (!flag_ltrans)
645 1.1 mrg {
646 1.1 mrg lto_promote_statics_nonwpa ();
647 1.1 mrg offload_handle_link_vars ();
648 1.1 mrg }
649 1.1 mrg
650 1.1 mrg /* Annotate the CU DIE and mark the early debug phase as finished. */
651 1.1 mrg debuginfo_early_start ();
652 1.1 mrg debug_hooks->early_finish ("<artificial>");
653 1.1 mrg debuginfo_early_stop ();
654 1.1 mrg
655 1.1 mrg /* Let the middle end know that we have read and merged all of
656 1.1 mrg the input files. */
657 1.1 mrg symtab->compile ();
658 1.1 mrg
659 1.1 mrg timevar_stop (TV_PHASE_OPT_GEN);
660 1.1 mrg
661 1.1 mrg /* FIXME lto, if the processes spawned by WPA fail, we miss
662 1.1 mrg the chance to print WPA's report, so WPA will call
663 1.1 mrg print_lto_report before launching LTRANS. If LTRANS was
664 1.1 mrg launched directly by the driver we would not need to do
665 1.1 mrg this. */
666 1.1 mrg if (flag_lto_report || (flag_wpa && flag_lto_report_wpa))
667 1.1 mrg print_lto_report_1 ();
668 1.1 mrg }
669 1.1 mrg }
670 1.1 mrg
671 1.1 mrg /* Here we make LTO pretend to be a parser. */
672 1.1 mrg timevar_start (TV_PHASE_PARSING);
673 1.1 mrg timevar_push (TV_PARSE_GLOBAL);
674 1.1 mrg }
675