typeck.c (cp_truthvalue_conversion): Add tsubst_flags_t parameter and use it in calls...
[official-gcc.git] / gcc / lto-streamer-out.c
blobcf45cc3af6446f3da4c431374f6a3d7dcb3ea950
1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2019 Free Software Foundation, Inc.
4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5 Re-implemented by Diego Novillo <dnovillo@google.com>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "backend.h"
27 #include "target.h"
28 #include "rtl.h"
29 #include "tree.h"
30 #include "gimple.h"
31 #include "tree-pass.h"
32 #include "ssa.h"
33 #include "gimple-streamer.h"
34 #include "alias.h"
35 #include "stor-layout.h"
36 #include "gimple-iterator.h"
37 #include "except.h"
38 #include "lto-symtab.h"
39 #include "cgraph.h"
40 #include "cfgloop.h"
41 #include "builtins.h"
42 #include "gomp-constants.h"
43 #include "debug.h"
44 #include "omp-offload.h"
45 #include "print-tree.h"
46 #include "tree-dfa.h"
49 static void lto_write_tree (struct output_block*, tree, bool);
51 /* Clear the line info stored in DATA_IN. */
53 static void
54 clear_line_info (struct output_block *ob)
56 ob->current_file = NULL;
57 ob->current_line = 0;
58 ob->current_col = 0;
59 ob->current_sysp = false;
63 /* Create the output block and return it. SECTION_TYPE is
64 LTO_section_function_body or LTO_static_initializer. */
66 struct output_block *
67 create_output_block (enum lto_section_type section_type)
69 struct output_block *ob = XCNEW (struct output_block);
70 if (streamer_dump_file)
71 fprintf (streamer_dump_file, "Creating output block for %s\n",
72 lto_section_name [section_type]);
74 ob->section_type = section_type;
75 ob->decl_state = lto_get_out_decl_state ();
76 ob->main_stream = XCNEW (struct lto_output_stream);
77 ob->string_stream = XCNEW (struct lto_output_stream);
78 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
80 if (section_type == LTO_section_function_body)
81 ob->cfg_stream = XCNEW (struct lto_output_stream);
83 clear_line_info (ob);
85 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
86 gcc_obstack_init (&ob->obstack);
88 return ob;
92 /* Destroy the output block OB. */
94 void
95 destroy_output_block (struct output_block *ob)
97 enum lto_section_type section_type = ob->section_type;
99 delete ob->string_hash_table;
100 ob->string_hash_table = NULL;
102 free (ob->main_stream);
103 free (ob->string_stream);
104 if (section_type == LTO_section_function_body)
105 free (ob->cfg_stream);
107 streamer_tree_cache_delete (ob->writer_cache);
108 obstack_free (&ob->obstack, NULL);
110 free (ob);
114 /* Look up NODE in the type table and write the index for it to OB. */
116 static void
117 output_type_ref (struct output_block *ob, tree node)
119 streamer_write_record_start (ob, LTO_type_ref);
120 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
123 /* Wrapper around variably_modified_type_p avoiding type modification
124 during WPA streaming. */
126 static bool
127 lto_variably_modified_type_p (tree type)
129 return (in_lto_p
130 ? TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (type))
131 : variably_modified_type_p (type, NULL_TREE));
135 /* Return true if tree node T is written to various tables. For these
136 nodes, we sometimes want to write their phyiscal representation
137 (via lto_output_tree), and sometimes we need to emit an index
138 reference into a table (via lto_output_tree_ref). */
140 static bool
141 tree_is_indexable (tree t)
143 /* Parameters and return values of functions of variably modified types
144 must go to global stream, because they may be used in the type
145 definition. */
146 if ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
147 && DECL_CONTEXT (t))
148 return lto_variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)));
149 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared.
150 We should no longer need to stream it. */
151 else if (TREE_CODE (t) == IMPORTED_DECL)
152 gcc_unreachable ();
153 else if (TREE_CODE (t) == LABEL_DECL)
154 return FORCED_LABEL (t) || DECL_NONLOCAL (t);
155 else if (((VAR_P (t) && !TREE_STATIC (t))
156 || TREE_CODE (t) == TYPE_DECL
157 || TREE_CODE (t) == CONST_DECL
158 || TREE_CODE (t) == NAMELIST_DECL)
159 && decl_function_context (t))
160 return false;
161 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
162 return false;
163 /* Variably modified types need to be streamed alongside function
164 bodies because they can refer to local entities. Together with
165 them we have to localize their members as well.
166 ??? In theory that includes non-FIELD_DECLs as well. */
167 else if (TYPE_P (t)
168 && lto_variably_modified_type_p (t))
169 return false;
170 else if (TREE_CODE (t) == FIELD_DECL
171 && lto_variably_modified_type_p (DECL_CONTEXT (t)))
172 return false;
173 else
174 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
178 /* Output info about new location into bitpack BP.
179 After outputting bitpack, lto_output_location_data has
180 to be done to output actual data. */
182 void
183 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
184 location_t loc)
186 expanded_location xloc;
188 loc = LOCATION_LOCUS (loc);
189 bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT,
190 loc < RESERVED_LOCATION_COUNT
191 ? loc : RESERVED_LOCATION_COUNT);
192 if (loc < RESERVED_LOCATION_COUNT)
193 return;
195 xloc = expand_location (loc);
197 bp_pack_value (bp, ob->current_file != xloc.file, 1);
198 bp_pack_value (bp, ob->current_line != xloc.line, 1);
199 bp_pack_value (bp, ob->current_col != xloc.column, 1);
201 if (ob->current_file != xloc.file)
203 bp_pack_string (ob, bp, xloc.file, true);
204 bp_pack_value (bp, xloc.sysp, 1);
206 ob->current_file = xloc.file;
207 ob->current_sysp = xloc.sysp;
209 if (ob->current_line != xloc.line)
210 bp_pack_var_len_unsigned (bp, xloc.line);
211 ob->current_line = xloc.line;
213 if (ob->current_col != xloc.column)
214 bp_pack_var_len_unsigned (bp, xloc.column);
215 ob->current_col = xloc.column;
219 /* If EXPR is an indexable tree node, output a reference to it to
220 output block OB. Otherwise, output the physical representation of
221 EXPR to OB. */
223 static void
224 lto_output_tree_ref (struct output_block *ob, tree expr)
226 enum tree_code code;
228 if (TYPE_P (expr))
230 output_type_ref (ob, expr);
231 return;
234 code = TREE_CODE (expr);
235 switch (code)
237 case SSA_NAME:
238 streamer_write_record_start (ob, LTO_ssa_name_ref);
239 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
240 break;
242 case FIELD_DECL:
243 streamer_write_record_start (ob, LTO_field_decl_ref);
244 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
245 break;
247 case FUNCTION_DECL:
248 streamer_write_record_start (ob, LTO_function_decl_ref);
249 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
250 break;
252 case VAR_DECL:
253 case DEBUG_EXPR_DECL:
254 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
255 /* FALLTHRU */
256 case PARM_DECL:
257 streamer_write_record_start (ob, LTO_global_decl_ref);
258 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
259 break;
261 case CONST_DECL:
262 streamer_write_record_start (ob, LTO_const_decl_ref);
263 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
264 break;
266 case IMPORTED_DECL:
267 gcc_assert (decl_function_context (expr) == NULL);
268 streamer_write_record_start (ob, LTO_imported_decl_ref);
269 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
270 break;
272 case TYPE_DECL:
273 streamer_write_record_start (ob, LTO_type_decl_ref);
274 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
275 break;
277 case NAMELIST_DECL:
278 streamer_write_record_start (ob, LTO_namelist_decl_ref);
279 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
280 break;
282 case NAMESPACE_DECL:
283 streamer_write_record_start (ob, LTO_namespace_decl_ref);
284 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
285 break;
287 case LABEL_DECL:
288 streamer_write_record_start (ob, LTO_label_decl_ref);
289 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
290 break;
292 case RESULT_DECL:
293 streamer_write_record_start (ob, LTO_result_decl_ref);
294 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
295 break;
297 case TRANSLATION_UNIT_DECL:
298 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
299 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
300 break;
302 default:
303 /* No other node is indexable, so it should have been handled by
304 lto_output_tree. */
305 gcc_unreachable ();
310 /* Return true if EXPR is a tree node that can be written to disk. */
312 static inline bool
313 lto_is_streamable (tree expr)
315 enum tree_code code = TREE_CODE (expr);
317 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
318 name version in lto_output_tree_ref (see output_ssa_names). */
319 return !is_lang_specific (expr)
320 && code != SSA_NAME
321 && code != LANG_TYPE
322 && code != MODIFY_EXPR
323 && code != INIT_EXPR
324 && code != TARGET_EXPR
325 && code != BIND_EXPR
326 && code != WITH_CLEANUP_EXPR
327 && code != STATEMENT_LIST
328 && (code == CASE_LABEL_EXPR
329 || code == DECL_EXPR
330 || TREE_CODE_CLASS (code) != tcc_statement);
333 /* Very rough estimate of streaming size of the initializer. If we ignored
334 presence of strings, we could simply just count number of non-indexable
335 tree nodes and number of references to indexable nodes. Strings however
336 may be very large and we do not want to dump them int othe global stream.
338 Count the size of initializer until the size in DATA is positive. */
340 static tree
341 subtract_estimated_size (tree *tp, int *ws, void *data)
343 long *sum = (long *)data;
344 if (tree_is_indexable (*tp))
346 /* Indexable tree is one reference to global stream.
347 Guess it may be about 4 bytes. */
348 *sum -= 4;
349 *ws = 0;
351 /* String table entry + base of tree node needs to be streamed. */
352 if (TREE_CODE (*tp) == STRING_CST)
353 *sum -= TREE_STRING_LENGTH (*tp) + 8;
354 else
356 /* Identifiers are also variable length but should not appear
357 naked in constructor. */
358 gcc_checking_assert (TREE_CODE (*tp) != IDENTIFIER_NODE);
359 /* We do not really make attempt to work out size of pickled tree, as
360 it is very variable. Make it bigger than the reference. */
361 *sum -= 16;
363 if (*sum < 0)
364 return *tp;
365 return NULL_TREE;
369 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
371 static tree
372 get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
374 gcc_checking_assert (DECL_P (expr)
375 && TREE_CODE (expr) != FUNCTION_DECL
376 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
378 /* Handle DECL_INITIAL for symbols. */
379 tree initial = DECL_INITIAL (expr);
380 if (VAR_P (expr)
381 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
382 && !DECL_IN_CONSTANT_POOL (expr)
383 && initial)
385 varpool_node *vnode;
386 /* Extra section needs about 30 bytes; do not produce it for simple
387 scalar values. */
388 if (!(vnode = varpool_node::get (expr))
389 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
390 initial = error_mark_node;
391 if (initial != error_mark_node)
393 long max_size = 30;
394 if (walk_tree (&initial, subtract_estimated_size, (void *)&max_size,
395 NULL))
396 initial = error_mark_node;
400 return initial;
404 /* Write a physical representation of tree node EXPR to output block
405 OB. If REF_P is true, the leaves of EXPR are emitted as references
406 via lto_output_tree_ref. IX is the index into the streamer cache
407 where EXPR is stored. */
409 static void
410 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
412 /* Pack all the non-pointer fields in EXPR into a bitpack and write
413 the resulting bitpack. */
414 streamer_write_tree_bitfields (ob, expr);
416 /* Write all the pointer fields in EXPR. */
417 streamer_write_tree_body (ob, expr, ref_p);
419 /* Write any LTO-specific data to OB. */
420 if (DECL_P (expr)
421 && TREE_CODE (expr) != FUNCTION_DECL
422 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
424 /* Handle DECL_INITIAL for symbols. */
425 tree initial = get_symbol_initial_value
426 (ob->decl_state->symtab_node_encoder, expr);
427 stream_write_tree (ob, initial, ref_p);
430 /* Stream references to early generated DIEs. Keep in sync with the
431 trees handled in dwarf2out_die_ref_for_decl. */
432 if ((DECL_P (expr)
433 && TREE_CODE (expr) != FIELD_DECL
434 && TREE_CODE (expr) != DEBUG_EXPR_DECL
435 && TREE_CODE (expr) != TYPE_DECL)
436 || TREE_CODE (expr) == BLOCK)
438 const char *sym;
439 unsigned HOST_WIDE_INT off;
440 if (debug_info_level > DINFO_LEVEL_NONE
441 && debug_hooks->die_ref_for_decl (expr, &sym, &off))
443 streamer_write_string (ob, ob->main_stream, sym, true);
444 streamer_write_uhwi (ob, off);
446 else
447 streamer_write_string (ob, ob->main_stream, NULL, true);
451 /* Write a physical representation of tree node EXPR to output block
452 OB. If REF_P is true, the leaves of EXPR are emitted as references
453 via lto_output_tree_ref. IX is the index into the streamer cache
454 where EXPR is stored. */
456 static void
457 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
459 if (!lto_is_streamable (expr))
460 internal_error ("tree code %qs is not supported in LTO streams",
461 get_tree_code_name (TREE_CODE (expr)));
463 /* Write the header, containing everything needed to materialize
464 EXPR on the reading side. */
465 streamer_write_tree_header (ob, expr);
467 lto_write_tree_1 (ob, expr, ref_p);
469 /* Mark the end of EXPR. */
470 streamer_write_zero (ob);
473 /* Emit the physical representation of tree node EXPR to output block OB,
474 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
475 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
477 static void
478 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
479 bool ref_p, bool this_ref_p)
481 unsigned ix;
483 gcc_checking_assert (expr != NULL_TREE
484 && !(this_ref_p && tree_is_indexable (expr)));
486 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
487 expr, hash, &ix);
488 gcc_assert (!exists_p);
489 if (TREE_CODE (expr) == INTEGER_CST
490 && !TREE_OVERFLOW (expr))
492 /* Shared INTEGER_CST nodes are special because they need their
493 original type to be materialized by the reader (to implement
494 TYPE_CACHED_VALUES). */
495 streamer_write_integer_cst (ob, expr, ref_p);
497 else
499 /* This is the first time we see EXPR, write its fields
500 to OB. */
501 lto_write_tree (ob, expr, ref_p);
505 class DFS
507 public:
508 DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
509 bool single_p);
510 ~DFS ();
512 struct scc_entry
514 tree t;
515 hashval_t hash;
517 vec<scc_entry> sccstack;
519 private:
520 struct sccs
522 unsigned int dfsnum;
523 unsigned int low;
525 struct worklist
527 tree expr;
528 sccs *from_state;
529 sccs *cstate;
530 bool ref_p;
531 bool this_ref_p;
534 static int scc_entry_compare (const void *, const void *);
536 void DFS_write_tree_body (struct output_block *ob,
537 tree expr, sccs *expr_state, bool ref_p);
539 void DFS_write_tree (struct output_block *ob, sccs *from_state,
540 tree expr, bool ref_p, bool this_ref_p);
542 hashval_t
543 hash_scc (struct output_block *ob, unsigned first, unsigned size,
544 bool ref_p, bool this_ref_p);
546 hash_map<tree, sccs *> sccstate;
547 vec<worklist> worklist_vec;
548 struct obstack sccstate_obstack;
551 /* Emit the physical representation of tree node EXPR to output block OB,
552 using depth-first search on the subgraph. If THIS_REF_P is true, the
553 leaves of EXPR are emitted as references via lto_output_tree_ref.
554 REF_P is used for streaming siblings of EXPR. If SINGLE_P is true,
555 this is for a rewalk of a single leaf SCC. */
557 DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
558 bool single_p)
560 unsigned int next_dfs_num = 1;
561 sccstack.create (0);
562 gcc_obstack_init (&sccstate_obstack);
563 worklist_vec = vNULL;
564 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
565 while (!worklist_vec.is_empty ())
567 worklist &w = worklist_vec.last ();
568 expr = w.expr;
569 sccs *from_state = w.from_state;
570 sccs *cstate = w.cstate;
571 ref_p = w.ref_p;
572 this_ref_p = w.this_ref_p;
573 if (cstate == NULL)
575 sccs **slot = &sccstate.get_or_insert (expr);
576 cstate = *slot;
577 if (cstate)
579 gcc_checking_assert (from_state);
580 if (cstate->dfsnum < from_state->dfsnum)
581 from_state->low = MIN (cstate->dfsnum, from_state->low);
582 worklist_vec.pop ();
583 continue;
586 scc_entry e = { expr, 0 };
587 /* Not yet visited. DFS recurse and push it onto the stack. */
588 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
589 sccstack.safe_push (e);
590 cstate->dfsnum = next_dfs_num++;
591 cstate->low = cstate->dfsnum;
592 w.cstate = cstate;
594 if (TREE_CODE (expr) == INTEGER_CST
595 && !TREE_OVERFLOW (expr))
596 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
597 else
599 DFS_write_tree_body (ob, expr, cstate, ref_p);
601 /* Walk any LTO-specific edges. */
602 if (DECL_P (expr)
603 && TREE_CODE (expr) != FUNCTION_DECL
604 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
606 /* Handle DECL_INITIAL for symbols. */
607 tree initial
608 = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
609 expr);
610 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
613 continue;
616 /* See if we found an SCC. */
617 if (cstate->low == cstate->dfsnum)
619 unsigned first, size;
620 tree x;
622 /* If we are re-walking a single leaf SCC just pop it,
623 let earlier worklist item access the sccstack. */
624 if (single_p)
626 worklist_vec.pop ();
627 continue;
630 /* Pop the SCC and compute its size. */
631 first = sccstack.length ();
634 x = sccstack[--first].t;
636 while (x != expr);
637 size = sccstack.length () - first;
639 /* No need to compute hashes for LTRANS units, we don't perform
640 any merging there. */
641 hashval_t scc_hash = 0;
642 unsigned scc_entry_len = 0;
643 if (!flag_wpa)
645 scc_hash = hash_scc (ob, first, size, ref_p, this_ref_p);
647 /* Put the entries with the least number of collisions first. */
648 unsigned entry_start = 0;
649 scc_entry_len = size + 1;
650 for (unsigned i = 0; i < size;)
652 unsigned from = i;
653 for (i = i + 1; i < size
654 && (sccstack[first + i].hash
655 == sccstack[first + from].hash); ++i)
657 if (i - from < scc_entry_len)
659 scc_entry_len = i - from;
660 entry_start = from;
663 for (unsigned i = 0; i < scc_entry_len; ++i)
664 std::swap (sccstack[first + i],
665 sccstack[first + entry_start + i]);
667 /* We already sorted SCC deterministically in hash_scc. */
669 /* Check that we have only one SCC.
670 Naturally we may have conflicts if hash function is not
671 strong enough. Lets see how far this gets. */
672 gcc_checking_assert (scc_entry_len == 1);
675 /* Write LTO_tree_scc. */
676 streamer_write_record_start (ob, LTO_tree_scc);
677 streamer_write_uhwi (ob, size);
678 streamer_write_uhwi (ob, scc_hash);
680 /* Write size-1 SCCs without wrapping them inside SCC bundles.
681 All INTEGER_CSTs need to be handled this way as we need
682 their type to materialize them. Also builtins are handled
683 this way.
684 ??? We still wrap these in LTO_tree_scc so at the
685 input side we can properly identify the tree we want
686 to ultimatively return. */
687 if (size == 1)
688 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
689 else
691 /* Write the size of the SCC entry candidates. */
692 streamer_write_uhwi (ob, scc_entry_len);
694 /* Write all headers and populate the streamer cache. */
695 for (unsigned i = 0; i < size; ++i)
697 hashval_t hash = sccstack[first+i].hash;
698 tree t = sccstack[first+i].t;
699 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
700 t, hash, NULL);
701 gcc_assert (!exists_p);
703 if (!lto_is_streamable (t))
704 internal_error ("tree code %qs is not supported "
705 "in LTO streams",
706 get_tree_code_name (TREE_CODE (t)));
708 /* Write the header, containing everything needed to
709 materialize EXPR on the reading side. */
710 streamer_write_tree_header (ob, t);
713 /* Write the bitpacks and tree references. */
714 for (unsigned i = 0; i < size; ++i)
716 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
718 /* Mark the end of the tree. */
719 streamer_write_zero (ob);
723 /* Finally truncate the vector. */
724 sccstack.truncate (first);
726 if (from_state)
727 from_state->low = MIN (from_state->low, cstate->low);
728 worklist_vec.pop ();
729 continue;
732 gcc_checking_assert (from_state);
733 from_state->low = MIN (from_state->low, cstate->low);
734 if (cstate->dfsnum < from_state->dfsnum)
735 from_state->low = MIN (cstate->dfsnum, from_state->low);
736 worklist_vec.pop ();
738 worklist_vec.release ();
741 DFS::~DFS ()
743 sccstack.release ();
744 obstack_free (&sccstate_obstack, NULL);
747 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
748 DFS recurse for all tree edges originating from it. */
750 void
751 DFS::DFS_write_tree_body (struct output_block *ob,
752 tree expr, sccs *expr_state, bool ref_p)
754 #define DFS_follow_tree_edge(DEST) \
755 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
757 enum tree_code code;
759 if (streamer_dump_file)
761 print_node_brief (streamer_dump_file, " Streaming ",
762 expr, 4);
763 fprintf (streamer_dump_file, " to %s\n",
764 lto_section_name [ob->section_type]);
767 code = TREE_CODE (expr);
769 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
771 if (TREE_CODE (expr) != IDENTIFIER_NODE)
772 DFS_follow_tree_edge (TREE_TYPE (expr));
775 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
777 unsigned int count = vector_cst_encoded_nelts (expr);
778 for (unsigned int i = 0; i < count; ++i)
779 DFS_follow_tree_edge (VECTOR_CST_ENCODED_ELT (expr, i));
782 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
783 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
784 DFS_follow_tree_edge (POLY_INT_CST_COEFF (expr, i));
786 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
788 DFS_follow_tree_edge (TREE_REALPART (expr));
789 DFS_follow_tree_edge (TREE_IMAGPART (expr));
792 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
794 /* Drop names that were created for anonymous entities. */
795 if (DECL_NAME (expr)
796 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
797 && IDENTIFIER_ANON_P (DECL_NAME (expr)))
799 else
800 DFS_follow_tree_edge (DECL_NAME (expr));
801 if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
802 && ! DECL_CONTEXT (expr))
803 DFS_follow_tree_edge ((*all_translation_units)[0]);
804 else
805 DFS_follow_tree_edge (DECL_CONTEXT (expr));
808 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
810 DFS_follow_tree_edge (DECL_SIZE (expr));
811 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
813 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
814 special handling in LTO, it must be handled by streamer hooks. */
816 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
818 /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark
819 declarations which should be eliminated by decl merging. Be sure none
820 leaks to this point. */
821 gcc_assert (DECL_ABSTRACT_ORIGIN (expr) != error_mark_node);
822 DFS_follow_tree_edge (DECL_ABSTRACT_ORIGIN (expr));
824 if ((VAR_P (expr)
825 || TREE_CODE (expr) == PARM_DECL)
826 && DECL_HAS_VALUE_EXPR_P (expr))
827 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
828 if (VAR_P (expr)
829 && DECL_HAS_DEBUG_EXPR_P (expr))
830 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
833 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
835 /* Make sure we don't inadvertently set the assembler name. */
836 if (DECL_ASSEMBLER_NAME_SET_P (expr))
837 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
840 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
842 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
843 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
844 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
845 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
846 gcc_checking_assert (!DECL_FCONTEXT (expr));
849 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
851 gcc_checking_assert (DECL_VINDEX (expr) == NULL);
852 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
853 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
854 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
857 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
859 DFS_follow_tree_edge (TYPE_SIZE (expr));
860 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
861 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
862 DFS_follow_tree_edge (TYPE_NAME (expr));
863 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
864 reconstructed during fixup. */
865 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
866 during fixup. */
867 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
868 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
869 /* TYPE_CANONICAL is re-computed during type merging, so no need
870 to follow it here. */
871 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
872 it cannot be freed by free_lang_data without triggering ICEs in
873 langhooks. */
876 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
878 if (TREE_CODE (expr) == ENUMERAL_TYPE)
879 DFS_follow_tree_edge (TYPE_VALUES (expr));
880 else if (TREE_CODE (expr) == ARRAY_TYPE)
881 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
882 else if (RECORD_OR_UNION_TYPE_P (expr))
883 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
884 DFS_follow_tree_edge (t);
885 else if (TREE_CODE (expr) == FUNCTION_TYPE
886 || TREE_CODE (expr) == METHOD_TYPE)
887 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
889 if (!POINTER_TYPE_P (expr))
890 DFS_follow_tree_edge (TYPE_MIN_VALUE_RAW (expr));
891 DFS_follow_tree_edge (TYPE_MAX_VALUE_RAW (expr));
894 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
896 DFS_follow_tree_edge (TREE_PURPOSE (expr));
897 DFS_follow_tree_edge (TREE_VALUE (expr));
898 DFS_follow_tree_edge (TREE_CHAIN (expr));
901 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
903 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
904 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
907 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
909 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
910 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
911 DFS_follow_tree_edge (TREE_BLOCK (expr));
914 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
916 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
918 /* We would have to stream externals in the block chain as
919 non-references but we should have dropped them in
920 free-lang-data. */
921 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
922 DFS_follow_tree_edge (t);
925 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
926 DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr));
928 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
929 information for early inlined BLOCKs so drop it on the floor instead
930 of ICEing in dwarf2out.c. */
932 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
933 streaming time. */
935 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
936 list is re-constructed from BLOCK_SUPERCONTEXT. */
939 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
941 unsigned i;
942 tree t;
944 /* Note that the number of BINFO slots has already been emitted in
945 EXPR's header (see streamer_write_tree_header) because this length
946 is needed to build the empty BINFO node on the reader side. */
947 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
948 DFS_follow_tree_edge (t);
949 DFS_follow_tree_edge (BINFO_OFFSET (expr));
950 DFS_follow_tree_edge (BINFO_VTABLE (expr));
952 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
953 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
954 by C++ FE only. */
957 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
959 unsigned i;
960 tree index, value;
962 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
964 DFS_follow_tree_edge (index);
965 DFS_follow_tree_edge (value);
969 if (code == OMP_CLAUSE)
971 int i;
972 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
973 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
974 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
977 #undef DFS_follow_tree_edge
980 /* Return a hash value for the tree T.
981 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
982 may hold hash values if trees inside current SCC. */
984 static hashval_t
985 hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
987 inchash::hash hstate;
989 #define visit(SIBLING) \
990 do { \
991 unsigned ix; \
992 if (!SIBLING) \
993 hstate.add_int (0); \
994 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
995 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
996 else if (map) \
997 hstate.add_int (*map->get (SIBLING)); \
998 else \
999 hstate.add_int (1); \
1000 } while (0)
1002 /* Hash TS_BASE. */
1003 enum tree_code code = TREE_CODE (t);
1004 hstate.add_int (code);
1005 if (!TYPE_P (t))
1007 hstate.add_flag (TREE_SIDE_EFFECTS (t));
1008 hstate.add_flag (TREE_CONSTANT (t));
1009 hstate.add_flag (TREE_READONLY (t));
1010 hstate.add_flag (TREE_PUBLIC (t));
1012 hstate.add_flag (TREE_ADDRESSABLE (t));
1013 hstate.add_flag (TREE_THIS_VOLATILE (t));
1014 if (DECL_P (t))
1015 hstate.add_flag (DECL_UNSIGNED (t));
1016 else if (TYPE_P (t))
1017 hstate.add_flag (TYPE_UNSIGNED (t));
1018 if (TYPE_P (t))
1019 hstate.add_flag (TYPE_ARTIFICIAL (t));
1020 else
1021 hstate.add_flag (TREE_NO_WARNING (t));
1022 hstate.add_flag (TREE_NOTHROW (t));
1023 hstate.add_flag (TREE_STATIC (t));
1024 hstate.add_flag (TREE_PROTECTED (t));
1025 hstate.add_flag (TREE_DEPRECATED (t));
1026 if (code != TREE_BINFO)
1027 hstate.add_flag (TREE_PRIVATE (t));
1028 if (TYPE_P (t))
1030 hstate.add_flag (AGGREGATE_TYPE_P (t)
1031 ? TYPE_REVERSE_STORAGE_ORDER (t) : TYPE_SATURATING (t));
1032 hstate.add_flag (TYPE_ADDR_SPACE (t));
1034 else if (code == SSA_NAME)
1035 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
1036 hstate.commit_flag ();
1038 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
1039 hstate.add_wide_int (wi::to_widest (t));
1041 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
1043 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
1044 hstate.add_flag (r.cl);
1045 hstate.add_flag (r.sign);
1046 hstate.add_flag (r.signalling);
1047 hstate.add_flag (r.canonical);
1048 hstate.commit_flag ();
1049 hstate.add_int (r.uexp);
1050 hstate.add (r.sig, sizeof (r.sig));
1053 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
1055 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
1056 hstate.add_int (f.mode);
1057 hstate.add_int (f.data.low);
1058 hstate.add_int (f.data.high);
1061 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1063 hstate.add_hwi (DECL_MODE (t));
1064 hstate.add_flag (DECL_NONLOCAL (t));
1065 hstate.add_flag (DECL_VIRTUAL_P (t));
1066 hstate.add_flag (DECL_IGNORED_P (t));
1067 hstate.add_flag (DECL_ABSTRACT_P (t));
1068 hstate.add_flag (DECL_ARTIFICIAL (t));
1069 hstate.add_flag (DECL_USER_ALIGN (t));
1070 hstate.add_flag (DECL_PRESERVE_P (t));
1071 hstate.add_flag (DECL_EXTERNAL (t));
1072 hstate.add_flag (DECL_GIMPLE_REG_P (t));
1073 hstate.commit_flag ();
1074 hstate.add_int (DECL_ALIGN (t));
1075 if (code == LABEL_DECL)
1077 hstate.add_int (EH_LANDING_PAD_NR (t));
1078 hstate.add_int (LABEL_DECL_UID (t));
1080 else if (code == FIELD_DECL)
1082 hstate.add_flag (DECL_PACKED (t));
1083 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
1084 hstate.add_flag (DECL_PADDING_P (t));
1085 hstate.add_int (DECL_OFFSET_ALIGN (t));
1087 else if (code == VAR_DECL)
1089 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
1090 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
1092 if (code == RESULT_DECL
1093 || code == PARM_DECL
1094 || code == VAR_DECL)
1096 hstate.add_flag (DECL_BY_REFERENCE (t));
1097 if (code == VAR_DECL
1098 || code == PARM_DECL)
1099 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
1101 hstate.commit_flag ();
1104 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
1105 hstate.add_int (DECL_REGISTER (t));
1107 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1109 hstate.add_flag (DECL_COMMON (t));
1110 hstate.add_flag (DECL_DLLIMPORT_P (t));
1111 hstate.add_flag (DECL_WEAK (t));
1112 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
1113 hstate.add_flag (DECL_COMDAT (t));
1114 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
1115 hstate.add_int (DECL_VISIBILITY (t));
1116 if (code == VAR_DECL)
1118 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
1119 hstate.add_flag (DECL_HARD_REGISTER (t));
1120 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
1122 if (TREE_CODE (t) == FUNCTION_DECL)
1124 hstate.add_flag (DECL_FINAL_P (t));
1125 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
1126 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
1128 hstate.commit_flag ();
1131 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1133 hstate.add_int (DECL_BUILT_IN_CLASS (t));
1134 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
1135 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
1136 hstate.add_flag (FUNCTION_DECL_DECL_TYPE (t));
1137 hstate.add_flag (DECL_UNINLINABLE (t));
1138 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
1139 hstate.add_flag (DECL_IS_NOVOPS (t));
1140 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
1141 hstate.add_flag (DECL_IS_MALLOC (t));
1142 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
1143 hstate.add_flag (DECL_STATIC_CHAIN (t));
1144 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
1145 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
1146 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
1147 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
1148 hstate.add_flag (DECL_PURE_P (t));
1149 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
1150 hstate.commit_flag ();
1151 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
1152 hstate.add_int (DECL_UNCHECKED_FUNCTION_CODE (t));
1155 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1157 hstate.add_hwi (TYPE_MODE (t));
1158 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
1159 no streaming. */
1160 hstate.add_flag (TYPE_PACKED (t));
1161 hstate.add_flag (TYPE_RESTRICT (t));
1162 hstate.add_flag (TYPE_USER_ALIGN (t));
1163 hstate.add_flag (TYPE_READONLY (t));
1164 if (RECORD_OR_UNION_TYPE_P (t))
1166 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
1167 hstate.add_flag (TYPE_FINAL_P (t));
1168 hstate.add_flag (TYPE_CXX_ODR_P (t));
1170 else if (code == ARRAY_TYPE)
1171 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
1172 if (code == ARRAY_TYPE || code == INTEGER_TYPE)
1173 hstate.add_flag (TYPE_STRING_FLAG (t));
1174 if (AGGREGATE_TYPE_P (t))
1175 hstate.add_flag (TYPE_TYPELESS_STORAGE (t));
1176 hstate.commit_flag ();
1177 hstate.add_int (TYPE_PRECISION (t));
1178 hstate.add_int (TYPE_ALIGN (t));
1179 hstate.add_int (TYPE_EMPTY_P (t));
1182 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
1183 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
1184 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
1186 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
1187 /* We don't stream these when passing things to a different target. */
1188 && !lto_stream_offload_p)
1189 hstate.add_hwi (cl_target_option_hash (TREE_TARGET_OPTION (t)));
1191 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
1192 hstate.add_hwi (cl_optimization_hash (TREE_OPTIMIZATION (t)));
1194 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
1195 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
1197 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
1198 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
1200 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
1202 if (code != IDENTIFIER_NODE)
1203 visit (TREE_TYPE (t));
1206 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1208 unsigned int count = vector_cst_encoded_nelts (t);
1209 for (unsigned int i = 0; i < count; ++i)
1210 visit (VECTOR_CST_ENCODED_ELT (t, i));
1213 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
1214 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
1215 visit (POLY_INT_CST_COEFF (t, i));
1217 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1219 visit (TREE_REALPART (t));
1220 visit (TREE_IMAGPART (t));
1223 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1225 /* Drop names that were created for anonymous entities. */
1226 if (DECL_NAME (t)
1227 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
1228 && IDENTIFIER_ANON_P (DECL_NAME (t)))
1230 else
1231 visit (DECL_NAME (t));
1232 if (DECL_FILE_SCOPE_P (t))
1234 else
1235 visit (DECL_CONTEXT (t));
1238 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1240 visit (DECL_SIZE (t));
1241 visit (DECL_SIZE_UNIT (t));
1242 visit (DECL_ATTRIBUTES (t));
1243 if ((code == VAR_DECL
1244 || code == PARM_DECL)
1245 && DECL_HAS_VALUE_EXPR_P (t))
1246 visit (DECL_VALUE_EXPR (t));
1247 if (code == VAR_DECL
1248 && DECL_HAS_DEBUG_EXPR_P (t))
1249 visit (DECL_DEBUG_EXPR (t));
1250 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1251 be able to call get_symbol_initial_value. */
1254 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1256 if (DECL_ASSEMBLER_NAME_SET_P (t))
1257 visit (DECL_ASSEMBLER_NAME (t));
1260 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1262 visit (DECL_FIELD_OFFSET (t));
1263 visit (DECL_BIT_FIELD_TYPE (t));
1264 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
1265 visit (DECL_FIELD_BIT_OFFSET (t));
1268 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1270 visit (DECL_FUNCTION_PERSONALITY (t));
1271 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
1272 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
1275 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1277 visit (TYPE_SIZE (t));
1278 visit (TYPE_SIZE_UNIT (t));
1279 visit (TYPE_ATTRIBUTES (t));
1280 visit (TYPE_NAME (t));
1281 visit (TYPE_MAIN_VARIANT (t));
1282 if (TYPE_FILE_SCOPE_P (t))
1284 else
1285 visit (TYPE_CONTEXT (t));
1288 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1290 if (code == ENUMERAL_TYPE)
1291 visit (TYPE_VALUES (t));
1292 else if (code == ARRAY_TYPE)
1293 visit (TYPE_DOMAIN (t));
1294 else if (RECORD_OR_UNION_TYPE_P (t))
1295 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1296 visit (f);
1297 else if (code == FUNCTION_TYPE
1298 || code == METHOD_TYPE)
1299 visit (TYPE_ARG_TYPES (t));
1300 if (!POINTER_TYPE_P (t))
1301 visit (TYPE_MIN_VALUE_RAW (t));
1302 visit (TYPE_MAX_VALUE_RAW (t));
1305 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1307 visit (TREE_PURPOSE (t));
1308 visit (TREE_VALUE (t));
1309 visit (TREE_CHAIN (t));
1312 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1313 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1314 visit (TREE_VEC_ELT (t, i));
1316 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1318 hstate.add_hwi (TREE_OPERAND_LENGTH (t));
1319 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1320 visit (TREE_OPERAND (t, i));
1323 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1325 unsigned i;
1326 tree b;
1327 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1328 visit (b);
1329 visit (BINFO_OFFSET (t));
1330 visit (BINFO_VTABLE (t));
1331 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1332 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1333 by C++ FE only. */
1336 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1338 unsigned i;
1339 tree index, value;
1340 hstate.add_hwi (CONSTRUCTOR_NELTS (t));
1341 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1343 visit (index);
1344 visit (value);
1348 if (code == OMP_CLAUSE)
1350 int i;
1351 HOST_WIDE_INT val;
1353 hstate.add_hwi (OMP_CLAUSE_CODE (t));
1354 switch (OMP_CLAUSE_CODE (t))
1356 case OMP_CLAUSE_DEFAULT:
1357 val = OMP_CLAUSE_DEFAULT_KIND (t);
1358 break;
1359 case OMP_CLAUSE_SCHEDULE:
1360 val = OMP_CLAUSE_SCHEDULE_KIND (t);
1361 break;
1362 case OMP_CLAUSE_DEPEND:
1363 val = OMP_CLAUSE_DEPEND_KIND (t);
1364 break;
1365 case OMP_CLAUSE_MAP:
1366 val = OMP_CLAUSE_MAP_KIND (t);
1367 break;
1368 case OMP_CLAUSE_PROC_BIND:
1369 val = OMP_CLAUSE_PROC_BIND_KIND (t);
1370 break;
1371 case OMP_CLAUSE_REDUCTION:
1372 case OMP_CLAUSE_TASK_REDUCTION:
1373 case OMP_CLAUSE_IN_REDUCTION:
1374 val = OMP_CLAUSE_REDUCTION_CODE (t);
1375 break;
1376 default:
1377 val = 0;
1378 break;
1380 hstate.add_hwi (val);
1381 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1382 visit (OMP_CLAUSE_OPERAND (t, i));
1383 visit (OMP_CLAUSE_CHAIN (t));
1386 return hstate.end ();
1388 #undef visit
1391 /* Compare two SCC entries by their hash value for qsorting them. */
1394 DFS::scc_entry_compare (const void *p1_, const void *p2_)
1396 const scc_entry *p1 = (const scc_entry *) p1_;
1397 const scc_entry *p2 = (const scc_entry *) p2_;
1398 if (p1->hash < p2->hash)
1399 return -1;
1400 else if (p1->hash > p2->hash)
1401 return 1;
1402 return 0;
1405 /* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.
1406 THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST. */
1408 hashval_t
1409 DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size,
1410 bool ref_p, bool this_ref_p)
1412 unsigned int last_classes = 0, iterations = 0;
1414 /* Compute hash values for the SCC members. */
1415 for (unsigned i = 0; i < size; ++i)
1416 sccstack[first+i].hash
1417 = hash_tree (ob->writer_cache, NULL, sccstack[first+i].t);
1419 if (size == 1)
1420 return sccstack[first].hash;
1422 /* We aim to get unique hash for every tree within SCC and compute hash value
1423 of the whole SCC by combining all values together in a stable (entry-point
1424 independent) order. This guarantees that the same SCC regions within
1425 different translation units will get the same hash values and therefore
1426 will be merged at WPA time.
1428 Often the hashes are already unique. In that case we compute the SCC hash
1429 by combining individual hash values in an increasing order.
1431 If there are duplicates, we seek at least one tree with unique hash (and
1432 pick one with minimal hash and this property). Then we obtain a stable
1433 order by DFS walk starting from this unique tree and then use the index
1434 within this order to make individual hash values unique.
1436 If there is no tree with unique hash, we iteratively propagate the hash
1437 values across the internal edges of SCC. This usually quickly leads
1438 to unique hashes. Consider, for example, an SCC containing two pointers
1439 that are identical except for the types they point to and assume that
1440 these types are also part of the SCC. The propagation will add the
1441 points-to type information into their hash values. */
1444 /* Sort the SCC so we can easily check for uniqueness. */
1445 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1447 unsigned int classes = 1;
1448 int firstunique = -1;
1450 /* Find the tree with lowest unique hash (if it exists) and compute
1451 the number of equivalence classes. */
1452 if (sccstack[first].hash != sccstack[first+1].hash)
1453 firstunique = 0;
1454 for (unsigned i = 1; i < size; ++i)
1455 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
1457 classes++;
1458 if (firstunique == -1
1459 && (i == size - 1
1460 || sccstack[first+i+1].hash != sccstack[first+i].hash))
1461 firstunique = i;
1464 /* If we found a tree with unique hash, stop the iteration. */
1465 if (firstunique != -1
1466 /* Also terminate if we run out of iterations or if the number of
1467 equivalence classes is no longer increasing.
1468 For example a cyclic list of trees that are all equivalent will
1469 never have unique entry point; we however do not build such SCCs
1470 in our IL. */
1471 || classes <= last_classes || iterations > 16)
1473 hashval_t scc_hash;
1475 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1476 starting from FIRSTUNIQUE to obtain a stable order. */
1477 if (classes != size && firstunique != -1)
1479 hash_map <tree, hashval_t> map(size*2);
1481 /* Store hash values into a map, so we can associate them with
1482 the reordered SCC. */
1483 for (unsigned i = 0; i < size; ++i)
1484 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1486 DFS again (ob, sccstack[first+firstunique].t, ref_p, this_ref_p,
1487 true);
1488 gcc_assert (again.sccstack.length () == size);
1490 memcpy (sccstack.address () + first,
1491 again.sccstack.address (),
1492 sizeof (scc_entry) * size);
1494 /* Update hash values of individual members by hashing in the
1495 index within the stable order. This ensures uniqueness.
1496 Also compute the SCC hash by mixing in all hash values in
1497 the stable order we obtained. */
1498 sccstack[first].hash = *map.get (sccstack[first].t);
1499 scc_hash = sccstack[first].hash;
1500 for (unsigned i = 1; i < size; ++i)
1502 sccstack[first+i].hash
1503 = iterative_hash_hashval_t (i,
1504 *map.get (sccstack[first+i].t));
1505 scc_hash
1506 = iterative_hash_hashval_t (scc_hash,
1507 sccstack[first+i].hash);
1510 /* If we got a unique hash value for each tree, then sort already
1511 ensured entry-point independent order. Only compute the final
1512 SCC hash.
1514 If we failed to find the unique entry point, we go by the same
1515 route. We will eventually introduce unwanted hash conflicts. */
1516 else
1518 scc_hash = sccstack[first].hash;
1519 for (unsigned i = 1; i < size; ++i)
1520 scc_hash
1521 = iterative_hash_hashval_t (scc_hash, sccstack[first+i].hash);
1523 /* We cannot 100% guarantee that the hash won't conflict so as
1524 to make it impossible to find a unique hash. This however
1525 should be an extremely rare case. ICE for now so possible
1526 issues are found and evaluated. */
1527 gcc_checking_assert (classes == size);
1530 /* To avoid conflicts across SCCs, iteratively hash the whole SCC
1531 hash into the hash of each element. */
1532 for (unsigned i = 0; i < size; ++i)
1533 sccstack[first+i].hash
1534 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1535 return scc_hash;
1538 last_classes = classes;
1539 iterations++;
1541 /* We failed to identify the entry point; propagate hash values across
1542 the edges. */
1543 hash_map <tree, hashval_t> map(size*2);
1545 for (unsigned i = 0; i < size; ++i)
1546 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1548 for (unsigned i = 0; i < size; i++)
1549 sccstack[first+i].hash
1550 = hash_tree (ob->writer_cache, &map, sccstack[first+i].t);
1552 while (true);
1555 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1556 already in the streamer cache. Main routine called for
1557 each visit of EXPR. */
1559 void
1560 DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
1561 tree expr, bool ref_p, bool this_ref_p)
1563 /* Handle special cases. */
1564 if (expr == NULL_TREE)
1565 return;
1567 /* Do not DFS walk into indexable trees. */
1568 if (this_ref_p && tree_is_indexable (expr))
1569 return;
1571 /* Check if we already streamed EXPR. */
1572 if (streamer_tree_cache_lookup (ob->writer_cache, expr, NULL))
1573 return;
1575 worklist w;
1576 w.expr = expr;
1577 w.from_state = from_state;
1578 w.cstate = NULL;
1579 w.ref_p = ref_p;
1580 w.this_ref_p = this_ref_p;
1581 worklist_vec.safe_push (w);
1585 /* Emit the physical representation of tree node EXPR to output block OB.
1586 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
1587 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1589 void
1590 lto_output_tree (struct output_block *ob, tree expr,
1591 bool ref_p, bool this_ref_p)
1593 unsigned ix;
1594 bool existed_p;
1596 if (expr == NULL_TREE)
1598 streamer_write_record_start (ob, LTO_null);
1599 return;
1602 if (this_ref_p && tree_is_indexable (expr))
1604 lto_output_tree_ref (ob, expr);
1605 return;
1608 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1609 if (existed_p)
1611 /* If a node has already been streamed out, make sure that
1612 we don't write it more than once. Otherwise, the reader
1613 will instantiate two different nodes for the same object. */
1614 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1615 streamer_write_uhwi (ob, ix);
1616 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1617 lto_tree_code_to_tag (TREE_CODE (expr)));
1618 lto_stats.num_pickle_refs_output++;
1620 else
1622 /* This is the first time we see EXPR, write all reachable
1623 trees to OB. */
1624 static bool in_dfs_walk;
1626 /* Protect against recursion which means disconnect between
1627 what tree edges we walk in the DFS walk and what edges
1628 we stream out. */
1629 gcc_assert (!in_dfs_walk);
1631 if (streamer_dump_file)
1633 print_node_brief (streamer_dump_file, " Streaming SCC of ",
1634 expr, 4);
1635 fprintf (streamer_dump_file, "\n");
1638 /* Start the DFS walk. */
1639 /* Save ob state ... */
1640 /* let's see ... */
1641 in_dfs_walk = true;
1642 DFS (ob, expr, ref_p, this_ref_p, false);
1643 in_dfs_walk = false;
1645 /* Finally append a reference to the tree we were writing.
1646 ??? If expr ended up as a singleton we could have
1647 inlined it here and avoid outputting a reference. */
1648 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1649 gcc_assert (existed_p);
1650 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1651 streamer_write_uhwi (ob, ix);
1652 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1653 lto_tree_code_to_tag (TREE_CODE (expr)));
1654 if (streamer_dump_file)
1656 print_node_brief (streamer_dump_file, " Finished SCC of ",
1657 expr, 4);
1658 fprintf (streamer_dump_file, "\n\n");
1660 lto_stats.num_pickle_refs_output++;
1665 /* Output to OB a list of try/catch handlers starting with FIRST. */
1667 static void
1668 output_eh_try_list (struct output_block *ob, eh_catch first)
1670 eh_catch n;
1672 for (n = first; n; n = n->next_catch)
1674 streamer_write_record_start (ob, LTO_eh_catch);
1675 stream_write_tree (ob, n->type_list, true);
1676 stream_write_tree (ob, n->filter_list, true);
1677 stream_write_tree (ob, n->label, true);
1680 streamer_write_record_start (ob, LTO_null);
1684 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1685 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1686 detect EH region sharing. */
1688 static void
1689 output_eh_region (struct output_block *ob, eh_region r)
1691 enum LTO_tags tag;
1693 if (r == NULL)
1695 streamer_write_record_start (ob, LTO_null);
1696 return;
1699 if (r->type == ERT_CLEANUP)
1700 tag = LTO_ert_cleanup;
1701 else if (r->type == ERT_TRY)
1702 tag = LTO_ert_try;
1703 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1704 tag = LTO_ert_allowed_exceptions;
1705 else if (r->type == ERT_MUST_NOT_THROW)
1706 tag = LTO_ert_must_not_throw;
1707 else
1708 gcc_unreachable ();
1710 streamer_write_record_start (ob, tag);
1711 streamer_write_hwi (ob, r->index);
1713 if (r->outer)
1714 streamer_write_hwi (ob, r->outer->index);
1715 else
1716 streamer_write_zero (ob);
1718 if (r->inner)
1719 streamer_write_hwi (ob, r->inner->index);
1720 else
1721 streamer_write_zero (ob);
1723 if (r->next_peer)
1724 streamer_write_hwi (ob, r->next_peer->index);
1725 else
1726 streamer_write_zero (ob);
1728 if (r->type == ERT_TRY)
1730 output_eh_try_list (ob, r->u.eh_try.first_catch);
1732 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1734 stream_write_tree (ob, r->u.allowed.type_list, true);
1735 stream_write_tree (ob, r->u.allowed.label, true);
1736 streamer_write_uhwi (ob, r->u.allowed.filter);
1738 else if (r->type == ERT_MUST_NOT_THROW)
1740 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1741 bitpack_d bp = bitpack_create (ob->main_stream);
1742 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1743 streamer_write_bitpack (&bp);
1746 if (r->landing_pads)
1747 streamer_write_hwi (ob, r->landing_pads->index);
1748 else
1749 streamer_write_zero (ob);
1753 /* Output landing pad LP to OB. */
1755 static void
1756 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1758 if (lp == NULL)
1760 streamer_write_record_start (ob, LTO_null);
1761 return;
1764 streamer_write_record_start (ob, LTO_eh_landing_pad);
1765 streamer_write_hwi (ob, lp->index);
1766 if (lp->next_lp)
1767 streamer_write_hwi (ob, lp->next_lp->index);
1768 else
1769 streamer_write_zero (ob);
1771 if (lp->region)
1772 streamer_write_hwi (ob, lp->region->index);
1773 else
1774 streamer_write_zero (ob);
1776 stream_write_tree (ob, lp->post_landing_pad, true);
1780 /* Output the existing eh_table to OB. */
1782 static void
1783 output_eh_regions (struct output_block *ob, struct function *fn)
1785 if (fn->eh && fn->eh->region_tree)
1787 unsigned i;
1788 eh_region eh;
1789 eh_landing_pad lp;
1790 tree ttype;
1792 streamer_write_record_start (ob, LTO_eh_table);
1794 /* Emit the index of the root of the EH region tree. */
1795 streamer_write_hwi (ob, fn->eh->region_tree->index);
1797 /* Emit all the EH regions in the region array. */
1798 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1799 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1800 output_eh_region (ob, eh);
1802 /* Emit all landing pads. */
1803 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1804 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1805 output_eh_lp (ob, lp);
1807 /* Emit all the runtime type data. */
1808 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1809 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1810 stream_write_tree (ob, ttype, true);
1812 /* Emit the table of action chains. */
1813 if (targetm.arm_eabi_unwinder)
1815 tree t;
1816 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1817 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1818 stream_write_tree (ob, t, true);
1820 else
1822 uchar c;
1823 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1824 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1825 streamer_write_char_stream (ob->main_stream, c);
1829 /* The LTO_null either terminates the record or indicates that there
1830 are no eh_records at all. */
1831 streamer_write_record_start (ob, LTO_null);
1835 /* Output all of the active ssa names to the ssa_names stream. */
1837 static void
1838 output_ssa_names (struct output_block *ob, struct function *fn)
1840 unsigned int i, len;
1842 len = vec_safe_length (SSANAMES (fn));
1843 streamer_write_uhwi (ob, len);
1845 for (i = 1; i < len; i++)
1847 tree ptr = (*SSANAMES (fn))[i];
1849 if (ptr == NULL_TREE
1850 || SSA_NAME_IN_FREE_LIST (ptr)
1851 || virtual_operand_p (ptr)
1852 /* Simply skip unreleased SSA names. */
1853 || (! SSA_NAME_IS_DEFAULT_DEF (ptr)
1854 && (! SSA_NAME_DEF_STMT (ptr)
1855 || ! gimple_bb (SSA_NAME_DEF_STMT (ptr)))))
1856 continue;
1858 streamer_write_uhwi (ob, i);
1859 streamer_write_char_stream (ob->main_stream,
1860 SSA_NAME_IS_DEFAULT_DEF (ptr));
1861 if (SSA_NAME_VAR (ptr))
1862 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1863 else
1864 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1865 stream_write_tree (ob, TREE_TYPE (ptr), true);
1868 streamer_write_zero (ob);
1873 /* Output the cfg. */
1875 static void
1876 output_cfg (struct output_block *ob, struct function *fn)
1878 struct lto_output_stream *tmp_stream = ob->main_stream;
1879 basic_block bb;
1881 ob->main_stream = ob->cfg_stream;
1883 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1884 profile_status_for_fn (fn));
1886 /* Output the number of the highest basic block. */
1887 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1889 FOR_ALL_BB_FN (bb, fn)
1891 edge_iterator ei;
1892 edge e;
1894 streamer_write_hwi (ob, bb->index);
1896 /* Output the successors and the edge flags. */
1897 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1898 FOR_EACH_EDGE (e, ei, bb->succs)
1900 streamer_write_uhwi (ob, e->dest->index);
1901 e->probability.stream_out (ob);
1902 streamer_write_uhwi (ob, e->flags);
1906 streamer_write_hwi (ob, -1);
1908 bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
1909 while (bb->next_bb)
1911 streamer_write_hwi (ob, bb->next_bb->index);
1912 bb = bb->next_bb;
1915 streamer_write_hwi (ob, -1);
1917 /* Output the number of loops. */
1918 streamer_write_uhwi (ob, number_of_loops (fn));
1920 /* Output each loop, skipping the tree root which has number zero. */
1921 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1923 class loop *loop = get_loop (fn, i);
1925 /* Write the index of the loop header. That's enough to rebuild
1926 the loop tree on the reader side. Stream -1 for an unused
1927 loop entry. */
1928 if (!loop)
1930 streamer_write_hwi (ob, -1);
1931 continue;
1933 else
1934 streamer_write_hwi (ob, loop->header->index);
1936 /* Write everything copy_loop_info copies. */
1937 streamer_write_enum (ob->main_stream,
1938 loop_estimation, EST_LAST, loop->estimate_state);
1939 streamer_write_hwi (ob, loop->any_upper_bound);
1940 if (loop->any_upper_bound)
1941 streamer_write_widest_int (ob, loop->nb_iterations_upper_bound);
1942 streamer_write_hwi (ob, loop->any_likely_upper_bound);
1943 if (loop->any_likely_upper_bound)
1944 streamer_write_widest_int (ob, loop->nb_iterations_likely_upper_bound);
1945 streamer_write_hwi (ob, loop->any_estimate);
1946 if (loop->any_estimate)
1947 streamer_write_widest_int (ob, loop->nb_iterations_estimate);
1949 /* Write OMP SIMD related info. */
1950 streamer_write_hwi (ob, loop->safelen);
1951 streamer_write_hwi (ob, loop->unroll);
1952 streamer_write_hwi (ob, loop->owned_clique);
1953 streamer_write_hwi (ob, loop->dont_vectorize);
1954 streamer_write_hwi (ob, loop->force_vectorize);
1955 stream_write_tree (ob, loop->simduid, true);
1958 ob->main_stream = tmp_stream;
1962 /* Create the header in the file using OB. If the section type is for
1963 a function, set FN to the decl for that function. */
1965 void
1966 produce_asm (struct output_block *ob, tree fn)
1968 enum lto_section_type section_type = ob->section_type;
1969 struct lto_function_header header;
1970 char *section_name;
1972 if (section_type == LTO_section_function_body)
1974 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1975 section_name = lto_get_section_name (section_type, name,
1976 symtab_node::get (fn)->order,
1977 NULL);
1979 else
1980 section_name = lto_get_section_name (section_type, NULL, 0, NULL);
1982 lto_begin_section (section_name, !flag_wpa);
1983 free (section_name);
1985 /* The entire header is stream computed here. */
1986 memset (&header, 0, sizeof (struct lto_function_header));
1988 if (section_type == LTO_section_function_body)
1989 header.cfg_size = ob->cfg_stream->total_size;
1990 header.main_size = ob->main_stream->total_size;
1991 header.string_size = ob->string_stream->total_size;
1992 lto_write_data (&header, sizeof header);
1994 /* Put all of the gimple and the string table out the asm file as a
1995 block of text. */
1996 if (section_type == LTO_section_function_body)
1997 lto_write_stream (ob->cfg_stream);
1998 lto_write_stream (ob->main_stream);
1999 lto_write_stream (ob->string_stream);
2001 lto_end_section ();
2005 /* Output the base body of struct function FN using output block OB. */
2007 static void
2008 output_struct_function_base (struct output_block *ob, struct function *fn)
2010 struct bitpack_d bp;
2011 unsigned i;
2012 tree t;
2014 /* Output the static chain and non-local goto save area. */
2015 stream_write_tree (ob, fn->static_chain_decl, true);
2016 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
2018 /* Output all the local variables in the function. */
2019 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
2020 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
2021 stream_write_tree (ob, t, true);
2023 /* Output current IL state of the function. */
2024 streamer_write_uhwi (ob, fn->curr_properties);
2026 /* Write all the attributes for FN. */
2027 bp = bitpack_create (ob->main_stream);
2028 bp_pack_value (&bp, fn->is_thunk, 1);
2029 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
2030 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
2031 bp_pack_value (&bp, fn->returns_struct, 1);
2032 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
2033 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
2034 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
2035 bp_pack_value (&bp, fn->after_inlining, 1);
2036 bp_pack_value (&bp, fn->stdarg, 1);
2037 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
2038 bp_pack_value (&bp, fn->has_forced_label_in_static, 1);
2039 bp_pack_value (&bp, fn->calls_alloca, 1);
2040 bp_pack_value (&bp, fn->calls_setjmp, 1);
2041 bp_pack_value (&bp, fn->calls_eh_return, 1);
2042 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
2043 bp_pack_value (&bp, fn->has_simduid_loops, 1);
2044 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
2045 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
2046 bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8);
2048 /* Output the function start and end loci. */
2049 stream_output_location (ob, &bp, fn->function_start_locus);
2050 stream_output_location (ob, &bp, fn->function_end_locus);
2052 /* Save the instance discriminator if present. */
2053 int *instance_number_p = NULL;
2054 if (decl_to_instance_map)
2055 instance_number_p = decl_to_instance_map->get (fn->decl);
2056 bp_pack_value (&bp, !!instance_number_p, 1);
2057 if (instance_number_p)
2058 bp_pack_value (&bp, *instance_number_p, sizeof (int) * CHAR_BIT);
2060 streamer_write_bitpack (&bp);
2064 /* Collect all leaf BLOCKs beyond ROOT into LEAFS. */
2066 static void
2067 collect_block_tree_leafs (tree root, vec<tree> &leafs)
2069 for (root = BLOCK_SUBBLOCKS (root); root; root = BLOCK_CHAIN (root))
2070 if (! BLOCK_SUBBLOCKS (root))
2071 leafs.safe_push (root);
2072 else
2073 collect_block_tree_leafs (BLOCK_SUBBLOCKS (root), leafs);
2076 /* This performs function body modifications that are needed for streaming
2077 to work. */
2079 void
2080 lto_prepare_function_for_streaming (struct cgraph_node *node)
2082 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
2083 basic_block bb;
2085 if (number_of_loops (fn))
2087 push_cfun (fn);
2088 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
2089 loop_optimizer_finalize ();
2090 pop_cfun ();
2092 /* We will renumber the statements. The code that does this uses
2093 the same ordering that we use for serializing them so we can use
2094 the same code on the other end and not have to write out the
2095 statement numbers. We do not assign UIDs to PHIs here because
2096 virtual PHIs get re-computed on-the-fly which would make numbers
2097 inconsistent. */
2098 set_gimple_stmt_max_uid (fn, 0);
2099 FOR_ALL_BB_FN (bb, fn)
2101 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2102 gsi_next (&gsi))
2104 gphi *stmt = gsi.phi ();
2106 /* Virtual PHIs are not going to be streamed. */
2107 if (!virtual_operand_p (gimple_phi_result (stmt)))
2108 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2110 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
2111 gsi_next (&gsi))
2113 gimple *stmt = gsi_stmt (gsi);
2114 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2117 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2118 virtual phis now. */
2119 FOR_ALL_BB_FN (bb, fn)
2121 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2122 gsi_next (&gsi))
2124 gphi *stmt = gsi.phi ();
2125 if (virtual_operand_p (gimple_phi_result (stmt)))
2126 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2132 /* Output the body of function NODE->DECL. */
2134 static void
2135 output_function (struct cgraph_node *node)
2137 tree function;
2138 struct function *fn;
2139 basic_block bb;
2140 struct output_block *ob;
2142 if (streamer_dump_file)
2143 fprintf (streamer_dump_file, "\nStreaming body of %s\n",
2144 node->name ());
2146 function = node->decl;
2147 fn = DECL_STRUCT_FUNCTION (function);
2148 ob = create_output_block (LTO_section_function_body);
2150 clear_line_info (ob);
2151 ob->symbol = node;
2153 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
2155 /* Make string 0 be a NULL string. */
2156 streamer_write_char_stream (ob->string_stream, 0);
2158 streamer_write_record_start (ob, LTO_function);
2160 /* Output decls for parameters and args. */
2161 stream_write_tree (ob, DECL_RESULT (function), true);
2162 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
2164 /* Output debug args if available. */
2165 vec<tree, va_gc> **debugargs = decl_debug_args_lookup (function);
2166 if (! debugargs)
2167 streamer_write_uhwi (ob, 0);
2168 else
2170 streamer_write_uhwi (ob, (*debugargs)->length ());
2171 for (unsigned i = 0; i < (*debugargs)->length (); ++i)
2172 stream_write_tree (ob, (**debugargs)[i], true);
2175 /* Output DECL_INITIAL for the function, which contains the tree of
2176 lexical scopes. */
2177 stream_write_tree (ob, DECL_INITIAL (function), true);
2178 /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT
2179 collect block tree leafs and stream those. */
2180 auto_vec<tree> block_tree_leafs;
2181 if (DECL_INITIAL (function))
2182 collect_block_tree_leafs (DECL_INITIAL (function), block_tree_leafs);
2183 streamer_write_uhwi (ob, block_tree_leafs.length ());
2184 for (unsigned i = 0; i < block_tree_leafs.length (); ++i)
2185 stream_write_tree (ob, block_tree_leafs[i], true);
2187 /* We also stream abstract functions where we stream only stuff needed for
2188 debug info. */
2189 if (gimple_has_body_p (function))
2191 streamer_write_uhwi (ob, 1);
2192 output_struct_function_base (ob, fn);
2194 /* Output all the SSA names used in the function. */
2195 output_ssa_names (ob, fn);
2197 /* Output any exception handling regions. */
2198 output_eh_regions (ob, fn);
2200 /* Output the code for the function. */
2201 FOR_ALL_BB_FN (bb, fn)
2202 output_bb (ob, bb, fn);
2204 /* The terminator for this function. */
2205 streamer_write_record_start (ob, LTO_null);
2207 output_cfg (ob, fn);
2209 else
2210 streamer_write_uhwi (ob, 0);
2212 /* Create a section to hold the pickled output of this function. */
2213 produce_asm (ob, function);
2215 destroy_output_block (ob);
2216 if (streamer_dump_file)
2217 fprintf (streamer_dump_file, "Finished streaming %s\n",
2218 node->name ());
2221 /* Output the body of function NODE->DECL. */
2223 static void
2224 output_constructor (struct varpool_node *node)
2226 tree var = node->decl;
2227 struct output_block *ob;
2229 if (streamer_dump_file)
2230 fprintf (streamer_dump_file, "\nStreaming constructor of %s\n",
2231 node->name ());
2233 timevar_push (TV_IPA_LTO_CTORS_OUT);
2234 ob = create_output_block (LTO_section_function_body);
2236 clear_line_info (ob);
2237 ob->symbol = node;
2239 /* Make string 0 be a NULL string. */
2240 streamer_write_char_stream (ob->string_stream, 0);
2242 /* Output DECL_INITIAL for the function, which contains the tree of
2243 lexical scopes. */
2244 stream_write_tree (ob, DECL_INITIAL (var), true);
2246 /* Create a section to hold the pickled output of this function. */
2247 produce_asm (ob, var);
2249 destroy_output_block (ob);
2250 if (streamer_dump_file)
2251 fprintf (streamer_dump_file, "Finished streaming %s\n",
2252 node->name ());
2253 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2257 /* Emit toplevel asms. */
2259 void
2260 lto_output_toplevel_asms (void)
2262 struct output_block *ob;
2263 struct asm_node *can;
2264 char *section_name;
2265 struct lto_simple_header_with_strings header;
2267 if (!symtab->first_asm_symbol ())
2268 return;
2270 ob = create_output_block (LTO_section_asm);
2272 /* Make string 0 be a NULL string. */
2273 streamer_write_char_stream (ob->string_stream, 0);
2275 for (can = symtab->first_asm_symbol (); can; can = can->next)
2277 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
2278 streamer_write_hwi (ob, can->order);
2281 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
2283 section_name = lto_get_section_name (LTO_section_asm, NULL, 0, NULL);
2284 lto_begin_section (section_name, !flag_wpa);
2285 free (section_name);
2287 /* The entire header stream is computed here. */
2288 memset (&header, 0, sizeof (header));
2290 header.main_size = ob->main_stream->total_size;
2291 header.string_size = ob->string_stream->total_size;
2292 lto_write_data (&header, sizeof header);
2294 /* Put all of the gimple and the string table out the asm file as a
2295 block of text. */
2296 lto_write_stream (ob->main_stream);
2297 lto_write_stream (ob->string_stream);
2299 lto_end_section ();
2301 destroy_output_block (ob);
2305 /* Copy the function body or variable constructor of NODE without deserializing. */
2307 static void
2308 copy_function_or_variable (struct symtab_node *node)
2310 tree function = node->decl;
2311 struct lto_file_decl_data *file_data = node->lto_file_data;
2312 const char *data;
2313 size_t len;
2314 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2315 char *section_name =
2316 lto_get_section_name (LTO_section_function_body, name, node->order, NULL);
2317 size_t i, j;
2318 struct lto_in_decl_state *in_state;
2319 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2321 if (streamer_dump_file)
2322 fprintf (streamer_dump_file, "Copying section for %s\n", name);
2323 lto_begin_section (section_name, false);
2324 free (section_name);
2326 /* We may have renamed the declaration, e.g., a static function. */
2327 name = lto_get_decl_name_mapping (file_data, name);
2329 data = lto_get_raw_section_data (file_data, LTO_section_function_body,
2330 name, node->order - file_data->order_base,
2331 &len);
2332 gcc_assert (data);
2334 /* Do a bit copy of the function body. */
2335 lto_write_raw_data (data, len);
2337 /* Copy decls. */
2338 in_state =
2339 lto_get_function_in_decl_state (node->lto_file_data, function);
2340 out_state->compressed = in_state->compressed;
2341 gcc_assert (in_state);
2343 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2345 size_t n = vec_safe_length (in_state->streams[i]);
2346 vec<tree, va_gc> *trees = in_state->streams[i];
2347 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2349 /* The out state must have the same indices and the in state.
2350 So just copy the vector. All the encoders in the in state
2351 must be empty where we reach here. */
2352 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2353 encoder->trees.reserve_exact (n);
2354 for (j = 0; j < n; j++)
2355 encoder->trees.safe_push ((*trees)[j]);
2358 lto_free_raw_section_data (file_data, LTO_section_function_body, name,
2359 data, len);
2360 lto_end_section ();
2363 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2365 static tree
2366 wrap_refs (tree *tp, int *ws, void *)
2368 tree t = *tp;
2369 if (handled_component_p (t)
2370 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL
2371 && TREE_PUBLIC (TREE_OPERAND (t, 0)))
2373 tree decl = TREE_OPERAND (t, 0);
2374 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2375 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2376 build1 (ADDR_EXPR, ptrtype, decl),
2377 build_int_cst (ptrtype, 0));
2378 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2379 *ws = 0;
2381 else if (TREE_CODE (t) == CONSTRUCTOR)
2383 else if (!EXPR_P (t))
2384 *ws = 0;
2385 return NULL_TREE;
2388 /* Remove functions that are no longer used from offload_funcs, and mark the
2389 remaining ones with DECL_PRESERVE_P. */
2391 static void
2392 prune_offload_funcs (void)
2394 if (!offload_funcs)
2395 return;
2397 unsigned ix, ix2;
2398 tree *elem_ptr;
2399 VEC_ORDERED_REMOVE_IF (*offload_funcs, ix, ix2, elem_ptr,
2400 cgraph_node::get (*elem_ptr) == NULL);
2402 tree fn_decl;
2403 FOR_EACH_VEC_ELT (*offload_funcs, ix, fn_decl)
2404 DECL_PRESERVE_P (fn_decl) = 1;
2407 /* Produce LTO section that contains global information
2408 about LTO bytecode. */
2410 static void
2411 produce_lto_section ()
2413 /* Stream LTO meta section. */
2414 output_block *ob = create_output_block (LTO_section_lto);
2416 char * section_name = lto_get_section_name (LTO_section_lto, NULL, 0, NULL);
2417 lto_begin_section (section_name, false);
2418 free (section_name);
2420 #ifdef HAVE_ZSTD_H
2421 lto_compression compression = ZSTD;
2422 #else
2423 lto_compression compression = ZLIB;
2424 #endif
2426 bool slim_object = flag_generate_lto && !flag_fat_lto_objects;
2427 lto_section s
2428 = { LTO_major_version, LTO_minor_version, slim_object, 0 };
2429 s.set_compression (compression);
2430 lto_write_data (&s, sizeof s);
2431 lto_end_section ();
2432 destroy_output_block (ob);
2435 /* Compare symbols to get them sorted by filename (to optimize streaming) */
2437 static int
2438 cmp_symbol_files (const void *pn1, const void *pn2)
2440 const symtab_node *n1 = *(const symtab_node * const *)pn1;
2441 const symtab_node *n2 = *(const symtab_node * const *)pn2;
2443 int file_order1 = n1->lto_file_data ? n1->lto_file_data->order : -1;
2444 int file_order2 = n2->lto_file_data ? n2->lto_file_data->order : -1;
2446 /* Order files same way as they appeared in the command line to reduce
2447 seeking while copying sections. */
2448 if (file_order1 != file_order2)
2449 return file_order1 - file_order2;
2451 /* Order within static library. */
2452 if (n1->lto_file_data && n1->lto_file_data->id != n2->lto_file_data->id)
2454 if (n1->lto_file_data->id > n2->lto_file_data->id)
2455 return 1;
2456 if (n1->lto_file_data->id < n2->lto_file_data->id)
2457 return -1;
2460 /* And finaly order by the definition order. */
2461 return n1->order - n2->order;
2464 /* Main entry point from the pass manager. */
2466 void
2467 lto_output (void)
2469 struct lto_out_decl_state *decl_state;
2470 bitmap output = NULL;
2471 bitmap_obstack output_obstack;
2472 unsigned int i, n_nodes;
2473 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2474 auto_vec<symtab_node *> symbols_to_copy;
2476 prune_offload_funcs ();
2478 if (flag_checking)
2480 bitmap_obstack_initialize (&output_obstack);
2481 output = BITMAP_ALLOC (&output_obstack);
2484 /* Initialize the streamer. */
2485 lto_streamer_init ();
2487 produce_lto_section ();
2489 n_nodes = lto_symtab_encoder_size (encoder);
2490 /* Prepare vector of functions to output and then sort it to optimize
2491 section copying. */
2492 for (i = 0; i < n_nodes; i++)
2494 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2495 if (snode->alias)
2496 continue;
2497 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2499 if (lto_symtab_encoder_encode_body_p (encoder, node))
2500 symbols_to_copy.safe_push (node);
2502 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2504 /* Wrap symbol references inside the ctor in a type
2505 preserving MEM_REF. */
2506 tree ctor = DECL_INITIAL (node->decl);
2507 if (ctor && !in_lto_p)
2508 walk_tree (&ctor, wrap_refs, NULL, NULL);
2509 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2510 && lto_symtab_encoder_encode_initializer_p (encoder, node))
2511 symbols_to_copy.safe_push (node);
2514 symbols_to_copy.qsort (cmp_symbol_files);
2515 for (i = 0; i < symbols_to_copy.length (); i++)
2517 symtab_node *snode = symbols_to_copy[i];
2518 cgraph_node *cnode;
2519 varpool_node *vnode;
2521 if (flag_checking)
2522 gcc_assert (bitmap_set_bit (output, DECL_UID (snode->decl)));
2524 decl_state = lto_new_out_decl_state ();
2525 lto_push_out_decl_state (decl_state);
2527 if ((cnode = dyn_cast <cgraph_node *> (snode))
2528 && (gimple_has_body_p (cnode->decl)
2529 || (!flag_wpa
2530 && flag_incremental_link != INCREMENTAL_LINK_LTO)
2531 /* Thunks have no body but they may be synthetized
2532 at WPA time. */
2533 || DECL_ARGUMENTS (cnode->decl)))
2534 output_function (cnode);
2535 else if ((vnode = dyn_cast <varpool_node *> (snode))
2536 && (DECL_INITIAL (vnode->decl) != error_mark_node
2537 || (!flag_wpa
2538 && flag_incremental_link != INCREMENTAL_LINK_LTO)))
2539 output_constructor (vnode);
2540 else
2541 copy_function_or_variable (snode);
2542 gcc_assert (lto_get_out_decl_state () == decl_state);
2543 lto_pop_out_decl_state ();
2544 lto_record_function_out_decl_state (snode->decl, decl_state);
2547 /* Emit the callgraph after emitting function bodies. This needs to
2548 be done now to make sure that all the statements in every function
2549 have been renumbered so that edges can be associated with call
2550 statements using the statement UIDs. */
2551 output_symtab ();
2553 output_offload_tables ();
2555 if (flag_checking)
2557 BITMAP_FREE (output);
2558 bitmap_obstack_release (&output_obstack);
2562 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2563 from it and required for correct representation of its semantics.
2564 Each node in ENCODER must be a global declaration or a type. A node
2565 is written only once, even if it appears multiple times in the
2566 vector. Certain transitively-reachable nodes, such as those
2567 representing expressions, may be duplicated, but such nodes
2568 must not appear in ENCODER itself. */
2570 static void
2571 write_global_stream (struct output_block *ob,
2572 struct lto_tree_ref_encoder *encoder)
2574 tree t;
2575 size_t index;
2576 const size_t size = lto_tree_ref_encoder_size (encoder);
2578 for (index = 0; index < size; index++)
2580 t = lto_tree_ref_encoder_get_tree (encoder, index);
2581 if (streamer_dump_file)
2583 fprintf (streamer_dump_file, " %i:", (int)index);
2584 print_node_brief (streamer_dump_file, "", t, 4);
2585 fprintf (streamer_dump_file, "\n");
2587 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2588 stream_write_tree (ob, t, false);
2593 /* Write a sequence of indices into the globals vector corresponding
2594 to the trees in ENCODER. These are used by the reader to map the
2595 indices used to refer to global entities within function bodies to
2596 their referents. */
2598 static void
2599 write_global_references (struct output_block *ob,
2600 struct lto_tree_ref_encoder *encoder)
2602 tree t;
2603 uint32_t index;
2604 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2606 /* Write size and slot indexes as 32-bit unsigned numbers. */
2607 uint32_t *data = XNEWVEC (uint32_t, size + 1);
2608 data[0] = size;
2610 for (index = 0; index < size; index++)
2612 unsigned slot_num;
2614 t = lto_tree_ref_encoder_get_tree (encoder, index);
2615 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2616 gcc_assert (slot_num != (unsigned)-1);
2617 data[index + 1] = slot_num;
2620 lto_write_data (data, sizeof (int32_t) * (size + 1));
2621 free (data);
2625 /* Write all the streams in an lto_out_decl_state STATE using
2626 output block OB and output stream OUT_STREAM. */
2628 void
2629 lto_output_decl_state_streams (struct output_block *ob,
2630 struct lto_out_decl_state *state)
2632 int i;
2634 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2635 write_global_stream (ob, &state->streams[i]);
2639 /* Write all the references in an lto_out_decl_state STATE using
2640 output block OB and output stream OUT_STREAM. */
2642 void
2643 lto_output_decl_state_refs (struct output_block *ob,
2644 struct lto_out_decl_state *state)
2646 unsigned i;
2647 unsigned ref;
2648 tree decl;
2650 /* Write reference to FUNCTION_DECL. If there is not function,
2651 write reference to void_type_node. */
2652 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2653 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2654 gcc_assert (ref != (unsigned)-1);
2655 ref = ref * 2 + (state->compressed ? 1 : 0);
2656 lto_write_data (&ref, sizeof (uint32_t));
2658 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2659 write_global_references (ob, &state->streams[i]);
2663 /* Return the written size of STATE. */
2665 static size_t
2666 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2668 int i;
2669 size_t size;
2671 size = sizeof (int32_t); /* fn_ref. */
2672 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2674 size += sizeof (int32_t); /* vector size. */
2675 size += (lto_tree_ref_encoder_size (&state->streams[i])
2676 * sizeof (int32_t));
2678 return size;
2682 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2683 so far. */
2685 static void
2686 write_symbol (struct streamer_tree_cache_d *cache,
2687 tree t, hash_set<const char *> *seen, bool alias)
2689 const char *name;
2690 enum gcc_plugin_symbol_kind kind;
2691 enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT;
2692 unsigned slot_num;
2693 uint64_t size;
2694 const char *comdat;
2695 unsigned char c;
2697 gcc_assert (VAR_OR_FUNCTION_DECL_P (t));
2699 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2701 /* This behaves like assemble_name_raw in varasm.c, performing the
2702 same name manipulations that ASM_OUTPUT_LABELREF does. */
2703 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2705 if (seen->add (name))
2706 return;
2708 streamer_tree_cache_lookup (cache, t, &slot_num);
2709 gcc_assert (slot_num != (unsigned)-1);
2711 if (DECL_EXTERNAL (t))
2713 if (DECL_WEAK (t))
2714 kind = GCCPK_WEAKUNDEF;
2715 else
2716 kind = GCCPK_UNDEF;
2718 else
2720 if (DECL_WEAK (t))
2721 kind = GCCPK_WEAKDEF;
2722 else if (DECL_COMMON (t))
2723 kind = GCCPK_COMMON;
2724 else
2725 kind = GCCPK_DEF;
2727 /* When something is defined, it should have node attached. */
2728 gcc_assert (alias || !VAR_P (t) || varpool_node::get (t)->definition);
2729 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2730 || (cgraph_node::get (t)
2731 && cgraph_node::get (t)->definition));
2734 /* Imitate what default_elf_asm_output_external do.
2735 When symbol is external, we need to output it with DEFAULT visibility
2736 when compiling with -fvisibility=default, while with HIDDEN visibility
2737 when symbol has attribute (visibility("hidden")) specified.
2738 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2739 right. */
2741 if (DECL_EXTERNAL (t)
2742 && !targetm.binds_local_p (t))
2743 visibility = GCCPV_DEFAULT;
2744 else
2745 switch (DECL_VISIBILITY (t))
2747 case VISIBILITY_DEFAULT:
2748 visibility = GCCPV_DEFAULT;
2749 break;
2750 case VISIBILITY_PROTECTED:
2751 visibility = GCCPV_PROTECTED;
2752 break;
2753 case VISIBILITY_HIDDEN:
2754 visibility = GCCPV_HIDDEN;
2755 break;
2756 case VISIBILITY_INTERNAL:
2757 visibility = GCCPV_INTERNAL;
2758 break;
2761 if (kind == GCCPK_COMMON
2762 && DECL_SIZE_UNIT (t)
2763 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2764 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2765 else
2766 size = 0;
2768 if (DECL_ONE_ONLY (t))
2769 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2770 else
2771 comdat = "";
2773 lto_write_data (name, strlen (name) + 1);
2774 lto_write_data (comdat, strlen (comdat) + 1);
2775 c = (unsigned char) kind;
2776 lto_write_data (&c, 1);
2777 c = (unsigned char) visibility;
2778 lto_write_data (&c, 1);
2779 lto_write_data (&size, 8);
2780 lto_write_data (&slot_num, 4);
2783 /* Write an IL symbol table to OB.
2784 SET and VSET are cgraph/varpool node sets we are outputting. */
2786 static void
2787 produce_symtab (struct output_block *ob)
2789 struct streamer_tree_cache_d *cache = ob->writer_cache;
2790 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, 0, NULL);
2791 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2792 lto_symtab_encoder_iterator lsei;
2794 lto_begin_section (section_name, false);
2795 free (section_name);
2797 hash_set<const char *> seen;
2799 /* Write the symbol table.
2800 First write everything defined and then all declarations.
2801 This is necessary to handle cases where we have duplicated symbols. */
2802 for (lsei = lsei_start (encoder);
2803 !lsei_end_p (lsei); lsei_next (&lsei))
2805 symtab_node *node = lsei_node (lsei);
2807 if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
2808 continue;
2809 write_symbol (cache, node->decl, &seen, false);
2811 for (lsei = lsei_start (encoder);
2812 !lsei_end_p (lsei); lsei_next (&lsei))
2814 symtab_node *node = lsei_node (lsei);
2816 if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
2817 continue;
2818 write_symbol (cache, node->decl, &seen, false);
2821 lto_end_section ();
2825 /* Init the streamer_mode_table for output, where we collect info on what
2826 machine_mode values have been streamed. */
2827 void
2828 lto_output_init_mode_table (void)
2830 memset (streamer_mode_table, '\0', MAX_MACHINE_MODE);
2834 /* Write the mode table. */
2835 static void
2836 lto_write_mode_table (void)
2838 struct output_block *ob;
2839 ob = create_output_block (LTO_section_mode_table);
2840 bitpack_d bp = bitpack_create (ob->main_stream);
2842 /* Ensure that for GET_MODE_INNER (m) != m we have
2843 also the inner mode marked. */
2844 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
2845 if (streamer_mode_table[i])
2847 machine_mode m = (machine_mode) i;
2848 machine_mode inner_m = GET_MODE_INNER (m);
2849 if (inner_m != m)
2850 streamer_mode_table[(int) inner_m] = 1;
2852 /* First stream modes that have GET_MODE_INNER (m) == m,
2853 so that we can refer to them afterwards. */
2854 for (int pass = 0; pass < 2; pass++)
2855 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
2856 if (streamer_mode_table[i] && i != (int) VOIDmode && i != (int) BLKmode)
2858 machine_mode m = (machine_mode) i;
2859 if ((GET_MODE_INNER (m) == m) ^ (pass == 0))
2860 continue;
2861 bp_pack_value (&bp, m, 8);
2862 bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m));
2863 bp_pack_poly_value (&bp, GET_MODE_SIZE (m), 16);
2864 bp_pack_poly_value (&bp, GET_MODE_PRECISION (m), 16);
2865 bp_pack_value (&bp, GET_MODE_INNER (m), 8);
2866 bp_pack_poly_value (&bp, GET_MODE_NUNITS (m), 16);
2867 switch (GET_MODE_CLASS (m))
2869 case MODE_FRACT:
2870 case MODE_UFRACT:
2871 case MODE_ACCUM:
2872 case MODE_UACCUM:
2873 bp_pack_value (&bp, GET_MODE_IBIT (m), 8);
2874 bp_pack_value (&bp, GET_MODE_FBIT (m), 8);
2875 break;
2876 case MODE_FLOAT:
2877 case MODE_DECIMAL_FLOAT:
2878 bp_pack_string (ob, &bp, REAL_MODE_FORMAT (m)->name, true);
2879 break;
2880 default:
2881 break;
2883 bp_pack_string (ob, &bp, GET_MODE_NAME (m), true);
2885 bp_pack_value (&bp, VOIDmode, 8);
2887 streamer_write_bitpack (&bp);
2889 char *section_name
2890 = lto_get_section_name (LTO_section_mode_table, NULL, 0, NULL);
2891 lto_begin_section (section_name, !flag_wpa);
2892 free (section_name);
2894 /* The entire header stream is computed here. */
2895 struct lto_simple_header_with_strings header;
2896 memset (&header, 0, sizeof (header));
2898 header.main_size = ob->main_stream->total_size;
2899 header.string_size = ob->string_stream->total_size;
2900 lto_write_data (&header, sizeof header);
2902 /* Put all of the gimple and the string table out the asm file as a
2903 block of text. */
2904 lto_write_stream (ob->main_stream);
2905 lto_write_stream (ob->string_stream);
2907 lto_end_section ();
2908 destroy_output_block (ob);
2912 /* This pass is run after all of the functions are serialized and all
2913 of the IPA passes have written their serialized forms. This pass
2914 causes the vector of all of the global decls and types used from
2915 this file to be written in to a section that can then be read in to
2916 recover these on other side. */
2918 void
2919 produce_asm_for_decls (void)
2921 struct lto_out_decl_state *out_state;
2922 struct lto_out_decl_state *fn_out_state;
2923 struct lto_decl_header header;
2924 char *section_name;
2925 struct output_block *ob;
2926 unsigned idx, num_fns;
2927 size_t decl_state_size;
2928 int32_t num_decl_states;
2930 ob = create_output_block (LTO_section_decls);
2932 memset (&header, 0, sizeof (struct lto_decl_header));
2934 section_name = lto_get_section_name (LTO_section_decls, NULL, 0, NULL);
2935 lto_begin_section (section_name, !flag_wpa);
2936 free (section_name);
2938 /* Make string 0 be a NULL string. */
2939 streamer_write_char_stream (ob->string_stream, 0);
2941 gcc_assert (!alias_pairs);
2943 /* Get rid of the global decl state hash tables to save some memory. */
2944 out_state = lto_get_out_decl_state ();
2945 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2946 if (out_state->streams[i].tree_hash_table)
2948 delete out_state->streams[i].tree_hash_table;
2949 out_state->streams[i].tree_hash_table = NULL;
2952 /* Write the global symbols. */
2953 if (streamer_dump_file)
2954 fprintf (streamer_dump_file, "Outputting global stream\n");
2955 lto_output_decl_state_streams (ob, out_state);
2956 num_fns = lto_function_decl_states.length ();
2957 for (idx = 0; idx < num_fns; idx++)
2959 fn_out_state =
2960 lto_function_decl_states[idx];
2961 if (streamer_dump_file)
2962 fprintf (streamer_dump_file, "Outputting stream for %s\n",
2963 IDENTIFIER_POINTER
2964 (DECL_ASSEMBLER_NAME (fn_out_state->fn_decl)));
2965 lto_output_decl_state_streams (ob, fn_out_state);
2968 /* Currently not used. This field would allow us to preallocate
2969 the globals vector, so that it need not be resized as it is extended. */
2970 header.num_nodes = -1;
2972 /* Compute the total size of all decl out states. */
2973 decl_state_size = sizeof (int32_t);
2974 decl_state_size += lto_out_decl_state_written_size (out_state);
2975 for (idx = 0; idx < num_fns; idx++)
2977 fn_out_state =
2978 lto_function_decl_states[idx];
2979 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2981 header.decl_state_size = decl_state_size;
2983 header.main_size = ob->main_stream->total_size;
2984 header.string_size = ob->string_stream->total_size;
2986 lto_write_data (&header, sizeof header);
2988 /* Write the main out-decl state, followed by out-decl states of
2989 functions. */
2990 num_decl_states = num_fns + 1;
2991 lto_write_data (&num_decl_states, sizeof (num_decl_states));
2992 lto_output_decl_state_refs (ob, out_state);
2993 for (idx = 0; idx < num_fns; idx++)
2995 fn_out_state = lto_function_decl_states[idx];
2996 lto_output_decl_state_refs (ob, fn_out_state);
2999 lto_write_stream (ob->main_stream);
3000 lto_write_stream (ob->string_stream);
3002 lto_end_section ();
3004 /* Write the symbol table. It is used by linker to determine dependencies
3005 and thus we can skip it for WPA. */
3006 if (!flag_wpa)
3007 produce_symtab (ob);
3009 /* Write command line opts. */
3010 lto_write_options ();
3012 /* Deallocate memory and clean up. */
3013 for (idx = 0; idx < num_fns; idx++)
3015 fn_out_state =
3016 lto_function_decl_states[idx];
3017 lto_delete_out_decl_state (fn_out_state);
3019 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
3020 lto_function_decl_states.release ();
3021 destroy_output_block (ob);
3022 if (lto_stream_offload_p)
3023 lto_write_mode_table ();