Daily bump.
[official-gcc.git] / gcc / lto-streamer-out.c
blob1faf31c05512ffc5e38a02f5b0ca899242439de7
1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2020 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 auto_vec<scc_entry,32> 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 auto_vec<worklist, 32> 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 gcc_obstack_init (&sccstate_obstack);
562 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
563 while (!worklist_vec.is_empty ())
565 worklist &w = worklist_vec.last ();
566 expr = w.expr;
567 sccs *from_state = w.from_state;
568 sccs *cstate = w.cstate;
569 ref_p = w.ref_p;
570 this_ref_p = w.this_ref_p;
571 if (cstate == NULL)
573 sccs **slot = &sccstate.get_or_insert (expr);
574 cstate = *slot;
575 if (cstate)
577 gcc_checking_assert (from_state);
578 if (cstate->dfsnum < from_state->dfsnum)
579 from_state->low = MIN (cstate->dfsnum, from_state->low);
580 worklist_vec.pop ();
581 continue;
584 scc_entry e = { expr, 0 };
585 /* Not yet visited. DFS recurse and push it onto the stack. */
586 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
587 sccstack.safe_push (e);
588 cstate->dfsnum = next_dfs_num++;
589 cstate->low = cstate->dfsnum;
590 w.cstate = cstate;
592 if (TREE_CODE (expr) == INTEGER_CST
593 && !TREE_OVERFLOW (expr))
594 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
595 else
597 DFS_write_tree_body (ob, expr, cstate, ref_p);
599 /* Walk any LTO-specific edges. */
600 if (DECL_P (expr)
601 && TREE_CODE (expr) != FUNCTION_DECL
602 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
604 /* Handle DECL_INITIAL for symbols. */
605 tree initial
606 = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
607 expr);
608 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
611 continue;
614 /* See if we found an SCC. */
615 if (cstate->low == cstate->dfsnum)
617 unsigned first, size;
618 tree x;
620 /* If we are re-walking a single leaf SCC just pop it,
621 let earlier worklist item access the sccstack. */
622 if (single_p)
624 worklist_vec.pop ();
625 continue;
628 /* Pop the SCC and compute its size. */
629 first = sccstack.length ();
632 x = sccstack[--first].t;
634 while (x != expr);
635 size = sccstack.length () - first;
637 /* No need to compute hashes for LTRANS units, we don't perform
638 any merging there. */
639 hashval_t scc_hash = 0;
640 unsigned scc_entry_len = 0;
641 if (!flag_wpa)
643 scc_hash = hash_scc (ob, first, size, ref_p, this_ref_p);
645 /* Put the entries with the least number of collisions first. */
646 unsigned entry_start = 0;
647 scc_entry_len = size + 1;
648 for (unsigned i = 0; i < size;)
650 unsigned from = i;
651 for (i = i + 1; i < size
652 && (sccstack[first + i].hash
653 == sccstack[first + from].hash); ++i)
655 if (i - from < scc_entry_len)
657 scc_entry_len = i - from;
658 entry_start = from;
661 for (unsigned i = 0; i < scc_entry_len; ++i)
662 std::swap (sccstack[first + i],
663 sccstack[first + entry_start + i]);
665 /* We already sorted SCC deterministically in hash_scc. */
667 /* Check that we have only one SCC.
668 Naturally we may have conflicts if hash function is not
669 strong enough. Lets see how far this gets. */
670 gcc_checking_assert (scc_entry_len == 1);
673 /* Write LTO_tree_scc. */
674 streamer_write_record_start (ob, LTO_tree_scc);
675 streamer_write_uhwi (ob, size);
676 streamer_write_uhwi (ob, scc_hash);
678 /* Write size-1 SCCs without wrapping them inside SCC bundles.
679 All INTEGER_CSTs need to be handled this way as we need
680 their type to materialize them. Also builtins are handled
681 this way.
682 ??? We still wrap these in LTO_tree_scc so at the
683 input side we can properly identify the tree we want
684 to ultimatively return. */
685 if (size == 1)
686 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
687 else
689 /* Write the size of the SCC entry candidates. */
690 streamer_write_uhwi (ob, scc_entry_len);
692 /* Write all headers and populate the streamer cache. */
693 for (unsigned i = 0; i < size; ++i)
695 hashval_t hash = sccstack[first+i].hash;
696 tree t = sccstack[first+i].t;
697 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
698 t, hash, NULL);
699 gcc_assert (!exists_p);
701 if (!lto_is_streamable (t))
702 internal_error ("tree code %qs is not supported "
703 "in LTO streams",
704 get_tree_code_name (TREE_CODE (t)));
706 /* Write the header, containing everything needed to
707 materialize EXPR on the reading side. */
708 streamer_write_tree_header (ob, t);
711 /* Write the bitpacks and tree references. */
712 for (unsigned i = 0; i < size; ++i)
714 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
716 /* Mark the end of the tree. */
717 streamer_write_zero (ob);
721 /* Finally truncate the vector. */
722 sccstack.truncate (first);
724 if (from_state)
725 from_state->low = MIN (from_state->low, cstate->low);
726 worklist_vec.pop ();
727 continue;
730 gcc_checking_assert (from_state);
731 from_state->low = MIN (from_state->low, cstate->low);
732 if (cstate->dfsnum < from_state->dfsnum)
733 from_state->low = MIN (cstate->dfsnum, from_state->low);
734 worklist_vec.pop ();
738 DFS::~DFS ()
740 obstack_free (&sccstate_obstack, NULL);
743 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
744 DFS recurse for all tree edges originating from it. */
746 void
747 DFS::DFS_write_tree_body (struct output_block *ob,
748 tree expr, sccs *expr_state, bool ref_p)
750 #define DFS_follow_tree_edge(DEST) \
751 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
753 enum tree_code code;
755 if (streamer_dump_file)
757 print_node_brief (streamer_dump_file, " Streaming ",
758 expr, 4);
759 fprintf (streamer_dump_file, " to %s\n",
760 lto_section_name [ob->section_type]);
763 code = TREE_CODE (expr);
765 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
767 if (TREE_CODE (expr) != IDENTIFIER_NODE)
768 DFS_follow_tree_edge (TREE_TYPE (expr));
771 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
773 unsigned int count = vector_cst_encoded_nelts (expr);
774 for (unsigned int i = 0; i < count; ++i)
775 DFS_follow_tree_edge (VECTOR_CST_ENCODED_ELT (expr, i));
778 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
779 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
780 DFS_follow_tree_edge (POLY_INT_CST_COEFF (expr, i));
782 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
784 DFS_follow_tree_edge (TREE_REALPART (expr));
785 DFS_follow_tree_edge (TREE_IMAGPART (expr));
788 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
790 /* Drop names that were created for anonymous entities. */
791 if (DECL_NAME (expr)
792 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
793 && IDENTIFIER_ANON_P (DECL_NAME (expr)))
795 else
796 DFS_follow_tree_edge (DECL_NAME (expr));
797 if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
798 && ! DECL_CONTEXT (expr))
799 DFS_follow_tree_edge ((*all_translation_units)[0]);
800 else
801 DFS_follow_tree_edge (DECL_CONTEXT (expr));
804 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
806 DFS_follow_tree_edge (DECL_SIZE (expr));
807 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
809 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
810 special handling in LTO, it must be handled by streamer hooks. */
812 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
814 /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark
815 declarations which should be eliminated by decl merging. Be sure none
816 leaks to this point. */
817 gcc_assert (DECL_ABSTRACT_ORIGIN (expr) != error_mark_node);
818 DFS_follow_tree_edge (DECL_ABSTRACT_ORIGIN (expr));
820 if ((VAR_P (expr)
821 || TREE_CODE (expr) == PARM_DECL)
822 && DECL_HAS_VALUE_EXPR_P (expr))
823 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
824 if (VAR_P (expr)
825 && DECL_HAS_DEBUG_EXPR_P (expr))
826 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
829 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
831 /* Make sure we don't inadvertently set the assembler name. */
832 if (DECL_ASSEMBLER_NAME_SET_P (expr))
833 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
836 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
838 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
839 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
840 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
841 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
842 gcc_checking_assert (!DECL_FCONTEXT (expr));
845 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
847 gcc_checking_assert (DECL_VINDEX (expr) == NULL);
848 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
849 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
850 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
853 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
855 DFS_follow_tree_edge (TYPE_SIZE (expr));
856 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
857 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
858 DFS_follow_tree_edge (TYPE_NAME (expr));
859 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
860 reconstructed during fixup. */
861 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
862 during fixup. */
863 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
864 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
865 /* TYPE_CANONICAL is re-computed during type merging, so no need
866 to follow it here. */
867 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
868 it cannot be freed by free_lang_data without triggering ICEs in
869 langhooks. */
872 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
874 if (TREE_CODE (expr) == ENUMERAL_TYPE)
875 DFS_follow_tree_edge (TYPE_VALUES (expr));
876 else if (TREE_CODE (expr) == ARRAY_TYPE)
877 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
878 else if (RECORD_OR_UNION_TYPE_P (expr))
879 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
880 DFS_follow_tree_edge (t);
881 else if (TREE_CODE (expr) == FUNCTION_TYPE
882 || TREE_CODE (expr) == METHOD_TYPE)
883 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
885 if (!POINTER_TYPE_P (expr))
886 DFS_follow_tree_edge (TYPE_MIN_VALUE_RAW (expr));
887 DFS_follow_tree_edge (TYPE_MAX_VALUE_RAW (expr));
890 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
892 DFS_follow_tree_edge (TREE_PURPOSE (expr));
893 DFS_follow_tree_edge (TREE_VALUE (expr));
894 DFS_follow_tree_edge (TREE_CHAIN (expr));
897 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
899 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
900 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
903 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
905 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
906 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
907 DFS_follow_tree_edge (TREE_BLOCK (expr));
910 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
912 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
914 /* We would have to stream externals in the block chain as
915 non-references but we should have dropped them in
916 free-lang-data. */
917 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
918 DFS_follow_tree_edge (t);
921 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
922 DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr));
924 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
925 information for early inlined BLOCKs so drop it on the floor instead
926 of ICEing in dwarf2out.c. */
928 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
929 streaming time. */
931 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
932 list is re-constructed from BLOCK_SUPERCONTEXT. */
935 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
937 unsigned i;
938 tree t;
940 /* Note that the number of BINFO slots has already been emitted in
941 EXPR's header (see streamer_write_tree_header) because this length
942 is needed to build the empty BINFO node on the reader side. */
943 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
944 DFS_follow_tree_edge (t);
945 DFS_follow_tree_edge (BINFO_OFFSET (expr));
946 DFS_follow_tree_edge (BINFO_VTABLE (expr));
948 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
949 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
950 by C++ FE only. */
953 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
955 unsigned i;
956 tree index, value;
958 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
960 DFS_follow_tree_edge (index);
961 DFS_follow_tree_edge (value);
965 if (code == OMP_CLAUSE)
967 int i;
968 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
969 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
970 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
973 #undef DFS_follow_tree_edge
976 /* Return a hash value for the tree T.
977 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
978 may hold hash values if trees inside current SCC. */
980 static hashval_t
981 hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
983 inchash::hash hstate;
985 #define visit(SIBLING) \
986 do { \
987 unsigned ix; \
988 if (!SIBLING) \
989 hstate.add_int (0); \
990 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
991 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
992 else if (map) \
993 hstate.add_int (*map->get (SIBLING)); \
994 else \
995 hstate.add_int (1); \
996 } while (0)
998 /* Hash TS_BASE. */
999 enum tree_code code = TREE_CODE (t);
1000 hstate.add_int (code);
1001 if (!TYPE_P (t))
1003 hstate.add_flag (TREE_SIDE_EFFECTS (t));
1004 hstate.add_flag (TREE_CONSTANT (t));
1005 hstate.add_flag (TREE_READONLY (t));
1006 hstate.add_flag (TREE_PUBLIC (t));
1008 hstate.add_flag (TREE_ADDRESSABLE (t));
1009 hstate.add_flag (TREE_THIS_VOLATILE (t));
1010 if (DECL_P (t))
1011 hstate.add_flag (DECL_UNSIGNED (t));
1012 else if (TYPE_P (t))
1013 hstate.add_flag (TYPE_UNSIGNED (t));
1014 if (TYPE_P (t))
1015 hstate.add_flag (TYPE_ARTIFICIAL (t));
1016 else
1017 hstate.add_flag (TREE_NO_WARNING (t));
1018 hstate.add_flag (TREE_NOTHROW (t));
1019 hstate.add_flag (TREE_STATIC (t));
1020 hstate.add_flag (TREE_PROTECTED (t));
1021 hstate.add_flag (TREE_DEPRECATED (t));
1022 if (code != TREE_BINFO)
1023 hstate.add_flag (TREE_PRIVATE (t));
1024 if (TYPE_P (t))
1026 hstate.add_flag (AGGREGATE_TYPE_P (t)
1027 ? TYPE_REVERSE_STORAGE_ORDER (t) : TYPE_SATURATING (t));
1028 hstate.add_flag (TYPE_ADDR_SPACE (t));
1030 else if (code == SSA_NAME)
1031 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
1032 hstate.commit_flag ();
1034 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
1035 hstate.add_wide_int (wi::to_widest (t));
1037 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
1039 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
1040 hstate.add_flag (r.cl);
1041 hstate.add_flag (r.sign);
1042 hstate.add_flag (r.signalling);
1043 hstate.add_flag (r.canonical);
1044 hstate.commit_flag ();
1045 hstate.add_int (r.uexp);
1046 hstate.add (r.sig, sizeof (r.sig));
1049 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
1051 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
1052 hstate.add_int (f.mode);
1053 hstate.add_int (f.data.low);
1054 hstate.add_int (f.data.high);
1057 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1059 hstate.add_hwi (DECL_MODE (t));
1060 hstate.add_flag (DECL_NONLOCAL (t));
1061 hstate.add_flag (DECL_VIRTUAL_P (t));
1062 hstate.add_flag (DECL_IGNORED_P (t));
1063 hstate.add_flag (DECL_ABSTRACT_P (t));
1064 hstate.add_flag (DECL_ARTIFICIAL (t));
1065 hstate.add_flag (DECL_USER_ALIGN (t));
1066 hstate.add_flag (DECL_PRESERVE_P (t));
1067 hstate.add_flag (DECL_EXTERNAL (t));
1068 hstate.add_flag (DECL_GIMPLE_REG_P (t));
1069 hstate.commit_flag ();
1070 hstate.add_int (DECL_ALIGN (t));
1071 if (code == LABEL_DECL)
1073 hstate.add_int (EH_LANDING_PAD_NR (t));
1074 hstate.add_int (LABEL_DECL_UID (t));
1076 else if (code == FIELD_DECL)
1078 hstate.add_flag (DECL_PACKED (t));
1079 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
1080 hstate.add_flag (DECL_PADDING_P (t));
1081 hstate.add_int (DECL_OFFSET_ALIGN (t));
1083 else if (code == VAR_DECL)
1085 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
1086 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
1088 if (code == RESULT_DECL
1089 || code == PARM_DECL
1090 || code == VAR_DECL)
1092 hstate.add_flag (DECL_BY_REFERENCE (t));
1093 if (code == VAR_DECL
1094 || code == PARM_DECL)
1095 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
1097 hstate.commit_flag ();
1100 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
1101 hstate.add_int (DECL_REGISTER (t));
1103 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1105 hstate.add_flag (DECL_COMMON (t));
1106 hstate.add_flag (DECL_DLLIMPORT_P (t));
1107 hstate.add_flag (DECL_WEAK (t));
1108 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
1109 hstate.add_flag (DECL_COMDAT (t));
1110 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
1111 hstate.add_int (DECL_VISIBILITY (t));
1112 if (code == VAR_DECL)
1114 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
1115 hstate.add_flag (DECL_HARD_REGISTER (t));
1116 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
1118 if (TREE_CODE (t) == FUNCTION_DECL)
1120 hstate.add_flag (DECL_FINAL_P (t));
1121 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
1122 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
1124 hstate.commit_flag ();
1127 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1129 hstate.add_int (DECL_BUILT_IN_CLASS (t));
1130 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
1131 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
1132 hstate.add_flag (FUNCTION_DECL_DECL_TYPE (t));
1133 hstate.add_flag (DECL_UNINLINABLE (t));
1134 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
1135 hstate.add_flag (DECL_IS_NOVOPS (t));
1136 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
1137 hstate.add_flag (DECL_IS_MALLOC (t));
1138 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
1139 hstate.add_flag (DECL_STATIC_CHAIN (t));
1140 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
1141 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
1142 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
1143 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
1144 hstate.add_flag (DECL_PURE_P (t));
1145 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
1146 hstate.commit_flag ();
1147 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
1148 hstate.add_int (DECL_UNCHECKED_FUNCTION_CODE (t));
1151 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1153 hstate.add_hwi (TYPE_MODE (t));
1154 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
1155 no streaming. */
1156 hstate.add_flag (TYPE_PACKED (t));
1157 hstate.add_flag (TYPE_RESTRICT (t));
1158 hstate.add_flag (TYPE_USER_ALIGN (t));
1159 hstate.add_flag (TYPE_READONLY (t));
1160 if (RECORD_OR_UNION_TYPE_P (t))
1162 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
1163 hstate.add_flag (TYPE_FINAL_P (t));
1164 hstate.add_flag (TYPE_CXX_ODR_P (t));
1166 else if (code == ARRAY_TYPE)
1167 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
1168 if (code == ARRAY_TYPE || code == INTEGER_TYPE)
1169 hstate.add_flag (TYPE_STRING_FLAG (t));
1170 if (AGGREGATE_TYPE_P (t))
1171 hstate.add_flag (TYPE_TYPELESS_STORAGE (t));
1172 hstate.commit_flag ();
1173 hstate.add_int (TYPE_PRECISION (t));
1174 hstate.add_int (TYPE_ALIGN (t));
1175 hstate.add_int (TYPE_EMPTY_P (t));
1178 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
1179 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
1180 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
1182 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
1183 /* We don't stream these when passing things to a different target. */
1184 && !lto_stream_offload_p)
1185 hstate.add_hwi (cl_target_option_hash (TREE_TARGET_OPTION (t)));
1187 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
1188 hstate.add_hwi (cl_optimization_hash (TREE_OPTIMIZATION (t)));
1190 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
1191 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
1193 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
1194 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
1196 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
1198 if (code != IDENTIFIER_NODE)
1199 visit (TREE_TYPE (t));
1202 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1204 unsigned int count = vector_cst_encoded_nelts (t);
1205 for (unsigned int i = 0; i < count; ++i)
1206 visit (VECTOR_CST_ENCODED_ELT (t, i));
1209 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
1210 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
1211 visit (POLY_INT_CST_COEFF (t, i));
1213 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1215 visit (TREE_REALPART (t));
1216 visit (TREE_IMAGPART (t));
1219 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1221 /* Drop names that were created for anonymous entities. */
1222 if (DECL_NAME (t)
1223 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
1224 && IDENTIFIER_ANON_P (DECL_NAME (t)))
1226 else
1227 visit (DECL_NAME (t));
1228 if (DECL_FILE_SCOPE_P (t))
1230 else
1231 visit (DECL_CONTEXT (t));
1234 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1236 visit (DECL_SIZE (t));
1237 visit (DECL_SIZE_UNIT (t));
1238 visit (DECL_ATTRIBUTES (t));
1239 if ((code == VAR_DECL
1240 || code == PARM_DECL)
1241 && DECL_HAS_VALUE_EXPR_P (t))
1242 visit (DECL_VALUE_EXPR (t));
1243 if (code == VAR_DECL
1244 && DECL_HAS_DEBUG_EXPR_P (t))
1245 visit (DECL_DEBUG_EXPR (t));
1246 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1247 be able to call get_symbol_initial_value. */
1250 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1252 if (DECL_ASSEMBLER_NAME_SET_P (t))
1253 visit (DECL_ASSEMBLER_NAME (t));
1256 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1258 visit (DECL_FIELD_OFFSET (t));
1259 visit (DECL_BIT_FIELD_TYPE (t));
1260 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
1261 visit (DECL_FIELD_BIT_OFFSET (t));
1264 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1266 visit (DECL_FUNCTION_PERSONALITY (t));
1267 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
1268 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
1271 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1273 visit (TYPE_SIZE (t));
1274 visit (TYPE_SIZE_UNIT (t));
1275 visit (TYPE_ATTRIBUTES (t));
1276 visit (TYPE_NAME (t));
1277 visit (TYPE_MAIN_VARIANT (t));
1278 if (TYPE_FILE_SCOPE_P (t))
1280 else
1281 visit (TYPE_CONTEXT (t));
1284 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1286 if (code == ENUMERAL_TYPE)
1287 visit (TYPE_VALUES (t));
1288 else if (code == ARRAY_TYPE)
1289 visit (TYPE_DOMAIN (t));
1290 else if (RECORD_OR_UNION_TYPE_P (t))
1291 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1292 visit (f);
1293 else if (code == FUNCTION_TYPE
1294 || code == METHOD_TYPE)
1295 visit (TYPE_ARG_TYPES (t));
1296 if (!POINTER_TYPE_P (t))
1297 visit (TYPE_MIN_VALUE_RAW (t));
1298 visit (TYPE_MAX_VALUE_RAW (t));
1301 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1303 visit (TREE_PURPOSE (t));
1304 visit (TREE_VALUE (t));
1305 visit (TREE_CHAIN (t));
1308 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1309 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1310 visit (TREE_VEC_ELT (t, i));
1312 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1314 hstate.add_hwi (TREE_OPERAND_LENGTH (t));
1315 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1316 visit (TREE_OPERAND (t, i));
1319 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1321 unsigned i;
1322 tree b;
1323 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1324 visit (b);
1325 visit (BINFO_OFFSET (t));
1326 visit (BINFO_VTABLE (t));
1327 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1328 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1329 by C++ FE only. */
1332 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1334 unsigned i;
1335 tree index, value;
1336 hstate.add_hwi (CONSTRUCTOR_NELTS (t));
1337 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1339 visit (index);
1340 visit (value);
1344 if (code == OMP_CLAUSE)
1346 int i;
1347 HOST_WIDE_INT val;
1349 hstate.add_hwi (OMP_CLAUSE_CODE (t));
1350 switch (OMP_CLAUSE_CODE (t))
1352 case OMP_CLAUSE_DEFAULT:
1353 val = OMP_CLAUSE_DEFAULT_KIND (t);
1354 break;
1355 case OMP_CLAUSE_SCHEDULE:
1356 val = OMP_CLAUSE_SCHEDULE_KIND (t);
1357 break;
1358 case OMP_CLAUSE_DEPEND:
1359 val = OMP_CLAUSE_DEPEND_KIND (t);
1360 break;
1361 case OMP_CLAUSE_MAP:
1362 val = OMP_CLAUSE_MAP_KIND (t);
1363 break;
1364 case OMP_CLAUSE_PROC_BIND:
1365 val = OMP_CLAUSE_PROC_BIND_KIND (t);
1366 break;
1367 case OMP_CLAUSE_REDUCTION:
1368 case OMP_CLAUSE_TASK_REDUCTION:
1369 case OMP_CLAUSE_IN_REDUCTION:
1370 val = OMP_CLAUSE_REDUCTION_CODE (t);
1371 break;
1372 default:
1373 val = 0;
1374 break;
1376 hstate.add_hwi (val);
1377 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1378 visit (OMP_CLAUSE_OPERAND (t, i));
1379 visit (OMP_CLAUSE_CHAIN (t));
1382 return hstate.end ();
1384 #undef visit
1387 /* Compare two SCC entries by their hash value for qsorting them. */
1390 DFS::scc_entry_compare (const void *p1_, const void *p2_)
1392 const scc_entry *p1 = (const scc_entry *) p1_;
1393 const scc_entry *p2 = (const scc_entry *) p2_;
1394 if (p1->hash < p2->hash)
1395 return -1;
1396 else if (p1->hash > p2->hash)
1397 return 1;
1398 return 0;
1401 /* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.
1402 THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST. */
1404 hashval_t
1405 DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size,
1406 bool ref_p, bool this_ref_p)
1408 unsigned int last_classes = 0, iterations = 0;
1410 /* Compute hash values for the SCC members. */
1411 for (unsigned i = 0; i < size; ++i)
1412 sccstack[first+i].hash
1413 = hash_tree (ob->writer_cache, NULL, sccstack[first+i].t);
1415 if (size == 1)
1416 return sccstack[first].hash;
1418 /* We aim to get unique hash for every tree within SCC and compute hash value
1419 of the whole SCC by combining all values together in a stable (entry-point
1420 independent) order. This guarantees that the same SCC regions within
1421 different translation units will get the same hash values and therefore
1422 will be merged at WPA time.
1424 Often the hashes are already unique. In that case we compute the SCC hash
1425 by combining individual hash values in an increasing order.
1427 If there are duplicates, we seek at least one tree with unique hash (and
1428 pick one with minimal hash and this property). Then we obtain a stable
1429 order by DFS walk starting from this unique tree and then use the index
1430 within this order to make individual hash values unique.
1432 If there is no tree with unique hash, we iteratively propagate the hash
1433 values across the internal edges of SCC. This usually quickly leads
1434 to unique hashes. Consider, for example, an SCC containing two pointers
1435 that are identical except for the types they point to and assume that
1436 these types are also part of the SCC. The propagation will add the
1437 points-to type information into their hash values. */
1440 /* Sort the SCC so we can easily check for uniqueness. */
1441 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1443 unsigned int classes = 1;
1444 int firstunique = -1;
1446 /* Find the tree with lowest unique hash (if it exists) and compute
1447 the number of equivalence classes. */
1448 if (sccstack[first].hash != sccstack[first+1].hash)
1449 firstunique = 0;
1450 for (unsigned i = 1; i < size; ++i)
1451 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
1453 classes++;
1454 if (firstunique == -1
1455 && (i == size - 1
1456 || sccstack[first+i+1].hash != sccstack[first+i].hash))
1457 firstunique = i;
1460 /* If we found a tree with unique hash, stop the iteration. */
1461 if (firstunique != -1
1462 /* Also terminate if we run out of iterations or if the number of
1463 equivalence classes is no longer increasing.
1464 For example a cyclic list of trees that are all equivalent will
1465 never have unique entry point; we however do not build such SCCs
1466 in our IL. */
1467 || classes <= last_classes || iterations > 16)
1469 hashval_t scc_hash;
1471 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1472 starting from FIRSTUNIQUE to obtain a stable order. */
1473 if (classes != size && firstunique != -1)
1475 hash_map <tree, hashval_t> map(size*2);
1477 /* Store hash values into a map, so we can associate them with
1478 the reordered SCC. */
1479 for (unsigned i = 0; i < size; ++i)
1480 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1482 DFS again (ob, sccstack[first+firstunique].t, ref_p, this_ref_p,
1483 true);
1484 gcc_assert (again.sccstack.length () == size);
1486 memcpy (sccstack.address () + first,
1487 again.sccstack.address (),
1488 sizeof (scc_entry) * size);
1490 /* Update hash values of individual members by hashing in the
1491 index within the stable order. This ensures uniqueness.
1492 Also compute the SCC hash by mixing in all hash values in
1493 the stable order we obtained. */
1494 sccstack[first].hash = *map.get (sccstack[first].t);
1495 scc_hash = sccstack[first].hash;
1496 for (unsigned i = 1; i < size; ++i)
1498 sccstack[first+i].hash
1499 = iterative_hash_hashval_t (i,
1500 *map.get (sccstack[first+i].t));
1501 scc_hash
1502 = iterative_hash_hashval_t (scc_hash,
1503 sccstack[first+i].hash);
1506 /* If we got a unique hash value for each tree, then sort already
1507 ensured entry-point independent order. Only compute the final
1508 SCC hash.
1510 If we failed to find the unique entry point, we go by the same
1511 route. We will eventually introduce unwanted hash conflicts. */
1512 else
1514 scc_hash = sccstack[first].hash;
1515 for (unsigned i = 1; i < size; ++i)
1516 scc_hash
1517 = iterative_hash_hashval_t (scc_hash, sccstack[first+i].hash);
1519 /* We cannot 100% guarantee that the hash won't conflict so as
1520 to make it impossible to find a unique hash. This however
1521 should be an extremely rare case. ICE for now so possible
1522 issues are found and evaluated. */
1523 gcc_checking_assert (classes == size);
1526 /* To avoid conflicts across SCCs, iteratively hash the whole SCC
1527 hash into the hash of each element. */
1528 for (unsigned i = 0; i < size; ++i)
1529 sccstack[first+i].hash
1530 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1531 return scc_hash;
1534 last_classes = classes;
1535 iterations++;
1537 /* We failed to identify the entry point; propagate hash values across
1538 the edges. */
1539 hash_map <tree, hashval_t> map(size*2);
1541 for (unsigned i = 0; i < size; ++i)
1542 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1544 for (unsigned i = 0; i < size; i++)
1545 sccstack[first+i].hash
1546 = hash_tree (ob->writer_cache, &map, sccstack[first+i].t);
1548 while (true);
1551 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1552 already in the streamer cache. Main routine called for
1553 each visit of EXPR. */
1555 void
1556 DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
1557 tree expr, bool ref_p, bool this_ref_p)
1559 /* Handle special cases. */
1560 if (expr == NULL_TREE)
1561 return;
1563 /* Do not DFS walk into indexable trees. */
1564 if (this_ref_p && tree_is_indexable (expr))
1565 return;
1567 /* Check if we already streamed EXPR. */
1568 if (streamer_tree_cache_lookup (ob->writer_cache, expr, NULL))
1569 return;
1571 worklist w;
1572 w.expr = expr;
1573 w.from_state = from_state;
1574 w.cstate = NULL;
1575 w.ref_p = ref_p;
1576 w.this_ref_p = this_ref_p;
1577 worklist_vec.safe_push (w);
1581 /* Emit the physical representation of tree node EXPR to output block OB.
1582 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
1583 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1585 void
1586 lto_output_tree (struct output_block *ob, tree expr,
1587 bool ref_p, bool this_ref_p)
1589 unsigned ix;
1590 bool existed_p;
1592 if (expr == NULL_TREE)
1594 streamer_write_record_start (ob, LTO_null);
1595 return;
1598 if (this_ref_p && tree_is_indexable (expr))
1600 lto_output_tree_ref (ob, expr);
1601 return;
1604 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1605 if (existed_p)
1607 /* If a node has already been streamed out, make sure that
1608 we don't write it more than once. Otherwise, the reader
1609 will instantiate two different nodes for the same object. */
1610 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1611 streamer_write_uhwi (ob, ix);
1612 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1613 lto_tree_code_to_tag (TREE_CODE (expr)));
1614 lto_stats.num_pickle_refs_output++;
1616 else
1618 /* This is the first time we see EXPR, write all reachable
1619 trees to OB. */
1620 static bool in_dfs_walk;
1622 /* Protect against recursion which means disconnect between
1623 what tree edges we walk in the DFS walk and what edges
1624 we stream out. */
1625 gcc_assert (!in_dfs_walk);
1627 if (streamer_dump_file)
1629 print_node_brief (streamer_dump_file, " Streaming SCC of ",
1630 expr, 4);
1631 fprintf (streamer_dump_file, "\n");
1634 /* Start the DFS walk. */
1635 /* Save ob state ... */
1636 /* let's see ... */
1637 in_dfs_walk = true;
1638 DFS (ob, expr, ref_p, this_ref_p, false);
1639 in_dfs_walk = false;
1641 /* Finally append a reference to the tree we were writing.
1642 ??? If expr ended up as a singleton we could have
1643 inlined it here and avoid outputting a reference. */
1644 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1645 gcc_assert (existed_p);
1646 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1647 streamer_write_uhwi (ob, ix);
1648 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1649 lto_tree_code_to_tag (TREE_CODE (expr)));
1650 if (streamer_dump_file)
1652 print_node_brief (streamer_dump_file, " Finished SCC of ",
1653 expr, 4);
1654 fprintf (streamer_dump_file, "\n\n");
1656 lto_stats.num_pickle_refs_output++;
1661 /* Output to OB a list of try/catch handlers starting with FIRST. */
1663 static void
1664 output_eh_try_list (struct output_block *ob, eh_catch first)
1666 eh_catch n;
1668 for (n = first; n; n = n->next_catch)
1670 streamer_write_record_start (ob, LTO_eh_catch);
1671 stream_write_tree (ob, n->type_list, true);
1672 stream_write_tree (ob, n->filter_list, true);
1673 stream_write_tree (ob, n->label, true);
1676 streamer_write_record_start (ob, LTO_null);
1680 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1681 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1682 detect EH region sharing. */
1684 static void
1685 output_eh_region (struct output_block *ob, eh_region r)
1687 enum LTO_tags tag;
1689 if (r == NULL)
1691 streamer_write_record_start (ob, LTO_null);
1692 return;
1695 if (r->type == ERT_CLEANUP)
1696 tag = LTO_ert_cleanup;
1697 else if (r->type == ERT_TRY)
1698 tag = LTO_ert_try;
1699 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1700 tag = LTO_ert_allowed_exceptions;
1701 else if (r->type == ERT_MUST_NOT_THROW)
1702 tag = LTO_ert_must_not_throw;
1703 else
1704 gcc_unreachable ();
1706 streamer_write_record_start (ob, tag);
1707 streamer_write_hwi (ob, r->index);
1709 if (r->outer)
1710 streamer_write_hwi (ob, r->outer->index);
1711 else
1712 streamer_write_zero (ob);
1714 if (r->inner)
1715 streamer_write_hwi (ob, r->inner->index);
1716 else
1717 streamer_write_zero (ob);
1719 if (r->next_peer)
1720 streamer_write_hwi (ob, r->next_peer->index);
1721 else
1722 streamer_write_zero (ob);
1724 if (r->type == ERT_TRY)
1726 output_eh_try_list (ob, r->u.eh_try.first_catch);
1728 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1730 stream_write_tree (ob, r->u.allowed.type_list, true);
1731 stream_write_tree (ob, r->u.allowed.label, true);
1732 streamer_write_uhwi (ob, r->u.allowed.filter);
1734 else if (r->type == ERT_MUST_NOT_THROW)
1736 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1737 bitpack_d bp = bitpack_create (ob->main_stream);
1738 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1739 streamer_write_bitpack (&bp);
1742 if (r->landing_pads)
1743 streamer_write_hwi (ob, r->landing_pads->index);
1744 else
1745 streamer_write_zero (ob);
1749 /* Output landing pad LP to OB. */
1751 static void
1752 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1754 if (lp == NULL)
1756 streamer_write_record_start (ob, LTO_null);
1757 return;
1760 streamer_write_record_start (ob, LTO_eh_landing_pad);
1761 streamer_write_hwi (ob, lp->index);
1762 if (lp->next_lp)
1763 streamer_write_hwi (ob, lp->next_lp->index);
1764 else
1765 streamer_write_zero (ob);
1767 if (lp->region)
1768 streamer_write_hwi (ob, lp->region->index);
1769 else
1770 streamer_write_zero (ob);
1772 stream_write_tree (ob, lp->post_landing_pad, true);
1776 /* Output the existing eh_table to OB. */
1778 static void
1779 output_eh_regions (struct output_block *ob, struct function *fn)
1781 if (fn->eh && fn->eh->region_tree)
1783 unsigned i;
1784 eh_region eh;
1785 eh_landing_pad lp;
1786 tree ttype;
1788 streamer_write_record_start (ob, LTO_eh_table);
1790 /* Emit the index of the root of the EH region tree. */
1791 streamer_write_hwi (ob, fn->eh->region_tree->index);
1793 /* Emit all the EH regions in the region array. */
1794 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1795 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1796 output_eh_region (ob, eh);
1798 /* Emit all landing pads. */
1799 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1800 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1801 output_eh_lp (ob, lp);
1803 /* Emit all the runtime type data. */
1804 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1805 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1806 stream_write_tree (ob, ttype, true);
1808 /* Emit the table of action chains. */
1809 if (targetm.arm_eabi_unwinder)
1811 tree t;
1812 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1813 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1814 stream_write_tree (ob, t, true);
1816 else
1818 uchar c;
1819 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1820 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1821 streamer_write_char_stream (ob->main_stream, c);
1825 /* The LTO_null either terminates the record or indicates that there
1826 are no eh_records at all. */
1827 streamer_write_record_start (ob, LTO_null);
1831 /* Output all of the active ssa names to the ssa_names stream. */
1833 static void
1834 output_ssa_names (struct output_block *ob, struct function *fn)
1836 unsigned int i, len;
1838 len = vec_safe_length (SSANAMES (fn));
1839 streamer_write_uhwi (ob, len);
1841 for (i = 1; i < len; i++)
1843 tree ptr = (*SSANAMES (fn))[i];
1845 if (ptr == NULL_TREE
1846 || SSA_NAME_IN_FREE_LIST (ptr)
1847 || virtual_operand_p (ptr)
1848 /* Simply skip unreleased SSA names. */
1849 || (! SSA_NAME_IS_DEFAULT_DEF (ptr)
1850 && (! SSA_NAME_DEF_STMT (ptr)
1851 || ! gimple_bb (SSA_NAME_DEF_STMT (ptr)))))
1852 continue;
1854 streamer_write_uhwi (ob, i);
1855 streamer_write_char_stream (ob->main_stream,
1856 SSA_NAME_IS_DEFAULT_DEF (ptr));
1857 if (SSA_NAME_VAR (ptr))
1858 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1859 else
1860 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1861 stream_write_tree (ob, TREE_TYPE (ptr), true);
1864 streamer_write_zero (ob);
1869 /* Output the cfg. */
1871 static void
1872 output_cfg (struct output_block *ob, struct function *fn)
1874 struct lto_output_stream *tmp_stream = ob->main_stream;
1875 basic_block bb;
1877 ob->main_stream = ob->cfg_stream;
1879 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1880 profile_status_for_fn (fn));
1882 /* Output the number of the highest basic block. */
1883 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1885 FOR_ALL_BB_FN (bb, fn)
1887 edge_iterator ei;
1888 edge e;
1890 streamer_write_hwi (ob, bb->index);
1892 /* Output the successors and the edge flags. */
1893 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1894 FOR_EACH_EDGE (e, ei, bb->succs)
1896 streamer_write_uhwi (ob, e->dest->index);
1897 e->probability.stream_out (ob);
1898 streamer_write_uhwi (ob, e->flags);
1902 streamer_write_hwi (ob, -1);
1904 bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
1905 while (bb->next_bb)
1907 streamer_write_hwi (ob, bb->next_bb->index);
1908 bb = bb->next_bb;
1911 streamer_write_hwi (ob, -1);
1913 /* Output the number of loops. */
1914 streamer_write_uhwi (ob, number_of_loops (fn));
1916 /* Output each loop, skipping the tree root which has number zero. */
1917 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1919 class loop *loop = get_loop (fn, i);
1921 /* Write the index of the loop header. That's enough to rebuild
1922 the loop tree on the reader side. Stream -1 for an unused
1923 loop entry. */
1924 if (!loop)
1926 streamer_write_hwi (ob, -1);
1927 continue;
1929 else
1930 streamer_write_hwi (ob, loop->header->index);
1932 /* Write everything copy_loop_info copies. */
1933 streamer_write_enum (ob->main_stream,
1934 loop_estimation, EST_LAST, loop->estimate_state);
1935 streamer_write_hwi (ob, loop->any_upper_bound);
1936 if (loop->any_upper_bound)
1937 streamer_write_widest_int (ob, loop->nb_iterations_upper_bound);
1938 streamer_write_hwi (ob, loop->any_likely_upper_bound);
1939 if (loop->any_likely_upper_bound)
1940 streamer_write_widest_int (ob, loop->nb_iterations_likely_upper_bound);
1941 streamer_write_hwi (ob, loop->any_estimate);
1942 if (loop->any_estimate)
1943 streamer_write_widest_int (ob, loop->nb_iterations_estimate);
1945 /* Write OMP SIMD related info. */
1946 streamer_write_hwi (ob, loop->safelen);
1947 streamer_write_hwi (ob, loop->unroll);
1948 streamer_write_hwi (ob, loop->owned_clique);
1949 streamer_write_hwi (ob, loop->dont_vectorize);
1950 streamer_write_hwi (ob, loop->force_vectorize);
1951 stream_write_tree (ob, loop->simduid, true);
1954 ob->main_stream = tmp_stream;
1958 /* Create the header in the file using OB. If the section type is for
1959 a function, set FN to the decl for that function. */
1961 void
1962 produce_asm (struct output_block *ob, tree fn)
1964 enum lto_section_type section_type = ob->section_type;
1965 struct lto_function_header header;
1966 char *section_name;
1968 if (section_type == LTO_section_function_body)
1970 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1971 section_name = lto_get_section_name (section_type, name,
1972 symtab_node::get (fn)->order,
1973 NULL);
1975 else
1976 section_name = lto_get_section_name (section_type, NULL, 0, NULL);
1978 lto_begin_section (section_name, !flag_wpa);
1979 free (section_name);
1981 /* The entire header is stream computed here. */
1982 memset (&header, 0, sizeof (struct lto_function_header));
1984 if (section_type == LTO_section_function_body)
1985 header.cfg_size = ob->cfg_stream->total_size;
1986 header.main_size = ob->main_stream->total_size;
1987 header.string_size = ob->string_stream->total_size;
1988 lto_write_data (&header, sizeof header);
1990 /* Put all of the gimple and the string table out the asm file as a
1991 block of text. */
1992 if (section_type == LTO_section_function_body)
1993 lto_write_stream (ob->cfg_stream);
1994 lto_write_stream (ob->main_stream);
1995 lto_write_stream (ob->string_stream);
1997 lto_end_section ();
2001 /* Output the base body of struct function FN using output block OB. */
2003 static void
2004 output_struct_function_base (struct output_block *ob, struct function *fn)
2006 struct bitpack_d bp;
2007 unsigned i;
2008 tree t;
2010 /* Output the static chain and non-local goto save area. */
2011 stream_write_tree (ob, fn->static_chain_decl, true);
2012 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
2014 /* Output all the local variables in the function. */
2015 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
2016 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
2017 stream_write_tree (ob, t, true);
2019 /* Output current IL state of the function. */
2020 streamer_write_uhwi (ob, fn->curr_properties);
2022 /* Write all the attributes for FN. */
2023 bp = bitpack_create (ob->main_stream);
2024 bp_pack_value (&bp, fn->is_thunk, 1);
2025 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
2026 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
2027 bp_pack_value (&bp, fn->returns_struct, 1);
2028 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
2029 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
2030 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
2031 bp_pack_value (&bp, fn->after_inlining, 1);
2032 bp_pack_value (&bp, fn->stdarg, 1);
2033 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
2034 bp_pack_value (&bp, fn->has_forced_label_in_static, 1);
2035 bp_pack_value (&bp, fn->calls_alloca, 1);
2036 bp_pack_value (&bp, fn->calls_setjmp, 1);
2037 bp_pack_value (&bp, fn->calls_eh_return, 1);
2038 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
2039 bp_pack_value (&bp, fn->has_simduid_loops, 1);
2040 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
2041 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
2042 bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8);
2044 /* Output the function start and end loci. */
2045 stream_output_location (ob, &bp, fn->function_start_locus);
2046 stream_output_location (ob, &bp, fn->function_end_locus);
2048 /* Save the instance discriminator if present. */
2049 int *instance_number_p = NULL;
2050 if (decl_to_instance_map)
2051 instance_number_p = decl_to_instance_map->get (fn->decl);
2052 bp_pack_value (&bp, !!instance_number_p, 1);
2053 if (instance_number_p)
2054 bp_pack_value (&bp, *instance_number_p, sizeof (int) * CHAR_BIT);
2056 streamer_write_bitpack (&bp);
2060 /* Collect all leaf BLOCKs beyond ROOT into LEAFS. */
2062 static void
2063 collect_block_tree_leafs (tree root, vec<tree> &leafs)
2065 for (root = BLOCK_SUBBLOCKS (root); root; root = BLOCK_CHAIN (root))
2066 if (! BLOCK_SUBBLOCKS (root))
2067 leafs.safe_push (root);
2068 else
2069 collect_block_tree_leafs (BLOCK_SUBBLOCKS (root), leafs);
2072 /* This performs function body modifications that are needed for streaming
2073 to work. */
2075 void
2076 lto_prepare_function_for_streaming (struct cgraph_node *node)
2078 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
2079 basic_block bb;
2081 if (number_of_loops (fn))
2083 push_cfun (fn);
2084 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
2085 loop_optimizer_finalize ();
2086 pop_cfun ();
2088 /* We will renumber the statements. The code that does this uses
2089 the same ordering that we use for serializing them so we can use
2090 the same code on the other end and not have to write out the
2091 statement numbers. We do not assign UIDs to PHIs here because
2092 virtual PHIs get re-computed on-the-fly which would make numbers
2093 inconsistent. */
2094 set_gimple_stmt_max_uid (fn, 0);
2095 FOR_ALL_BB_FN (bb, fn)
2097 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2098 gsi_next (&gsi))
2100 gphi *stmt = gsi.phi ();
2102 /* Virtual PHIs are not going to be streamed. */
2103 if (!virtual_operand_p (gimple_phi_result (stmt)))
2104 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2106 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
2107 gsi_next (&gsi))
2109 gimple *stmt = gsi_stmt (gsi);
2110 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2113 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2114 virtual phis now. */
2115 FOR_ALL_BB_FN (bb, fn)
2117 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2118 gsi_next (&gsi))
2120 gphi *stmt = gsi.phi ();
2121 if (virtual_operand_p (gimple_phi_result (stmt)))
2122 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2128 /* Output the body of function NODE->DECL. */
2130 static void
2131 output_function (struct cgraph_node *node)
2133 tree function;
2134 struct function *fn;
2135 basic_block bb;
2136 struct output_block *ob;
2138 if (streamer_dump_file)
2139 fprintf (streamer_dump_file, "\nStreaming body of %s\n",
2140 node->dump_name ());
2142 function = node->decl;
2143 fn = DECL_STRUCT_FUNCTION (function);
2144 ob = create_output_block (LTO_section_function_body);
2146 clear_line_info (ob);
2147 ob->symbol = node;
2149 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
2151 /* Make string 0 be a NULL string. */
2152 streamer_write_char_stream (ob->string_stream, 0);
2154 streamer_write_record_start (ob, LTO_function);
2156 /* Output decls for parameters and args. */
2157 stream_write_tree (ob, DECL_RESULT (function), true);
2158 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
2160 /* Output debug args if available. */
2161 vec<tree, va_gc> **debugargs = decl_debug_args_lookup (function);
2162 if (! debugargs)
2163 streamer_write_uhwi (ob, 0);
2164 else
2166 streamer_write_uhwi (ob, (*debugargs)->length ());
2167 for (unsigned i = 0; i < (*debugargs)->length (); ++i)
2168 stream_write_tree (ob, (**debugargs)[i], true);
2171 /* Output DECL_INITIAL for the function, which contains the tree of
2172 lexical scopes. */
2173 stream_write_tree (ob, DECL_INITIAL (function), true);
2174 /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT
2175 collect block tree leafs and stream those. */
2176 auto_vec<tree> block_tree_leafs;
2177 if (DECL_INITIAL (function))
2178 collect_block_tree_leafs (DECL_INITIAL (function), block_tree_leafs);
2179 streamer_write_uhwi (ob, block_tree_leafs.length ());
2180 for (unsigned i = 0; i < block_tree_leafs.length (); ++i)
2181 stream_write_tree (ob, block_tree_leafs[i], true);
2183 /* We also stream abstract functions where we stream only stuff needed for
2184 debug info. */
2185 if (gimple_has_body_p (function))
2187 streamer_write_uhwi (ob, 1);
2188 output_struct_function_base (ob, fn);
2190 /* Output all the SSA names used in the function. */
2191 output_ssa_names (ob, fn);
2193 /* Output any exception handling regions. */
2194 output_eh_regions (ob, fn);
2196 /* Output the code for the function. */
2197 FOR_ALL_BB_FN (bb, fn)
2198 output_bb (ob, bb, fn);
2200 /* The terminator for this function. */
2201 streamer_write_record_start (ob, LTO_null);
2203 output_cfg (ob, fn);
2205 else
2206 streamer_write_uhwi (ob, 0);
2208 /* Create a section to hold the pickled output of this function. */
2209 produce_asm (ob, function);
2211 destroy_output_block (ob);
2212 if (streamer_dump_file)
2213 fprintf (streamer_dump_file, "Finished streaming %s\n",
2214 node->dump_name ());
2217 /* Output the body of function NODE->DECL. */
2219 static void
2220 output_constructor (struct varpool_node *node)
2222 tree var = node->decl;
2223 struct output_block *ob;
2225 if (streamer_dump_file)
2226 fprintf (streamer_dump_file, "\nStreaming constructor of %s\n",
2227 node->dump_name ());
2229 timevar_push (TV_IPA_LTO_CTORS_OUT);
2230 ob = create_output_block (LTO_section_function_body);
2232 clear_line_info (ob);
2233 ob->symbol = node;
2235 /* Make string 0 be a NULL string. */
2236 streamer_write_char_stream (ob->string_stream, 0);
2238 /* Output DECL_INITIAL for the function, which contains the tree of
2239 lexical scopes. */
2240 stream_write_tree (ob, DECL_INITIAL (var), true);
2242 /* Create a section to hold the pickled output of this function. */
2243 produce_asm (ob, var);
2245 destroy_output_block (ob);
2246 if (streamer_dump_file)
2247 fprintf (streamer_dump_file, "Finished streaming %s\n",
2248 node->dump_name ());
2249 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2253 /* Emit toplevel asms. */
2255 void
2256 lto_output_toplevel_asms (void)
2258 struct output_block *ob;
2259 struct asm_node *can;
2260 char *section_name;
2261 struct lto_simple_header_with_strings header;
2263 if (!symtab->first_asm_symbol ())
2264 return;
2266 ob = create_output_block (LTO_section_asm);
2268 /* Make string 0 be a NULL string. */
2269 streamer_write_char_stream (ob->string_stream, 0);
2271 for (can = symtab->first_asm_symbol (); can; can = can->next)
2273 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
2274 streamer_write_hwi (ob, can->order);
2277 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
2279 section_name = lto_get_section_name (LTO_section_asm, NULL, 0, NULL);
2280 lto_begin_section (section_name, !flag_wpa);
2281 free (section_name);
2283 /* The entire header stream is computed here. */
2284 memset (&header, 0, sizeof (header));
2286 header.main_size = ob->main_stream->total_size;
2287 header.string_size = ob->string_stream->total_size;
2288 lto_write_data (&header, sizeof header);
2290 /* Put all of the gimple and the string table out the asm file as a
2291 block of text. */
2292 lto_write_stream (ob->main_stream);
2293 lto_write_stream (ob->string_stream);
2295 lto_end_section ();
2297 destroy_output_block (ob);
2301 /* Copy the function body or variable constructor of NODE without deserializing. */
2303 static void
2304 copy_function_or_variable (struct symtab_node *node)
2306 tree function = node->decl;
2307 struct lto_file_decl_data *file_data = node->lto_file_data;
2308 const char *data;
2309 size_t len;
2310 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2311 char *section_name =
2312 lto_get_section_name (LTO_section_function_body, name, node->order, NULL);
2313 size_t i, j;
2314 struct lto_in_decl_state *in_state;
2315 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2317 if (streamer_dump_file)
2318 fprintf (streamer_dump_file, "Copying section for %s\n", name);
2319 lto_begin_section (section_name, false);
2320 free (section_name);
2322 /* We may have renamed the declaration, e.g., a static function. */
2323 name = lto_get_decl_name_mapping (file_data, name);
2325 data = lto_get_raw_section_data (file_data, LTO_section_function_body,
2326 name, node->order - file_data->order_base,
2327 &len);
2328 gcc_assert (data);
2330 /* Do a bit copy of the function body. */
2331 lto_write_raw_data (data, len);
2333 /* Copy decls. */
2334 in_state =
2335 lto_get_function_in_decl_state (node->lto_file_data, function);
2336 out_state->compressed = in_state->compressed;
2337 gcc_assert (in_state);
2339 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2341 size_t n = vec_safe_length (in_state->streams[i]);
2342 vec<tree, va_gc> *trees = in_state->streams[i];
2343 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2345 /* The out state must have the same indices and the in state.
2346 So just copy the vector. All the encoders in the in state
2347 must be empty where we reach here. */
2348 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2349 encoder->trees.reserve_exact (n);
2350 for (j = 0; j < n; j++)
2351 encoder->trees.safe_push ((*trees)[j]);
2354 lto_free_raw_section_data (file_data, LTO_section_function_body, name,
2355 data, len);
2356 lto_end_section ();
2359 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2361 static tree
2362 wrap_refs (tree *tp, int *ws, void *)
2364 tree t = *tp;
2365 if (handled_component_p (t)
2366 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL
2367 && TREE_PUBLIC (TREE_OPERAND (t, 0)))
2369 tree decl = TREE_OPERAND (t, 0);
2370 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2371 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2372 build1 (ADDR_EXPR, ptrtype, decl),
2373 build_int_cst (ptrtype, 0));
2374 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2375 *ws = 0;
2377 else if (TREE_CODE (t) == CONSTRUCTOR)
2379 else if (!EXPR_P (t))
2380 *ws = 0;
2381 return NULL_TREE;
2384 /* Remove functions that are no longer used from offload_funcs, and mark the
2385 remaining ones with DECL_PRESERVE_P. */
2387 static void
2388 prune_offload_funcs (void)
2390 if (!offload_funcs)
2391 return;
2393 unsigned ix, ix2;
2394 tree *elem_ptr;
2395 VEC_ORDERED_REMOVE_IF (*offload_funcs, ix, ix2, elem_ptr,
2396 cgraph_node::get (*elem_ptr) == NULL);
2398 tree fn_decl;
2399 FOR_EACH_VEC_ELT (*offload_funcs, ix, fn_decl)
2400 DECL_PRESERVE_P (fn_decl) = 1;
2403 /* Produce LTO section that contains global information
2404 about LTO bytecode. */
2406 static void
2407 produce_lto_section ()
2409 /* Stream LTO meta section. */
2410 output_block *ob = create_output_block (LTO_section_lto);
2412 char * section_name = lto_get_section_name (LTO_section_lto, NULL, 0, NULL);
2413 lto_begin_section (section_name, false);
2414 free (section_name);
2416 #ifdef HAVE_ZSTD_H
2417 lto_compression compression = ZSTD;
2418 #else
2419 lto_compression compression = ZLIB;
2420 #endif
2422 bool slim_object = flag_generate_lto && !flag_fat_lto_objects;
2423 lto_section s
2424 = { LTO_major_version, LTO_minor_version, slim_object, 0 };
2425 s.set_compression (compression);
2426 lto_write_data (&s, sizeof s);
2427 lto_end_section ();
2428 destroy_output_block (ob);
2431 /* Compare symbols to get them sorted by filename (to optimize streaming) */
2433 static int
2434 cmp_symbol_files (const void *pn1, const void *pn2)
2436 const symtab_node *n1 = *(const symtab_node * const *)pn1;
2437 const symtab_node *n2 = *(const symtab_node * const *)pn2;
2439 int file_order1 = n1->lto_file_data ? n1->lto_file_data->order : -1;
2440 int file_order2 = n2->lto_file_data ? n2->lto_file_data->order : -1;
2442 /* Order files same way as they appeared in the command line to reduce
2443 seeking while copying sections. */
2444 if (file_order1 != file_order2)
2445 return file_order1 - file_order2;
2447 /* Order within static library. */
2448 if (n1->lto_file_data && n1->lto_file_data->id != n2->lto_file_data->id)
2450 if (n1->lto_file_data->id > n2->lto_file_data->id)
2451 return 1;
2452 if (n1->lto_file_data->id < n2->lto_file_data->id)
2453 return -1;
2456 /* And finaly order by the definition order. */
2457 return n1->order - n2->order;
2460 /* Main entry point from the pass manager. */
2462 void
2463 lto_output (void)
2465 struct lto_out_decl_state *decl_state;
2466 bitmap output = NULL;
2467 bitmap_obstack output_obstack;
2468 unsigned int i, n_nodes;
2469 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2470 auto_vec<symtab_node *> symbols_to_copy;
2472 prune_offload_funcs ();
2474 if (flag_checking)
2476 bitmap_obstack_initialize (&output_obstack);
2477 output = BITMAP_ALLOC (&output_obstack);
2480 /* Initialize the streamer. */
2481 lto_streamer_init ();
2483 produce_lto_section ();
2485 n_nodes = lto_symtab_encoder_size (encoder);
2486 /* Prepare vector of functions to output and then sort it to optimize
2487 section copying. */
2488 for (i = 0; i < n_nodes; i++)
2490 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2491 if (snode->alias)
2492 continue;
2493 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2495 if (lto_symtab_encoder_encode_body_p (encoder, node))
2496 symbols_to_copy.safe_push (node);
2498 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2500 /* Wrap symbol references inside the ctor in a type
2501 preserving MEM_REF. */
2502 tree ctor = DECL_INITIAL (node->decl);
2503 if (ctor && !in_lto_p)
2504 walk_tree (&ctor, wrap_refs, NULL, NULL);
2505 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2506 && lto_symtab_encoder_encode_initializer_p (encoder, node))
2507 symbols_to_copy.safe_push (node);
2510 symbols_to_copy.qsort (cmp_symbol_files);
2511 for (i = 0; i < symbols_to_copy.length (); i++)
2513 symtab_node *snode = symbols_to_copy[i];
2514 cgraph_node *cnode;
2515 varpool_node *vnode;
2517 if (flag_checking)
2518 gcc_assert (bitmap_set_bit (output, DECL_UID (snode->decl)));
2520 decl_state = lto_new_out_decl_state ();
2521 lto_push_out_decl_state (decl_state);
2523 if ((cnode = dyn_cast <cgraph_node *> (snode))
2524 && (gimple_has_body_p (cnode->decl)
2525 || (!flag_wpa
2526 && flag_incremental_link != INCREMENTAL_LINK_LTO)
2527 /* Thunks have no body but they may be synthetized
2528 at WPA time. */
2529 || DECL_ARGUMENTS (cnode->decl)))
2530 output_function (cnode);
2531 else if ((vnode = dyn_cast <varpool_node *> (snode))
2532 && (DECL_INITIAL (vnode->decl) != error_mark_node
2533 || (!flag_wpa
2534 && flag_incremental_link != INCREMENTAL_LINK_LTO)))
2535 output_constructor (vnode);
2536 else
2537 copy_function_or_variable (snode);
2538 gcc_assert (lto_get_out_decl_state () == decl_state);
2539 lto_pop_out_decl_state ();
2540 lto_record_function_out_decl_state (snode->decl, decl_state);
2543 /* Emit the callgraph after emitting function bodies. This needs to
2544 be done now to make sure that all the statements in every function
2545 have been renumbered so that edges can be associated with call
2546 statements using the statement UIDs. */
2547 output_symtab ();
2549 output_offload_tables ();
2551 if (flag_checking)
2553 BITMAP_FREE (output);
2554 bitmap_obstack_release (&output_obstack);
2558 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2559 from it and required for correct representation of its semantics.
2560 Each node in ENCODER must be a global declaration or a type. A node
2561 is written only once, even if it appears multiple times in the
2562 vector. Certain transitively-reachable nodes, such as those
2563 representing expressions, may be duplicated, but such nodes
2564 must not appear in ENCODER itself. */
2566 static void
2567 write_global_stream (struct output_block *ob,
2568 struct lto_tree_ref_encoder *encoder)
2570 tree t;
2571 size_t index;
2572 const size_t size = lto_tree_ref_encoder_size (encoder);
2574 for (index = 0; index < size; index++)
2576 t = lto_tree_ref_encoder_get_tree (encoder, index);
2577 if (streamer_dump_file)
2579 fprintf (streamer_dump_file, " %i:", (int)index);
2580 print_node_brief (streamer_dump_file, "", t, 4);
2581 fprintf (streamer_dump_file, "\n");
2583 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2584 stream_write_tree (ob, t, false);
2589 /* Write a sequence of indices into the globals vector corresponding
2590 to the trees in ENCODER. These are used by the reader to map the
2591 indices used to refer to global entities within function bodies to
2592 their referents. */
2594 static void
2595 write_global_references (struct output_block *ob,
2596 struct lto_tree_ref_encoder *encoder)
2598 tree t;
2599 uint32_t index;
2600 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2602 /* Write size and slot indexes as 32-bit unsigned numbers. */
2603 uint32_t *data = XNEWVEC (uint32_t, size + 1);
2604 data[0] = size;
2606 for (index = 0; index < size; index++)
2608 unsigned slot_num;
2610 t = lto_tree_ref_encoder_get_tree (encoder, index);
2611 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2612 gcc_assert (slot_num != (unsigned)-1);
2613 data[index + 1] = slot_num;
2616 lto_write_data (data, sizeof (int32_t) * (size + 1));
2617 free (data);
2621 /* Write all the streams in an lto_out_decl_state STATE using
2622 output block OB and output stream OUT_STREAM. */
2624 void
2625 lto_output_decl_state_streams (struct output_block *ob,
2626 struct lto_out_decl_state *state)
2628 int i;
2630 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2631 write_global_stream (ob, &state->streams[i]);
2635 /* Write all the references in an lto_out_decl_state STATE using
2636 output block OB and output stream OUT_STREAM. */
2638 void
2639 lto_output_decl_state_refs (struct output_block *ob,
2640 struct lto_out_decl_state *state)
2642 unsigned i;
2643 unsigned ref;
2644 tree decl;
2646 /* Write reference to FUNCTION_DECL. If there is not function,
2647 write reference to void_type_node. */
2648 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2649 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2650 gcc_assert (ref != (unsigned)-1);
2651 ref = ref * 2 + (state->compressed ? 1 : 0);
2652 lto_write_data (&ref, sizeof (uint32_t));
2654 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2655 write_global_references (ob, &state->streams[i]);
2659 /* Return the written size of STATE. */
2661 static size_t
2662 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2664 int i;
2665 size_t size;
2667 size = sizeof (int32_t); /* fn_ref. */
2668 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2670 size += sizeof (int32_t); /* vector size. */
2671 size += (lto_tree_ref_encoder_size (&state->streams[i])
2672 * sizeof (int32_t));
2674 return size;
2678 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2679 so far. */
2681 static void
2682 write_symbol (struct streamer_tree_cache_d *cache,
2683 tree t, hash_set<const char *> *seen, bool alias)
2685 const char *name;
2686 enum gcc_plugin_symbol_kind kind;
2687 enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT;
2688 unsigned slot_num;
2689 uint64_t size;
2690 const char *comdat;
2691 unsigned char c;
2693 gcc_assert (VAR_OR_FUNCTION_DECL_P (t));
2695 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2697 /* This behaves like assemble_name_raw in varasm.c, performing the
2698 same name manipulations that ASM_OUTPUT_LABELREF does. */
2699 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2701 if (seen->add (name))
2702 return;
2704 streamer_tree_cache_lookup (cache, t, &slot_num);
2705 gcc_assert (slot_num != (unsigned)-1);
2707 if (DECL_EXTERNAL (t))
2709 if (DECL_WEAK (t))
2710 kind = GCCPK_WEAKUNDEF;
2711 else
2712 kind = GCCPK_UNDEF;
2714 else
2716 if (DECL_WEAK (t))
2717 kind = GCCPK_WEAKDEF;
2718 else if (DECL_COMMON (t))
2719 kind = GCCPK_COMMON;
2720 else
2721 kind = GCCPK_DEF;
2723 /* When something is defined, it should have node attached. */
2724 gcc_assert (alias || !VAR_P (t) || varpool_node::get (t)->definition);
2725 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2726 || (cgraph_node::get (t)
2727 && cgraph_node::get (t)->definition));
2730 /* Imitate what default_elf_asm_output_external do.
2731 When symbol is external, we need to output it with DEFAULT visibility
2732 when compiling with -fvisibility=default, while with HIDDEN visibility
2733 when symbol has attribute (visibility("hidden")) specified.
2734 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2735 right. */
2737 if (DECL_EXTERNAL (t)
2738 && !targetm.binds_local_p (t))
2739 visibility = GCCPV_DEFAULT;
2740 else
2741 switch (DECL_VISIBILITY (t))
2743 case VISIBILITY_DEFAULT:
2744 visibility = GCCPV_DEFAULT;
2745 break;
2746 case VISIBILITY_PROTECTED:
2747 visibility = GCCPV_PROTECTED;
2748 break;
2749 case VISIBILITY_HIDDEN:
2750 visibility = GCCPV_HIDDEN;
2751 break;
2752 case VISIBILITY_INTERNAL:
2753 visibility = GCCPV_INTERNAL;
2754 break;
2757 if (kind == GCCPK_COMMON
2758 && DECL_SIZE_UNIT (t)
2759 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2760 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2761 else
2762 size = 0;
2764 if (DECL_ONE_ONLY (t))
2765 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2766 else
2767 comdat = "";
2769 lto_write_data (name, strlen (name) + 1);
2770 lto_write_data (comdat, strlen (comdat) + 1);
2771 c = (unsigned char) kind;
2772 lto_write_data (&c, 1);
2773 c = (unsigned char) visibility;
2774 lto_write_data (&c, 1);
2775 lto_write_data (&size, 8);
2776 lto_write_data (&slot_num, 4);
2779 /* Write an IL symbol table to OB.
2780 SET and VSET are cgraph/varpool node sets we are outputting. */
2782 static void
2783 produce_symtab (struct output_block *ob)
2785 struct streamer_tree_cache_d *cache = ob->writer_cache;
2786 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, 0, NULL);
2787 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2788 lto_symtab_encoder_iterator lsei;
2790 lto_begin_section (section_name, false);
2791 free (section_name);
2793 hash_set<const char *> seen;
2795 /* Write the symbol table.
2796 First write everything defined and then all declarations.
2797 This is necessary to handle cases where we have duplicated symbols. */
2798 for (lsei = lsei_start (encoder);
2799 !lsei_end_p (lsei); lsei_next (&lsei))
2801 symtab_node *node = lsei_node (lsei);
2803 if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
2804 continue;
2805 write_symbol (cache, node->decl, &seen, false);
2807 for (lsei = lsei_start (encoder);
2808 !lsei_end_p (lsei); lsei_next (&lsei))
2810 symtab_node *node = lsei_node (lsei);
2812 if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
2813 continue;
2814 write_symbol (cache, node->decl, &seen, false);
2817 lto_end_section ();
2821 /* Init the streamer_mode_table for output, where we collect info on what
2822 machine_mode values have been streamed. */
2823 void
2824 lto_output_init_mode_table (void)
2826 memset (streamer_mode_table, '\0', MAX_MACHINE_MODE);
2830 /* Write the mode table. */
2831 static void
2832 lto_write_mode_table (void)
2834 struct output_block *ob;
2835 ob = create_output_block (LTO_section_mode_table);
2836 bitpack_d bp = bitpack_create (ob->main_stream);
2838 /* Ensure that for GET_MODE_INNER (m) != m we have
2839 also the inner mode marked. */
2840 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
2841 if (streamer_mode_table[i])
2843 machine_mode m = (machine_mode) i;
2844 machine_mode inner_m = GET_MODE_INNER (m);
2845 if (inner_m != m)
2846 streamer_mode_table[(int) inner_m] = 1;
2848 /* First stream modes that have GET_MODE_INNER (m) == m,
2849 so that we can refer to them afterwards. */
2850 for (int pass = 0; pass < 2; pass++)
2851 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
2852 if (streamer_mode_table[i] && i != (int) VOIDmode && i != (int) BLKmode)
2854 machine_mode m = (machine_mode) i;
2855 if ((GET_MODE_INNER (m) == m) ^ (pass == 0))
2856 continue;
2857 bp_pack_value (&bp, m, 8);
2858 bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m));
2859 bp_pack_poly_value (&bp, GET_MODE_SIZE (m), 16);
2860 bp_pack_poly_value (&bp, GET_MODE_PRECISION (m), 16);
2861 bp_pack_value (&bp, GET_MODE_INNER (m), 8);
2862 bp_pack_poly_value (&bp, GET_MODE_NUNITS (m), 16);
2863 switch (GET_MODE_CLASS (m))
2865 case MODE_FRACT:
2866 case MODE_UFRACT:
2867 case MODE_ACCUM:
2868 case MODE_UACCUM:
2869 bp_pack_value (&bp, GET_MODE_IBIT (m), 8);
2870 bp_pack_value (&bp, GET_MODE_FBIT (m), 8);
2871 break;
2872 case MODE_FLOAT:
2873 case MODE_DECIMAL_FLOAT:
2874 bp_pack_string (ob, &bp, REAL_MODE_FORMAT (m)->name, true);
2875 break;
2876 default:
2877 break;
2879 bp_pack_string (ob, &bp, GET_MODE_NAME (m), true);
2881 bp_pack_value (&bp, VOIDmode, 8);
2883 streamer_write_bitpack (&bp);
2885 char *section_name
2886 = lto_get_section_name (LTO_section_mode_table, NULL, 0, NULL);
2887 lto_begin_section (section_name, !flag_wpa);
2888 free (section_name);
2890 /* The entire header stream is computed here. */
2891 struct lto_simple_header_with_strings header;
2892 memset (&header, 0, sizeof (header));
2894 header.main_size = ob->main_stream->total_size;
2895 header.string_size = ob->string_stream->total_size;
2896 lto_write_data (&header, sizeof header);
2898 /* Put all of the gimple and the string table out the asm file as a
2899 block of text. */
2900 lto_write_stream (ob->main_stream);
2901 lto_write_stream (ob->string_stream);
2903 lto_end_section ();
2904 destroy_output_block (ob);
2908 /* This pass is run after all of the functions are serialized and all
2909 of the IPA passes have written their serialized forms. This pass
2910 causes the vector of all of the global decls and types used from
2911 this file to be written in to a section that can then be read in to
2912 recover these on other side. */
2914 void
2915 produce_asm_for_decls (void)
2917 struct lto_out_decl_state *out_state;
2918 struct lto_out_decl_state *fn_out_state;
2919 struct lto_decl_header header;
2920 char *section_name;
2921 struct output_block *ob;
2922 unsigned idx, num_fns;
2923 size_t decl_state_size;
2924 int32_t num_decl_states;
2926 ob = create_output_block (LTO_section_decls);
2928 memset (&header, 0, sizeof (struct lto_decl_header));
2930 section_name = lto_get_section_name (LTO_section_decls, NULL, 0, NULL);
2931 lto_begin_section (section_name, !flag_wpa);
2932 free (section_name);
2934 /* Make string 0 be a NULL string. */
2935 streamer_write_char_stream (ob->string_stream, 0);
2937 gcc_assert (!alias_pairs);
2939 /* Get rid of the global decl state hash tables to save some memory. */
2940 out_state = lto_get_out_decl_state ();
2941 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2942 if (out_state->streams[i].tree_hash_table)
2944 delete out_state->streams[i].tree_hash_table;
2945 out_state->streams[i].tree_hash_table = NULL;
2948 /* Write the global symbols. */
2949 if (streamer_dump_file)
2950 fprintf (streamer_dump_file, "Outputting global stream\n");
2951 lto_output_decl_state_streams (ob, out_state);
2952 num_fns = lto_function_decl_states.length ();
2953 for (idx = 0; idx < num_fns; idx++)
2955 fn_out_state =
2956 lto_function_decl_states[idx];
2957 if (streamer_dump_file)
2958 fprintf (streamer_dump_file, "Outputting stream for %s\n",
2959 IDENTIFIER_POINTER
2960 (DECL_ASSEMBLER_NAME (fn_out_state->fn_decl)));
2961 lto_output_decl_state_streams (ob, fn_out_state);
2964 /* Currently not used. This field would allow us to preallocate
2965 the globals vector, so that it need not be resized as it is extended. */
2966 header.num_nodes = -1;
2968 /* Compute the total size of all decl out states. */
2969 decl_state_size = sizeof (int32_t);
2970 decl_state_size += lto_out_decl_state_written_size (out_state);
2971 for (idx = 0; idx < num_fns; idx++)
2973 fn_out_state =
2974 lto_function_decl_states[idx];
2975 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2977 header.decl_state_size = decl_state_size;
2979 header.main_size = ob->main_stream->total_size;
2980 header.string_size = ob->string_stream->total_size;
2982 lto_write_data (&header, sizeof header);
2984 /* Write the main out-decl state, followed by out-decl states of
2985 functions. */
2986 num_decl_states = num_fns + 1;
2987 lto_write_data (&num_decl_states, sizeof (num_decl_states));
2988 lto_output_decl_state_refs (ob, out_state);
2989 for (idx = 0; idx < num_fns; idx++)
2991 fn_out_state = lto_function_decl_states[idx];
2992 lto_output_decl_state_refs (ob, fn_out_state);
2995 lto_write_stream (ob->main_stream);
2996 lto_write_stream (ob->string_stream);
2998 lto_end_section ();
3000 /* Write the symbol table. It is used by linker to determine dependencies
3001 and thus we can skip it for WPA. */
3002 if (!flag_wpa)
3003 produce_symtab (ob);
3005 /* Write command line opts. */
3006 lto_write_options ();
3008 /* Deallocate memory and clean up. */
3009 for (idx = 0; idx < num_fns; idx++)
3011 fn_out_state =
3012 lto_function_decl_states[idx];
3013 lto_delete_out_decl_state (fn_out_state);
3015 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
3016 lto_function_decl_states.release ();
3017 destroy_output_block (ob);
3018 if (lto_stream_offload_p)
3019 lto_write_mode_table ();