lto-streamer-out.c (tree_is_indexable): Consider IMPORTED_DECL as non-indexable.
[gcc.git] / gcc / lto-streamer-out.c
1 /* Write the GIMPLE representation to a file stream.
2
3 Copyright (C) 2009-2014 Free Software Foundation, Inc.
4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5 Re-implemented by Diego Novillo <dnovillo@google.com>
6
7 This file is part of GCC.
8
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.
13
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.
18
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/>. */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "stor-layout.h"
29 #include "stringpool.h"
30 #include "expr.h"
31 #include "flags.h"
32 #include "params.h"
33 #include "input.h"
34 #include "hashtab.h"
35 #include "basic-block.h"
36 #include "tree-ssa-alias.h"
37 #include "internal-fn.h"
38 #include "gimple-expr.h"
39 #include "is-a.h"
40 #include "gimple.h"
41 #include "gimple-iterator.h"
42 #include "gimple-ssa.h"
43 #include "tree-ssanames.h"
44 #include "tree-pass.h"
45 #include "function.h"
46 #include "diagnostic-core.h"
47 #include "except.h"
48 #include "lto-symtab.h"
49 #include "lto-streamer.h"
50 #include "data-streamer.h"
51 #include "gimple-streamer.h"
52 #include "tree-streamer.h"
53 #include "streamer-hooks.h"
54 #include "cfgloop.h"
55 #include "builtins.h"
56
57
58 static void lto_write_tree (struct output_block*, tree, bool);
59
60 /* Clear the line info stored in DATA_IN. */
61
62 static void
63 clear_line_info (struct output_block *ob)
64 {
65 ob->current_file = NULL;
66 ob->current_line = 0;
67 ob->current_col = 0;
68 }
69
70
71 /* Create the output block and return it. SECTION_TYPE is
72 LTO_section_function_body or LTO_static_initializer. */
73
74 struct output_block *
75 create_output_block (enum lto_section_type section_type)
76 {
77 struct output_block *ob = XCNEW (struct output_block);
78
79 ob->section_type = section_type;
80 ob->decl_state = lto_get_out_decl_state ();
81 ob->main_stream = XCNEW (struct lto_output_stream);
82 ob->string_stream = XCNEW (struct lto_output_stream);
83 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
84
85 if (section_type == LTO_section_function_body)
86 ob->cfg_stream = XCNEW (struct lto_output_stream);
87
88 clear_line_info (ob);
89
90 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
91 gcc_obstack_init (&ob->obstack);
92
93 return ob;
94 }
95
96
97 /* Destroy the output block OB. */
98
99 void
100 destroy_output_block (struct output_block *ob)
101 {
102 enum lto_section_type section_type = ob->section_type;
103
104 delete ob->string_hash_table;
105 ob->string_hash_table = NULL;
106
107 free (ob->main_stream);
108 free (ob->string_stream);
109 if (section_type == LTO_section_function_body)
110 free (ob->cfg_stream);
111
112 streamer_tree_cache_delete (ob->writer_cache);
113 obstack_free (&ob->obstack, NULL);
114
115 free (ob);
116 }
117
118
119 /* Look up NODE in the type table and write the index for it to OB. */
120
121 static void
122 output_type_ref (struct output_block *ob, tree node)
123 {
124 streamer_write_record_start (ob, LTO_type_ref);
125 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
126 }
127
128
129 /* Return true if tree node T is written to various tables. For these
130 nodes, we sometimes want to write their phyiscal representation
131 (via lto_output_tree), and sometimes we need to emit an index
132 reference into a table (via lto_output_tree_ref). */
133
134 static bool
135 tree_is_indexable (tree t)
136 {
137 /* Parameters and return values of functions of variably modified types
138 must go to global stream, because they may be used in the type
139 definition. */
140 if (TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
141 return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
142 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared. */
143 else if (TREE_CODE (t) == IMPORTED_DECL)
144 return false;
145 else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
146 || TREE_CODE (t) == TYPE_DECL
147 || TREE_CODE (t) == CONST_DECL
148 || TREE_CODE (t) == NAMELIST_DECL)
149 && decl_function_context (t))
150 return false;
151 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
152 return false;
153 /* Variably modified types need to be streamed alongside function
154 bodies because they can refer to local entities. Together with
155 them we have to localize their members as well.
156 ??? In theory that includes non-FIELD_DECLs as well. */
157 else if (TYPE_P (t)
158 && variably_modified_type_p (t, NULL_TREE))
159 return false;
160 else if (TREE_CODE (t) == FIELD_DECL
161 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
162 return false;
163 else
164 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
165 }
166
167
168 /* Output info about new location into bitpack BP.
169 After outputting bitpack, lto_output_location_data has
170 to be done to output actual data. */
171
172 void
173 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
174 location_t loc)
175 {
176 expanded_location xloc;
177
178 loc = LOCATION_LOCUS (loc);
179 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
180 if (loc == UNKNOWN_LOCATION)
181 return;
182
183 xloc = expand_location (loc);
184
185 bp_pack_value (bp, ob->current_file != xloc.file, 1);
186 bp_pack_value (bp, ob->current_line != xloc.line, 1);
187 bp_pack_value (bp, ob->current_col != xloc.column, 1);
188
189 if (ob->current_file != xloc.file)
190 bp_pack_var_len_unsigned (bp,
191 streamer_string_index (ob, xloc.file,
192 strlen (xloc.file) + 1,
193 true));
194 ob->current_file = xloc.file;
195
196 if (ob->current_line != xloc.line)
197 bp_pack_var_len_unsigned (bp, xloc.line);
198 ob->current_line = xloc.line;
199
200 if (ob->current_col != xloc.column)
201 bp_pack_var_len_unsigned (bp, xloc.column);
202 ob->current_col = xloc.column;
203 }
204
205
206 /* If EXPR is an indexable tree node, output a reference to it to
207 output block OB. Otherwise, output the physical representation of
208 EXPR to OB. */
209
210 static void
211 lto_output_tree_ref (struct output_block *ob, tree expr)
212 {
213 enum tree_code code;
214
215 if (TYPE_P (expr))
216 {
217 output_type_ref (ob, expr);
218 return;
219 }
220
221 code = TREE_CODE (expr);
222 switch (code)
223 {
224 case SSA_NAME:
225 streamer_write_record_start (ob, LTO_ssa_name_ref);
226 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
227 break;
228
229 case FIELD_DECL:
230 streamer_write_record_start (ob, LTO_field_decl_ref);
231 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
232 break;
233
234 case FUNCTION_DECL:
235 streamer_write_record_start (ob, LTO_function_decl_ref);
236 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
237 break;
238
239 case VAR_DECL:
240 case DEBUG_EXPR_DECL:
241 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
242 case PARM_DECL:
243 streamer_write_record_start (ob, LTO_global_decl_ref);
244 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
245 break;
246
247 case CONST_DECL:
248 streamer_write_record_start (ob, LTO_const_decl_ref);
249 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
250 break;
251
252 case IMPORTED_DECL:
253 gcc_assert (decl_function_context (expr) == NULL);
254 streamer_write_record_start (ob, LTO_imported_decl_ref);
255 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
256 break;
257
258 case TYPE_DECL:
259 streamer_write_record_start (ob, LTO_type_decl_ref);
260 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
261 break;
262
263 case NAMELIST_DECL:
264 streamer_write_record_start (ob, LTO_namelist_decl_ref);
265 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
266 break;
267
268 case NAMESPACE_DECL:
269 streamer_write_record_start (ob, LTO_namespace_decl_ref);
270 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
271 break;
272
273 case LABEL_DECL:
274 streamer_write_record_start (ob, LTO_label_decl_ref);
275 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
276 break;
277
278 case RESULT_DECL:
279 streamer_write_record_start (ob, LTO_result_decl_ref);
280 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
281 break;
282
283 case TRANSLATION_UNIT_DECL:
284 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
285 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
286 break;
287
288 default:
289 /* No other node is indexable, so it should have been handled by
290 lto_output_tree. */
291 gcc_unreachable ();
292 }
293 }
294
295
296 /* Return true if EXPR is a tree node that can be written to disk. */
297
298 static inline bool
299 lto_is_streamable (tree expr)
300 {
301 enum tree_code code = TREE_CODE (expr);
302
303 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
304 name version in lto_output_tree_ref (see output_ssa_names). */
305 return !is_lang_specific (expr)
306 && code != SSA_NAME
307 && code != CALL_EXPR
308 && code != LANG_TYPE
309 && code != MODIFY_EXPR
310 && code != INIT_EXPR
311 && code != TARGET_EXPR
312 && code != BIND_EXPR
313 && code != WITH_CLEANUP_EXPR
314 && code != STATEMENT_LIST
315 && (code == CASE_LABEL_EXPR
316 || code == DECL_EXPR
317 || TREE_CODE_CLASS (code) != tcc_statement);
318 }
319
320
321 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
322
323 static tree
324 get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
325 {
326 gcc_checking_assert (DECL_P (expr)
327 && TREE_CODE (expr) != FUNCTION_DECL
328 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
329
330 /* Handle DECL_INITIAL for symbols. */
331 tree initial = DECL_INITIAL (expr);
332 if (TREE_CODE (expr) == VAR_DECL
333 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
334 && !DECL_IN_CONSTANT_POOL (expr)
335 && initial)
336 {
337 varpool_node *vnode;
338 /* Extra section needs about 30 bytes; do not produce it for simple
339 scalar values. */
340 if (TREE_CODE (DECL_INITIAL (expr)) == CONSTRUCTOR
341 || !(vnode = varpool_node::get (expr))
342 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
343 initial = error_mark_node;
344 }
345
346 return initial;
347 }
348
349
350 /* Write a physical representation of tree node EXPR to output block
351 OB. If REF_P is true, the leaves of EXPR are emitted as references
352 via lto_output_tree_ref. IX is the index into the streamer cache
353 where EXPR is stored. */
354
355 static void
356 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
357 {
358 /* Pack all the non-pointer fields in EXPR into a bitpack and write
359 the resulting bitpack. */
360 bitpack_d bp = bitpack_create (ob->main_stream);
361 streamer_pack_tree_bitfields (ob, &bp, expr);
362 streamer_write_bitpack (&bp);
363
364 /* Write all the pointer fields in EXPR. */
365 streamer_write_tree_body (ob, expr, ref_p);
366
367 /* Write any LTO-specific data to OB. */
368 if (DECL_P (expr)
369 && TREE_CODE (expr) != FUNCTION_DECL
370 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
371 {
372 /* Handle DECL_INITIAL for symbols. */
373 tree initial = get_symbol_initial_value
374 (ob->decl_state->symtab_node_encoder, expr);
375 stream_write_tree (ob, initial, ref_p);
376 }
377 }
378
379 /* Write a physical representation of tree node EXPR to output block
380 OB. If REF_P is true, the leaves of EXPR are emitted as references
381 via lto_output_tree_ref. IX is the index into the streamer cache
382 where EXPR is stored. */
383
384 static void
385 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
386 {
387 if (!lto_is_streamable (expr))
388 internal_error ("tree code %qs is not supported in LTO streams",
389 get_tree_code_name (TREE_CODE (expr)));
390
391 /* Write the header, containing everything needed to materialize
392 EXPR on the reading side. */
393 streamer_write_tree_header (ob, expr);
394
395 lto_write_tree_1 (ob, expr, ref_p);
396
397 /* Mark the end of EXPR. */
398 streamer_write_zero (ob);
399 }
400
401 /* Emit the physical representation of tree node EXPR to output block
402 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
403 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
404
405 static void
406 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
407 bool ref_p, bool this_ref_p)
408 {
409 unsigned ix;
410
411 gcc_checking_assert (expr != NULL_TREE
412 && !(this_ref_p && tree_is_indexable (expr)));
413
414 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
415 expr, hash, &ix);
416 gcc_assert (!exists_p);
417 if (streamer_handle_as_builtin_p (expr))
418 {
419 /* MD and NORMAL builtins do not need to be written out
420 completely as they are always instantiated by the
421 compiler on startup. The only builtins that need to
422 be written out are BUILT_IN_FRONTEND. For all other
423 builtins, we simply write the class and code. */
424 streamer_write_builtin (ob, expr);
425 }
426 else if (TREE_CODE (expr) == INTEGER_CST
427 && !TREE_OVERFLOW (expr))
428 {
429 /* Shared INTEGER_CST nodes are special because they need their
430 original type to be materialized by the reader (to implement
431 TYPE_CACHED_VALUES). */
432 streamer_write_integer_cst (ob, expr, ref_p);
433 }
434 else
435 {
436 /* This is the first time we see EXPR, write its fields
437 to OB. */
438 lto_write_tree (ob, expr, ref_p);
439 }
440 }
441
442 struct sccs
443 {
444 unsigned int dfsnum;
445 unsigned int low;
446 };
447
448 struct scc_entry
449 {
450 tree t;
451 hashval_t hash;
452 };
453
454 static unsigned int next_dfs_num;
455 static vec<scc_entry> sccstack;
456 static struct pointer_map_t *sccstate;
457 static struct obstack sccstate_obstack;
458
459 static void
460 DFS_write_tree (struct output_block *ob, sccs *from_state,
461 tree expr, bool ref_p, bool this_ref_p);
462
463 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
464 DFS recurse for all tree edges originating from it. */
465
466 static void
467 DFS_write_tree_body (struct output_block *ob,
468 tree expr, sccs *expr_state, bool ref_p)
469 {
470 #define DFS_follow_tree_edge(DEST) \
471 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
472
473 enum tree_code code;
474
475 code = TREE_CODE (expr);
476
477 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
478 {
479 if (TREE_CODE (expr) != IDENTIFIER_NODE)
480 DFS_follow_tree_edge (TREE_TYPE (expr));
481 }
482
483 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
484 {
485 for (unsigned i = 0; i < VECTOR_CST_NELTS (expr); ++i)
486 DFS_follow_tree_edge (VECTOR_CST_ELT (expr, i));
487 }
488
489 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
490 {
491 DFS_follow_tree_edge (TREE_REALPART (expr));
492 DFS_follow_tree_edge (TREE_IMAGPART (expr));
493 }
494
495 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
496 {
497 /* Drop names that were created for anonymous entities. */
498 if (DECL_NAME (expr)
499 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
500 && ANON_AGGRNAME_P (DECL_NAME (expr)))
501 ;
502 else
503 DFS_follow_tree_edge (DECL_NAME (expr));
504 DFS_follow_tree_edge (DECL_CONTEXT (expr));
505 }
506
507 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
508 {
509 DFS_follow_tree_edge (DECL_SIZE (expr));
510 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
511
512 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
513 special handling in LTO, it must be handled by streamer hooks. */
514
515 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
516
517 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
518 for early inlining so drop it on the floor instead of ICEing in
519 dwarf2out.c. */
520
521 if ((TREE_CODE (expr) == VAR_DECL
522 || TREE_CODE (expr) == PARM_DECL)
523 && DECL_HAS_VALUE_EXPR_P (expr))
524 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
525 if (TREE_CODE (expr) == VAR_DECL)
526 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
527 }
528
529 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
530 {
531 if (TREE_CODE (expr) == TYPE_DECL)
532 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
533 }
534
535 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
536 {
537 /* Make sure we don't inadvertently set the assembler name. */
538 if (DECL_ASSEMBLER_NAME_SET_P (expr))
539 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
540 }
541
542 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
543 {
544 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
545 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
546 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
547 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
548 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
549 }
550
551 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
552 {
553 DFS_follow_tree_edge (DECL_VINDEX (expr));
554 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
555 /* Do not DECL_FUNCTION_SPECIFIC_TARGET. They will be regenerated. */
556 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
557 }
558
559 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
560 {
561 DFS_follow_tree_edge (TYPE_SIZE (expr));
562 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
563 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
564 DFS_follow_tree_edge (TYPE_NAME (expr));
565 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
566 reconstructed during fixup. */
567 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
568 during fixup. */
569 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
570 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
571 /* TYPE_CANONICAL is re-computed during type merging, so no need
572 to follow it here. */
573 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
574 }
575
576 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
577 {
578 if (TREE_CODE (expr) == ENUMERAL_TYPE)
579 DFS_follow_tree_edge (TYPE_VALUES (expr));
580 else if (TREE_CODE (expr) == ARRAY_TYPE)
581 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
582 else if (RECORD_OR_UNION_TYPE_P (expr))
583 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
584 DFS_follow_tree_edge (t);
585 else if (TREE_CODE (expr) == FUNCTION_TYPE
586 || TREE_CODE (expr) == METHOD_TYPE)
587 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
588
589 if (!POINTER_TYPE_P (expr))
590 DFS_follow_tree_edge (TYPE_MINVAL (expr));
591 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
592 if (RECORD_OR_UNION_TYPE_P (expr))
593 DFS_follow_tree_edge (TYPE_BINFO (expr));
594 }
595
596 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
597 {
598 DFS_follow_tree_edge (TREE_PURPOSE (expr));
599 DFS_follow_tree_edge (TREE_VALUE (expr));
600 DFS_follow_tree_edge (TREE_CHAIN (expr));
601 }
602
603 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
604 {
605 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
606 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
607 }
608
609 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
610 {
611 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
612 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
613 DFS_follow_tree_edge (TREE_BLOCK (expr));
614 }
615
616 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
617 {
618 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
619 /* ??? FIXME. See also streamer_write_chain. */
620 if (!(VAR_OR_FUNCTION_DECL_P (t)
621 && DECL_EXTERNAL (t)))
622 DFS_follow_tree_edge (t);
623
624 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
625
626 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
627 handle - those that represent inlined function scopes.
628 For the drop rest them on the floor instead of ICEing
629 in dwarf2out.c. */
630 if (inlined_function_outer_scope_p (expr))
631 {
632 tree ultimate_origin = block_ultimate_origin (expr);
633 DFS_follow_tree_edge (ultimate_origin);
634 }
635 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
636 information for early inlined BLOCKs so drop it on the floor instead
637 of ICEing in dwarf2out.c. */
638
639 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
640 streaming time. */
641
642 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
643 list is re-constructed from BLOCK_SUPERCONTEXT. */
644 }
645
646 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
647 {
648 unsigned i;
649 tree t;
650
651 /* Note that the number of BINFO slots has already been emitted in
652 EXPR's header (see streamer_write_tree_header) because this length
653 is needed to build the empty BINFO node on the reader side. */
654 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
655 DFS_follow_tree_edge (t);
656 DFS_follow_tree_edge (BINFO_OFFSET (expr));
657 DFS_follow_tree_edge (BINFO_VTABLE (expr));
658 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
659
660 /* The number of BINFO_BASE_ACCESSES has already been emitted in
661 EXPR's bitfield section. */
662 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
663 DFS_follow_tree_edge (t);
664
665 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
666 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
667 }
668
669 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
670 {
671 unsigned i;
672 tree index, value;
673
674 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
675 {
676 DFS_follow_tree_edge (index);
677 DFS_follow_tree_edge (value);
678 }
679 }
680
681 if (code == OMP_CLAUSE)
682 {
683 int i;
684 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
685 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
686 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
687 }
688
689 #undef DFS_follow_tree_edge
690 }
691
692 /* Return a hash value for the tree T. */
693
694 static hashval_t
695 hash_tree (struct streamer_tree_cache_d *cache, tree t)
696 {
697 #define visit(SIBLING) \
698 do { \
699 unsigned ix; \
700 if (SIBLING && streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
701 v = iterative_hash_hashval_t (streamer_tree_cache_get_hash (cache, ix), v); \
702 } while (0)
703
704 /* Hash TS_BASE. */
705 enum tree_code code = TREE_CODE (t);
706 hashval_t v = iterative_hash_host_wide_int (code, 0);
707 if (!TYPE_P (t))
708 {
709 v = iterative_hash_host_wide_int (TREE_SIDE_EFFECTS (t)
710 | (TREE_CONSTANT (t) << 1)
711 | (TREE_READONLY (t) << 2)
712 | (TREE_PUBLIC (t) << 3), v);
713 }
714 v = iterative_hash_host_wide_int (TREE_ADDRESSABLE (t)
715 | (TREE_THIS_VOLATILE (t) << 1), v);
716 if (DECL_P (t))
717 v = iterative_hash_host_wide_int (DECL_UNSIGNED (t), v);
718 else if (TYPE_P (t))
719 v = iterative_hash_host_wide_int (TYPE_UNSIGNED (t), v);
720 if (TYPE_P (t))
721 v = iterative_hash_host_wide_int (TYPE_ARTIFICIAL (t), v);
722 else
723 v = iterative_hash_host_wide_int (TREE_NO_WARNING (t), v);
724 v = iterative_hash_host_wide_int (TREE_NOTHROW (t)
725 | (TREE_STATIC (t) << 1)
726 | (TREE_PROTECTED (t) << 2)
727 | (TREE_DEPRECATED (t) << 3), v);
728 if (code != TREE_BINFO)
729 v = iterative_hash_host_wide_int (TREE_PRIVATE (t), v);
730 if (TYPE_P (t))
731 v = iterative_hash_host_wide_int (TYPE_SATURATING (t)
732 | (TYPE_ADDR_SPACE (t) << 1), v);
733 else if (code == SSA_NAME)
734 v = iterative_hash_host_wide_int (SSA_NAME_IS_DEFAULT_DEF (t), v);
735
736 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
737 {
738 int i;
739 v = iterative_hash_host_wide_int (TREE_INT_CST_NUNITS (t), v);
740 v = iterative_hash_host_wide_int (TREE_INT_CST_EXT_NUNITS (t), v);
741 for (i = 0; i < TREE_INT_CST_NUNITS (t); i++)
742 v = iterative_hash_host_wide_int (TREE_INT_CST_ELT (t, i), v);
743 }
744
745 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
746 {
747 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
748 v = iterative_hash_host_wide_int (r.cl, v);
749 v = iterative_hash_host_wide_int (r.decimal
750 | (r.sign << 1)
751 | (r.signalling << 2)
752 | (r.canonical << 3), v);
753 v = iterative_hash_host_wide_int (r.uexp, v);
754 for (unsigned i = 0; i < SIGSZ; ++i)
755 v = iterative_hash_host_wide_int (r.sig[i], v);
756 }
757
758 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
759 {
760 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
761 v = iterative_hash_host_wide_int (f.mode, v);
762 v = iterative_hash_host_wide_int (f.data.low, v);
763 v = iterative_hash_host_wide_int (f.data.high, v);
764 }
765
766 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
767 {
768 v = iterative_hash_host_wide_int (DECL_MODE (t), v);
769 v = iterative_hash_host_wide_int (DECL_NONLOCAL (t)
770 | (DECL_VIRTUAL_P (t) << 1)
771 | (DECL_IGNORED_P (t) << 2)
772 | (DECL_ABSTRACT (t) << 3)
773 | (DECL_ARTIFICIAL (t) << 4)
774 | (DECL_USER_ALIGN (t) << 5)
775 | (DECL_PRESERVE_P (t) << 6)
776 | (DECL_EXTERNAL (t) << 7)
777 | (DECL_GIMPLE_REG_P (t) << 8), v);
778 v = iterative_hash_host_wide_int (DECL_ALIGN (t), v);
779 if (code == LABEL_DECL)
780 {
781 v = iterative_hash_host_wide_int (EH_LANDING_PAD_NR (t), v);
782 v = iterative_hash_host_wide_int (LABEL_DECL_UID (t), v);
783 }
784 else if (code == FIELD_DECL)
785 {
786 v = iterative_hash_host_wide_int (DECL_PACKED (t)
787 | (DECL_NONADDRESSABLE_P (t) << 1),
788 v);
789 v = iterative_hash_host_wide_int (DECL_OFFSET_ALIGN (t), v);
790 }
791 else if (code == VAR_DECL)
792 {
793 v = iterative_hash_host_wide_int (DECL_HAS_DEBUG_EXPR_P (t)
794 | (DECL_NONLOCAL_FRAME (t) << 1),
795 v);
796 }
797 if (code == RESULT_DECL
798 || code == PARM_DECL
799 || code == VAR_DECL)
800 {
801 v = iterative_hash_host_wide_int (DECL_BY_REFERENCE (t), v);
802 if (code == VAR_DECL
803 || code == PARM_DECL)
804 v = iterative_hash_host_wide_int (DECL_HAS_VALUE_EXPR_P (t), v);
805 }
806 }
807
808 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
809 v = iterative_hash_host_wide_int (DECL_REGISTER (t), v);
810
811 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
812 {
813 v = iterative_hash_host_wide_int ((DECL_COMMON (t))
814 | (DECL_DLLIMPORT_P (t) << 1)
815 | (DECL_WEAK (t) << 2)
816 | (DECL_SEEN_IN_BIND_EXPR_P (t) << 3)
817 | (DECL_COMDAT (t) << 4)
818 | (DECL_VISIBILITY_SPECIFIED (t) << 6),
819 v);
820 v = iterative_hash_host_wide_int (DECL_VISIBILITY (t), v);
821 if (code == VAR_DECL)
822 {
823 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
824 v = iterative_hash_host_wide_int (DECL_HARD_REGISTER (t)
825 | (DECL_IN_CONSTANT_POOL (t) << 1),
826 v);
827 }
828 if (TREE_CODE (t) == FUNCTION_DECL)
829 v = iterative_hash_host_wide_int (DECL_FINAL_P (t)
830 | (DECL_CXX_CONSTRUCTOR_P (t) << 1)
831 | (DECL_CXX_DESTRUCTOR_P (t) << 2),
832 v);
833 }
834
835 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
836 {
837 v = iterative_hash_host_wide_int (DECL_BUILT_IN_CLASS (t), v);
838 v = iterative_hash_host_wide_int (DECL_STATIC_CONSTRUCTOR (t)
839 | (DECL_STATIC_DESTRUCTOR (t) << 1)
840 | (DECL_UNINLINABLE (t) << 2)
841 | (DECL_POSSIBLY_INLINED (t) << 3)
842 | (DECL_IS_NOVOPS (t) << 4)
843 | (DECL_IS_RETURNS_TWICE (t) << 5)
844 | (DECL_IS_MALLOC (t) << 6)
845 | (DECL_IS_OPERATOR_NEW (t) << 7)
846 | (DECL_DECLARED_INLINE_P (t) << 8)
847 | (DECL_STATIC_CHAIN (t) << 9)
848 | (DECL_NO_INLINE_WARNING_P (t) << 10)
849 | (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t) << 11)
850 | (DECL_NO_LIMIT_STACK (t) << 12)
851 | (DECL_DISREGARD_INLINE_LIMITS (t) << 13)
852 | (DECL_PURE_P (t) << 14)
853 | (DECL_LOOPING_CONST_OR_PURE_P (t) << 15), v);
854 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
855 v = iterative_hash_host_wide_int (DECL_FUNCTION_CODE (t), v);
856 }
857
858 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
859 {
860 v = iterative_hash_host_wide_int (TYPE_MODE (t), v);
861 v = iterative_hash_host_wide_int (TYPE_STRING_FLAG (t)
862 | (TYPE_NO_FORCE_BLK (t) << 1)
863 | (TYPE_NEEDS_CONSTRUCTING (t) << 2)
864 | (TYPE_PACKED (t) << 3)
865 | (TYPE_RESTRICT (t) << 4)
866 | (TYPE_USER_ALIGN (t) << 5)
867 | (TYPE_READONLY (t) << 6), v);
868 if (RECORD_OR_UNION_TYPE_P (t))
869 {
870 v = iterative_hash_host_wide_int (TYPE_TRANSPARENT_AGGR (t)
871 | (TYPE_FINAL_P (t) << 1), v);
872 }
873 else if (code == ARRAY_TYPE)
874 v = iterative_hash_host_wide_int (TYPE_NONALIASED_COMPONENT (t), v);
875 v = iterative_hash_host_wide_int (TYPE_PRECISION (t), v);
876 v = iterative_hash_host_wide_int (TYPE_ALIGN (t), v);
877 v = iterative_hash_host_wide_int ((TYPE_ALIAS_SET (t) == 0
878 || (!in_lto_p
879 && get_alias_set (t) == 0))
880 ? 0 : -1, v);
881 }
882
883 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
884 v = iterative_hash (TRANSLATION_UNIT_LANGUAGE (t),
885 strlen (TRANSLATION_UNIT_LANGUAGE (t)), v);
886
887 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
888 gcc_unreachable ();
889
890 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
891 v = iterative_hash (t, sizeof (struct cl_optimization), v);
892
893 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
894 v = iterative_hash_host_wide_int (IDENTIFIER_HASH_VALUE (t), v);
895
896 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
897 v = iterative_hash (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t), v);
898
899 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
900 {
901 if (POINTER_TYPE_P (t))
902 {
903 /* For pointers factor in the pointed-to type recursively as
904 we cannot recurse through only pointers.
905 ??? We can generalize this by keeping track of the
906 in-SCC edges for each tree (or arbitrarily the first
907 such edge) and hashing that in in a second stage
908 (instead of the quadratic mixing of the SCC we do now). */
909 hashval_t x;
910 unsigned ix;
911 if (streamer_tree_cache_lookup (cache, TREE_TYPE (t), &ix))
912 x = streamer_tree_cache_get_hash (cache, ix);
913 else
914 x = hash_tree (cache, TREE_TYPE (t));
915 v = iterative_hash_hashval_t (x, v);
916 }
917 else if (code != IDENTIFIER_NODE)
918 visit (TREE_TYPE (t));
919 }
920
921 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
922 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
923 visit (VECTOR_CST_ELT (t, i));
924
925 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
926 {
927 visit (TREE_REALPART (t));
928 visit (TREE_IMAGPART (t));
929 }
930
931 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
932 {
933 /* Drop names that were created for anonymous entities. */
934 if (DECL_NAME (t)
935 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
936 && ANON_AGGRNAME_P (DECL_NAME (t)))
937 ;
938 else
939 visit (DECL_NAME (t));
940 if (DECL_FILE_SCOPE_P (t))
941 ;
942 else
943 visit (DECL_CONTEXT (t));
944 }
945
946 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
947 {
948 visit (DECL_SIZE (t));
949 visit (DECL_SIZE_UNIT (t));
950 visit (DECL_ATTRIBUTES (t));
951 if ((code == VAR_DECL
952 || code == PARM_DECL)
953 && DECL_HAS_VALUE_EXPR_P (t))
954 visit (DECL_VALUE_EXPR (t));
955 if (code == VAR_DECL
956 && DECL_HAS_DEBUG_EXPR_P (t))
957 visit (DECL_DEBUG_EXPR (t));
958 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
959 be able to call get_symbol_initial_value. */
960 }
961
962 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
963 {
964 if (code == TYPE_DECL)
965 visit (DECL_ORIGINAL_TYPE (t));
966 }
967
968 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
969 {
970 if (DECL_ASSEMBLER_NAME_SET_P (t))
971 visit (DECL_ASSEMBLER_NAME (t));
972 }
973
974 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
975 {
976 visit (DECL_FIELD_OFFSET (t));
977 visit (DECL_BIT_FIELD_TYPE (t));
978 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
979 visit (DECL_FIELD_BIT_OFFSET (t));
980 visit (DECL_FCONTEXT (t));
981 }
982
983 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
984 {
985 visit (DECL_VINDEX (t));
986 visit (DECL_FUNCTION_PERSONALITY (t));
987 /* Do not follow DECL_FUNCTION_SPECIFIC_TARGET. */
988 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
989 }
990
991 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
992 {
993 visit (TYPE_SIZE (t));
994 visit (TYPE_SIZE_UNIT (t));
995 visit (TYPE_ATTRIBUTES (t));
996 visit (TYPE_NAME (t));
997 visit (TYPE_MAIN_VARIANT (t));
998 if (TYPE_FILE_SCOPE_P (t))
999 ;
1000 else
1001 visit (TYPE_CONTEXT (t));
1002 visit (TYPE_STUB_DECL (t));
1003 }
1004
1005 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1006 {
1007 if (code == ENUMERAL_TYPE)
1008 visit (TYPE_VALUES (t));
1009 else if (code == ARRAY_TYPE)
1010 visit (TYPE_DOMAIN (t));
1011 else if (RECORD_OR_UNION_TYPE_P (t))
1012 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1013 visit (f);
1014 else if (code == FUNCTION_TYPE
1015 || code == METHOD_TYPE)
1016 visit (TYPE_ARG_TYPES (t));
1017 if (!POINTER_TYPE_P (t))
1018 visit (TYPE_MINVAL (t));
1019 visit (TYPE_MAXVAL (t));
1020 if (RECORD_OR_UNION_TYPE_P (t))
1021 visit (TYPE_BINFO (t));
1022 }
1023
1024 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1025 {
1026 visit (TREE_PURPOSE (t));
1027 visit (TREE_VALUE (t));
1028 visit (TREE_CHAIN (t));
1029 }
1030
1031 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1032 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1033 visit (TREE_VEC_ELT (t, i));
1034
1035 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1036 {
1037 v = iterative_hash_host_wide_int (TREE_OPERAND_LENGTH (t), v);
1038 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1039 visit (TREE_OPERAND (t, i));
1040 }
1041
1042 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1043 {
1044 unsigned i;
1045 tree b;
1046 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1047 visit (b);
1048 visit (BINFO_OFFSET (t));
1049 visit (BINFO_VTABLE (t));
1050 visit (BINFO_VPTR_FIELD (t));
1051 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1052 visit (b);
1053 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1054 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1055 }
1056
1057 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1058 {
1059 unsigned i;
1060 tree index, value;
1061 v = iterative_hash_host_wide_int (CONSTRUCTOR_NELTS (t), v);
1062 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1063 {
1064 visit (index);
1065 visit (value);
1066 }
1067 }
1068
1069 if (code == OMP_CLAUSE)
1070 {
1071 int i;
1072
1073 v = iterative_hash_host_wide_int (OMP_CLAUSE_CODE (t), v);
1074 switch (OMP_CLAUSE_CODE (t))
1075 {
1076 case OMP_CLAUSE_DEFAULT:
1077 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEFAULT_KIND (t), v);
1078 break;
1079 case OMP_CLAUSE_SCHEDULE:
1080 v = iterative_hash_host_wide_int (OMP_CLAUSE_SCHEDULE_KIND (t), v);
1081 break;
1082 case OMP_CLAUSE_DEPEND:
1083 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEPEND_KIND (t), v);
1084 break;
1085 case OMP_CLAUSE_MAP:
1086 v = iterative_hash_host_wide_int (OMP_CLAUSE_MAP_KIND (t), v);
1087 break;
1088 case OMP_CLAUSE_PROC_BIND:
1089 v = iterative_hash_host_wide_int (OMP_CLAUSE_PROC_BIND_KIND (t), v);
1090 break;
1091 case OMP_CLAUSE_REDUCTION:
1092 v = iterative_hash_host_wide_int (OMP_CLAUSE_REDUCTION_CODE (t), v);
1093 break;
1094 default:
1095 break;
1096 }
1097 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1098 visit (OMP_CLAUSE_OPERAND (t, i));
1099 visit (OMP_CLAUSE_CHAIN (t));
1100 }
1101
1102 return v;
1103
1104 #undef visit
1105 }
1106
1107 /* Compare two SCC entries by their hash value for qsorting them. */
1108
1109 static int
1110 scc_entry_compare (const void *p1_, const void *p2_)
1111 {
1112 const scc_entry *p1 = (const scc_entry *) p1_;
1113 const scc_entry *p2 = (const scc_entry *) p2_;
1114 if (p1->hash < p2->hash)
1115 return -1;
1116 else if (p1->hash > p2->hash)
1117 return 1;
1118 return 0;
1119 }
1120
1121 /* Return a hash value for the SCC on the SCC stack from FIRST with
1122 size SIZE. */
1123
1124 static hashval_t
1125 hash_scc (struct streamer_tree_cache_d *cache, unsigned first, unsigned size)
1126 {
1127 /* Compute hash values for the SCC members. */
1128 for (unsigned i = 0; i < size; ++i)
1129 sccstack[first+i].hash = hash_tree (cache, sccstack[first+i].t);
1130
1131 if (size == 1)
1132 return sccstack[first].hash;
1133
1134 /* Sort the SCC of type, hash pairs so that when we mix in
1135 all members of the SCC the hash value becomes independent on
1136 the order we visited the SCC. Produce hash of the whole SCC as
1137 combination of hashes of individual elements. Then combine that hash into
1138 hash of each element, so othewise identically looking elements from two
1139 different SCCs are distinguished. */
1140 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1141
1142 hashval_t scc_hash = sccstack[first].hash;
1143 for (unsigned i = 1; i < size; ++i)
1144 scc_hash = iterative_hash_hashval_t (scc_hash,
1145 sccstack[first+i].hash);
1146 for (unsigned i = 0; i < size; ++i)
1147 sccstack[first+i].hash = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1148 return scc_hash;
1149 }
1150
1151 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1152 already in the streamer cache. Main routine called for
1153 each visit of EXPR. */
1154
1155 static void
1156 DFS_write_tree (struct output_block *ob, sccs *from_state,
1157 tree expr, bool ref_p, bool this_ref_p)
1158 {
1159 unsigned ix;
1160 sccs **slot;
1161
1162 /* Handle special cases. */
1163 if (expr == NULL_TREE)
1164 return;
1165
1166 /* Do not DFS walk into indexable trees. */
1167 if (this_ref_p && tree_is_indexable (expr))
1168 return;
1169
1170 /* Check if we already streamed EXPR. */
1171 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1172 return;
1173
1174 slot = (sccs **)pointer_map_insert (sccstate, expr);
1175 sccs *cstate = *slot;
1176 if (!cstate)
1177 {
1178 scc_entry e = { expr, 0 };
1179 /* Not yet visited. DFS recurse and push it onto the stack. */
1180 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1181 sccstack.safe_push (e);
1182 cstate->dfsnum = next_dfs_num++;
1183 cstate->low = cstate->dfsnum;
1184
1185 if (streamer_handle_as_builtin_p (expr))
1186 ;
1187 else if (TREE_CODE (expr) == INTEGER_CST
1188 && !TREE_OVERFLOW (expr))
1189 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
1190 else
1191 {
1192 DFS_write_tree_body (ob, expr, cstate, ref_p);
1193
1194 /* Walk any LTO-specific edges. */
1195 if (DECL_P (expr)
1196 && TREE_CODE (expr) != FUNCTION_DECL
1197 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1198 {
1199 /* Handle DECL_INITIAL for symbols. */
1200 tree initial = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
1201 expr);
1202 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
1203 }
1204 }
1205
1206 /* See if we found an SCC. */
1207 if (cstate->low == cstate->dfsnum)
1208 {
1209 unsigned first, size;
1210 tree x;
1211
1212 /* Pop the SCC and compute its size. */
1213 first = sccstack.length ();
1214 do
1215 {
1216 x = sccstack[--first].t;
1217 }
1218 while (x != expr);
1219 size = sccstack.length () - first;
1220
1221 /* No need to compute hashes for LTRANS units, we don't perform
1222 any merging there. */
1223 hashval_t scc_hash = 0;
1224 unsigned scc_entry_len = 0;
1225 if (!flag_wpa)
1226 {
1227 scc_hash = hash_scc (ob->writer_cache, first, size);
1228
1229 /* Put the entries with the least number of collisions first. */
1230 unsigned entry_start = 0;
1231 scc_entry_len = size + 1;
1232 for (unsigned i = 0; i < size;)
1233 {
1234 unsigned from = i;
1235 for (i = i + 1; i < size
1236 && (sccstack[first + i].hash
1237 == sccstack[first + from].hash); ++i)
1238 ;
1239 if (i - from < scc_entry_len)
1240 {
1241 scc_entry_len = i - from;
1242 entry_start = from;
1243 }
1244 }
1245 for (unsigned i = 0; i < scc_entry_len; ++i)
1246 {
1247 scc_entry tem = sccstack[first + i];
1248 sccstack[first + i] = sccstack[first + entry_start + i];
1249 sccstack[first + entry_start + i] = tem;
1250 }
1251 }
1252
1253 /* Write LTO_tree_scc. */
1254 streamer_write_record_start (ob, LTO_tree_scc);
1255 streamer_write_uhwi (ob, size);
1256 streamer_write_uhwi (ob, scc_hash);
1257
1258 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1259 All INTEGER_CSTs need to be handled this way as we need
1260 their type to materialize them. Also builtins are handled
1261 this way.
1262 ??? We still wrap these in LTO_tree_scc so at the
1263 input side we can properly identify the tree we want
1264 to ultimatively return. */
1265 if (size == 1)
1266 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1267 else
1268 {
1269 /* Write the size of the SCC entry candidates. */
1270 streamer_write_uhwi (ob, scc_entry_len);
1271
1272 /* Write all headers and populate the streamer cache. */
1273 for (unsigned i = 0; i < size; ++i)
1274 {
1275 hashval_t hash = sccstack[first+i].hash;
1276 tree t = sccstack[first+i].t;
1277 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1278 t, hash, &ix);
1279 gcc_assert (!exists_p);
1280
1281 if (!lto_is_streamable (t))
1282 internal_error ("tree code %qs is not supported "
1283 "in LTO streams",
1284 get_tree_code_name (TREE_CODE (t)));
1285
1286 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1287
1288 /* Write the header, containing everything needed to
1289 materialize EXPR on the reading side. */
1290 streamer_write_tree_header (ob, t);
1291 }
1292
1293 /* Write the bitpacks and tree references. */
1294 for (unsigned i = 0; i < size; ++i)
1295 {
1296 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1297
1298 /* Mark the end of the tree. */
1299 streamer_write_zero (ob);
1300 }
1301 }
1302
1303 /* Finally truncate the vector. */
1304 sccstack.truncate (first);
1305
1306 if (from_state)
1307 from_state->low = MIN (from_state->low, cstate->low);
1308 return;
1309 }
1310
1311 if (from_state)
1312 from_state->low = MIN (from_state->low, cstate->low);
1313 }
1314 gcc_checking_assert (from_state);
1315 if (cstate->dfsnum < from_state->dfsnum)
1316 from_state->low = MIN (cstate->dfsnum, from_state->low);
1317 }
1318
1319
1320 /* Emit the physical representation of tree node EXPR to output block
1321 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1322 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1323
1324 void
1325 lto_output_tree (struct output_block *ob, tree expr,
1326 bool ref_p, bool this_ref_p)
1327 {
1328 unsigned ix;
1329 bool existed_p;
1330
1331 if (expr == NULL_TREE)
1332 {
1333 streamer_write_record_start (ob, LTO_null);
1334 return;
1335 }
1336
1337 if (this_ref_p && tree_is_indexable (expr))
1338 {
1339 lto_output_tree_ref (ob, expr);
1340 return;
1341 }
1342
1343 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1344 if (existed_p)
1345 {
1346 /* If a node has already been streamed out, make sure that
1347 we don't write it more than once. Otherwise, the reader
1348 will instantiate two different nodes for the same object. */
1349 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1350 streamer_write_uhwi (ob, ix);
1351 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1352 lto_tree_code_to_tag (TREE_CODE (expr)));
1353 lto_stats.num_pickle_refs_output++;
1354 }
1355 else
1356 {
1357 /* This is the first time we see EXPR, write all reachable
1358 trees to OB. */
1359 static bool in_dfs_walk;
1360
1361 /* Protect against recursion which means disconnect between
1362 what tree edges we walk in the DFS walk and what edges
1363 we stream out. */
1364 gcc_assert (!in_dfs_walk);
1365
1366 /* Start the DFS walk. */
1367 /* Save ob state ... */
1368 /* let's see ... */
1369 in_dfs_walk = true;
1370 sccstate = pointer_map_create ();
1371 gcc_obstack_init (&sccstate_obstack);
1372 next_dfs_num = 1;
1373 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
1374 sccstack.release ();
1375 pointer_map_destroy (sccstate);
1376 obstack_free (&sccstate_obstack, NULL);
1377 in_dfs_walk = false;
1378
1379 /* Finally append a reference to the tree we were writing.
1380 ??? If expr ended up as a singleton we could have
1381 inlined it here and avoid outputting a reference. */
1382 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1383 gcc_assert (existed_p);
1384 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1385 streamer_write_uhwi (ob, ix);
1386 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1387 lto_tree_code_to_tag (TREE_CODE (expr)));
1388 lto_stats.num_pickle_refs_output++;
1389 }
1390 }
1391
1392
1393 /* Output to OB a list of try/catch handlers starting with FIRST. */
1394
1395 static void
1396 output_eh_try_list (struct output_block *ob, eh_catch first)
1397 {
1398 eh_catch n;
1399
1400 for (n = first; n; n = n->next_catch)
1401 {
1402 streamer_write_record_start (ob, LTO_eh_catch);
1403 stream_write_tree (ob, n->type_list, true);
1404 stream_write_tree (ob, n->filter_list, true);
1405 stream_write_tree (ob, n->label, true);
1406 }
1407
1408 streamer_write_record_start (ob, LTO_null);
1409 }
1410
1411
1412 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1413 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1414 detect EH region sharing. */
1415
1416 static void
1417 output_eh_region (struct output_block *ob, eh_region r)
1418 {
1419 enum LTO_tags tag;
1420
1421 if (r == NULL)
1422 {
1423 streamer_write_record_start (ob, LTO_null);
1424 return;
1425 }
1426
1427 if (r->type == ERT_CLEANUP)
1428 tag = LTO_ert_cleanup;
1429 else if (r->type == ERT_TRY)
1430 tag = LTO_ert_try;
1431 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1432 tag = LTO_ert_allowed_exceptions;
1433 else if (r->type == ERT_MUST_NOT_THROW)
1434 tag = LTO_ert_must_not_throw;
1435 else
1436 gcc_unreachable ();
1437
1438 streamer_write_record_start (ob, tag);
1439 streamer_write_hwi (ob, r->index);
1440
1441 if (r->outer)
1442 streamer_write_hwi (ob, r->outer->index);
1443 else
1444 streamer_write_zero (ob);
1445
1446 if (r->inner)
1447 streamer_write_hwi (ob, r->inner->index);
1448 else
1449 streamer_write_zero (ob);
1450
1451 if (r->next_peer)
1452 streamer_write_hwi (ob, r->next_peer->index);
1453 else
1454 streamer_write_zero (ob);
1455
1456 if (r->type == ERT_TRY)
1457 {
1458 output_eh_try_list (ob, r->u.eh_try.first_catch);
1459 }
1460 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1461 {
1462 stream_write_tree (ob, r->u.allowed.type_list, true);
1463 stream_write_tree (ob, r->u.allowed.label, true);
1464 streamer_write_uhwi (ob, r->u.allowed.filter);
1465 }
1466 else if (r->type == ERT_MUST_NOT_THROW)
1467 {
1468 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1469 bitpack_d bp = bitpack_create (ob->main_stream);
1470 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1471 streamer_write_bitpack (&bp);
1472 }
1473
1474 if (r->landing_pads)
1475 streamer_write_hwi (ob, r->landing_pads->index);
1476 else
1477 streamer_write_zero (ob);
1478 }
1479
1480
1481 /* Output landing pad LP to OB. */
1482
1483 static void
1484 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1485 {
1486 if (lp == NULL)
1487 {
1488 streamer_write_record_start (ob, LTO_null);
1489 return;
1490 }
1491
1492 streamer_write_record_start (ob, LTO_eh_landing_pad);
1493 streamer_write_hwi (ob, lp->index);
1494 if (lp->next_lp)
1495 streamer_write_hwi (ob, lp->next_lp->index);
1496 else
1497 streamer_write_zero (ob);
1498
1499 if (lp->region)
1500 streamer_write_hwi (ob, lp->region->index);
1501 else
1502 streamer_write_zero (ob);
1503
1504 stream_write_tree (ob, lp->post_landing_pad, true);
1505 }
1506
1507
1508 /* Output the existing eh_table to OB. */
1509
1510 static void
1511 output_eh_regions (struct output_block *ob, struct function *fn)
1512 {
1513 if (fn->eh && fn->eh->region_tree)
1514 {
1515 unsigned i;
1516 eh_region eh;
1517 eh_landing_pad lp;
1518 tree ttype;
1519
1520 streamer_write_record_start (ob, LTO_eh_table);
1521
1522 /* Emit the index of the root of the EH region tree. */
1523 streamer_write_hwi (ob, fn->eh->region_tree->index);
1524
1525 /* Emit all the EH regions in the region array. */
1526 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1527 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1528 output_eh_region (ob, eh);
1529
1530 /* Emit all landing pads. */
1531 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1532 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1533 output_eh_lp (ob, lp);
1534
1535 /* Emit all the runtime type data. */
1536 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1537 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1538 stream_write_tree (ob, ttype, true);
1539
1540 /* Emit the table of action chains. */
1541 if (targetm.arm_eabi_unwinder)
1542 {
1543 tree t;
1544 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1545 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1546 stream_write_tree (ob, t, true);
1547 }
1548 else
1549 {
1550 uchar c;
1551 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1552 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1553 streamer_write_char_stream (ob->main_stream, c);
1554 }
1555 }
1556
1557 /* The LTO_null either terminates the record or indicates that there
1558 are no eh_records at all. */
1559 streamer_write_record_start (ob, LTO_null);
1560 }
1561
1562
1563 /* Output all of the active ssa names to the ssa_names stream. */
1564
1565 static void
1566 output_ssa_names (struct output_block *ob, struct function *fn)
1567 {
1568 unsigned int i, len;
1569
1570 len = vec_safe_length (SSANAMES (fn));
1571 streamer_write_uhwi (ob, len);
1572
1573 for (i = 1; i < len; i++)
1574 {
1575 tree ptr = (*SSANAMES (fn))[i];
1576
1577 if (ptr == NULL_TREE
1578 || SSA_NAME_IN_FREE_LIST (ptr)
1579 || virtual_operand_p (ptr))
1580 continue;
1581
1582 streamer_write_uhwi (ob, i);
1583 streamer_write_char_stream (ob->main_stream,
1584 SSA_NAME_IS_DEFAULT_DEF (ptr));
1585 if (SSA_NAME_VAR (ptr))
1586 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1587 else
1588 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1589 stream_write_tree (ob, TREE_TYPE (ptr), true);
1590 }
1591
1592 streamer_write_zero (ob);
1593 }
1594
1595
1596 /* Output a wide-int. */
1597
1598 static void
1599 streamer_write_wi (struct output_block *ob,
1600 const widest_int &w)
1601 {
1602 int len = w.get_len ();
1603
1604 streamer_write_uhwi (ob, w.get_precision ());
1605 streamer_write_uhwi (ob, len);
1606 for (int i = 0; i < len; i++)
1607 streamer_write_hwi (ob, w.elt (i));
1608 }
1609
1610
1611 /* Output the cfg. */
1612
1613 static void
1614 output_cfg (struct output_block *ob, struct function *fn)
1615 {
1616 struct lto_output_stream *tmp_stream = ob->main_stream;
1617 basic_block bb;
1618
1619 ob->main_stream = ob->cfg_stream;
1620
1621 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1622 profile_status_for_fn (fn));
1623
1624 /* Output the number of the highest basic block. */
1625 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1626
1627 FOR_ALL_BB_FN (bb, fn)
1628 {
1629 edge_iterator ei;
1630 edge e;
1631
1632 streamer_write_hwi (ob, bb->index);
1633
1634 /* Output the successors and the edge flags. */
1635 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1636 FOR_EACH_EDGE (e, ei, bb->succs)
1637 {
1638 streamer_write_uhwi (ob, e->dest->index);
1639 streamer_write_hwi (ob, e->probability);
1640 streamer_write_gcov_count (ob, e->count);
1641 streamer_write_uhwi (ob, e->flags);
1642 }
1643 }
1644
1645 streamer_write_hwi (ob, -1);
1646
1647 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1648 while (bb->next_bb)
1649 {
1650 streamer_write_hwi (ob, bb->next_bb->index);
1651 bb = bb->next_bb;
1652 }
1653
1654 streamer_write_hwi (ob, -1);
1655
1656 /* ??? The cfgloop interface is tied to cfun. */
1657 gcc_assert (cfun == fn);
1658
1659 /* Output the number of loops. */
1660 streamer_write_uhwi (ob, number_of_loops (fn));
1661
1662 /* Output each loop, skipping the tree root which has number zero. */
1663 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1664 {
1665 struct loop *loop = get_loop (fn, i);
1666
1667 /* Write the index of the loop header. That's enough to rebuild
1668 the loop tree on the reader side. Stream -1 for an unused
1669 loop entry. */
1670 if (!loop)
1671 {
1672 streamer_write_hwi (ob, -1);
1673 continue;
1674 }
1675 else
1676 streamer_write_hwi (ob, loop->header->index);
1677
1678 /* Write everything copy_loop_info copies. */
1679 streamer_write_enum (ob->main_stream,
1680 loop_estimation, EST_LAST, loop->estimate_state);
1681 streamer_write_hwi (ob, loop->any_upper_bound);
1682 if (loop->any_upper_bound)
1683 streamer_write_wi (ob, loop->nb_iterations_upper_bound);
1684 streamer_write_hwi (ob, loop->any_estimate);
1685 if (loop->any_estimate)
1686 streamer_write_wi (ob, loop->nb_iterations_estimate);
1687
1688 /* Write OMP SIMD related info. */
1689 streamer_write_hwi (ob, loop->safelen);
1690 streamer_write_hwi (ob, loop->dont_vectorize);
1691 streamer_write_hwi (ob, loop->force_vectorize);
1692 stream_write_tree (ob, loop->simduid, true);
1693 }
1694
1695 ob->main_stream = tmp_stream;
1696 }
1697
1698
1699 /* Create the header in the file using OB. If the section type is for
1700 a function, set FN to the decl for that function. */
1701
1702 void
1703 produce_asm (struct output_block *ob, tree fn)
1704 {
1705 enum lto_section_type section_type = ob->section_type;
1706 struct lto_function_header header;
1707 char *section_name;
1708 struct lto_output_stream *header_stream;
1709
1710 if (section_type == LTO_section_function_body)
1711 {
1712 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1713 section_name = lto_get_section_name (section_type, name, NULL);
1714 }
1715 else
1716 section_name = lto_get_section_name (section_type, NULL, NULL);
1717
1718 lto_begin_section (section_name, !flag_wpa);
1719 free (section_name);
1720
1721 /* The entire header is stream computed here. */
1722 memset (&header, 0, sizeof (struct lto_function_header));
1723
1724 /* Write the header. */
1725 header.lto_header.major_version = LTO_major_version;
1726 header.lto_header.minor_version = LTO_minor_version;
1727
1728 header.compressed_size = 0;
1729
1730 if (section_type == LTO_section_function_body)
1731 header.cfg_size = ob->cfg_stream->total_size;
1732 header.main_size = ob->main_stream->total_size;
1733 header.string_size = ob->string_stream->total_size;
1734
1735 header_stream = XCNEW (struct lto_output_stream);
1736 lto_output_data_stream (header_stream, &header, sizeof header);
1737 lto_write_stream (header_stream);
1738 free (header_stream);
1739
1740 /* Put all of the gimple and the string table out the asm file as a
1741 block of text. */
1742 if (section_type == LTO_section_function_body)
1743 lto_write_stream (ob->cfg_stream);
1744 lto_write_stream (ob->main_stream);
1745 lto_write_stream (ob->string_stream);
1746
1747 lto_end_section ();
1748 }
1749
1750
1751 /* Output the base body of struct function FN using output block OB. */
1752
1753 static void
1754 output_struct_function_base (struct output_block *ob, struct function *fn)
1755 {
1756 struct bitpack_d bp;
1757 unsigned i;
1758 tree t;
1759
1760 /* Output the static chain and non-local goto save area. */
1761 stream_write_tree (ob, fn->static_chain_decl, true);
1762 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1763
1764 /* Output all the local variables in the function. */
1765 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1766 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1767 stream_write_tree (ob, t, true);
1768
1769 /* Output current IL state of the function. */
1770 streamer_write_uhwi (ob, fn->curr_properties);
1771
1772 /* Write all the attributes for FN. */
1773 bp = bitpack_create (ob->main_stream);
1774 bp_pack_value (&bp, fn->is_thunk, 1);
1775 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1776 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1777 bp_pack_value (&bp, fn->returns_struct, 1);
1778 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1779 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1780 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1781 bp_pack_value (&bp, fn->after_inlining, 1);
1782 bp_pack_value (&bp, fn->stdarg, 1);
1783 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1784 bp_pack_value (&bp, fn->calls_alloca, 1);
1785 bp_pack_value (&bp, fn->calls_setjmp, 1);
1786 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
1787 bp_pack_value (&bp, fn->has_simduid_loops, 1);
1788 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1789 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1790
1791 /* Output the function start and end loci. */
1792 stream_output_location (ob, &bp, fn->function_start_locus);
1793 stream_output_location (ob, &bp, fn->function_end_locus);
1794
1795 streamer_write_bitpack (&bp);
1796 }
1797
1798
1799 /* Output the body of function NODE->DECL. */
1800
1801 static void
1802 output_function (struct cgraph_node *node)
1803 {
1804 tree function;
1805 struct function *fn;
1806 basic_block bb;
1807 struct output_block *ob;
1808
1809 function = node->decl;
1810 fn = DECL_STRUCT_FUNCTION (function);
1811 ob = create_output_block (LTO_section_function_body);
1812
1813 clear_line_info (ob);
1814 ob->symbol = node;
1815
1816 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1817
1818 /* Set current_function_decl and cfun. */
1819 push_cfun (fn);
1820
1821 /* Make string 0 be a NULL string. */
1822 streamer_write_char_stream (ob->string_stream, 0);
1823
1824 streamer_write_record_start (ob, LTO_function);
1825
1826 /* Output decls for parameters and args. */
1827 stream_write_tree (ob, DECL_RESULT (function), true);
1828 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
1829
1830 /* Output DECL_INITIAL for the function, which contains the tree of
1831 lexical scopes. */
1832 stream_write_tree (ob, DECL_INITIAL (function), true);
1833
1834 /* We also stream abstract functions where we stream only stuff needed for
1835 debug info. */
1836 if (gimple_has_body_p (function))
1837 {
1838 streamer_write_uhwi (ob, 1);
1839 output_struct_function_base (ob, fn);
1840
1841 /* Output all the SSA names used in the function. */
1842 output_ssa_names (ob, fn);
1843
1844 /* Output any exception handling regions. */
1845 output_eh_regions (ob, fn);
1846
1847
1848 /* We will renumber the statements. The code that does this uses
1849 the same ordering that we use for serializing them so we can use
1850 the same code on the other end and not have to write out the
1851 statement numbers. We do not assign UIDs to PHIs here because
1852 virtual PHIs get re-computed on-the-fly which would make numbers
1853 inconsistent. */
1854 set_gimple_stmt_max_uid (cfun, 0);
1855 FOR_ALL_BB_FN (bb, cfun)
1856 {
1857 gimple_stmt_iterator gsi;
1858 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1859 {
1860 gimple stmt = gsi_stmt (gsi);
1861
1862 /* Virtual PHIs are not going to be streamed. */
1863 if (!virtual_operand_p (gimple_phi_result (stmt)))
1864 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1865 }
1866 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1867 {
1868 gimple stmt = gsi_stmt (gsi);
1869 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1870 }
1871 }
1872 /* To avoid keeping duplicate gimple IDs in the statements, renumber
1873 virtual phis now. */
1874 FOR_ALL_BB_FN (bb, cfun)
1875 {
1876 gimple_stmt_iterator gsi;
1877 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1878 {
1879 gimple stmt = gsi_stmt (gsi);
1880 if (virtual_operand_p (gimple_phi_result (stmt)))
1881 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1882 }
1883 }
1884
1885 /* Output the code for the function. */
1886 FOR_ALL_BB_FN (bb, fn)
1887 output_bb (ob, bb, fn);
1888
1889 /* The terminator for this function. */
1890 streamer_write_record_start (ob, LTO_null);
1891
1892 output_cfg (ob, fn);
1893
1894 pop_cfun ();
1895 }
1896 else
1897 streamer_write_uhwi (ob, 0);
1898
1899 /* Create a section to hold the pickled output of this function. */
1900 produce_asm (ob, function);
1901
1902 destroy_output_block (ob);
1903 }
1904
1905 /* Output the body of function NODE->DECL. */
1906
1907 static void
1908 output_constructor (struct varpool_node *node)
1909 {
1910 tree var = node->decl;
1911 struct output_block *ob;
1912
1913 ob = create_output_block (LTO_section_function_body);
1914
1915 clear_line_info (ob);
1916 ob->symbol = node;
1917
1918 /* Make string 0 be a NULL string. */
1919 streamer_write_char_stream (ob->string_stream, 0);
1920
1921 /* Output DECL_INITIAL for the function, which contains the tree of
1922 lexical scopes. */
1923 stream_write_tree (ob, DECL_INITIAL (var), true);
1924
1925 /* Create a section to hold the pickled output of this function. */
1926 produce_asm (ob, var);
1927
1928 destroy_output_block (ob);
1929 }
1930
1931
1932 /* Emit toplevel asms. */
1933
1934 void
1935 lto_output_toplevel_asms (void)
1936 {
1937 struct output_block *ob;
1938 struct asm_node *can;
1939 char *section_name;
1940 struct lto_output_stream *header_stream;
1941 struct lto_asm_header header;
1942
1943 if (! asm_nodes)
1944 return;
1945
1946 ob = create_output_block (LTO_section_asm);
1947
1948 /* Make string 0 be a NULL string. */
1949 streamer_write_char_stream (ob->string_stream, 0);
1950
1951 for (can = asm_nodes; can; can = can->next)
1952 {
1953 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
1954 streamer_write_hwi (ob, can->order);
1955 }
1956
1957 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
1958
1959 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
1960 lto_begin_section (section_name, !flag_wpa);
1961 free (section_name);
1962
1963 /* The entire header stream is computed here. */
1964 memset (&header, 0, sizeof (header));
1965
1966 /* Write the header. */
1967 header.lto_header.major_version = LTO_major_version;
1968 header.lto_header.minor_version = LTO_minor_version;
1969
1970 header.main_size = ob->main_stream->total_size;
1971 header.string_size = ob->string_stream->total_size;
1972
1973 header_stream = XCNEW (struct lto_output_stream);
1974 lto_output_data_stream (header_stream, &header, sizeof (header));
1975 lto_write_stream (header_stream);
1976 free (header_stream);
1977
1978 /* Put all of the gimple and the string table out the asm file as a
1979 block of text. */
1980 lto_write_stream (ob->main_stream);
1981 lto_write_stream (ob->string_stream);
1982
1983 lto_end_section ();
1984
1985 destroy_output_block (ob);
1986 }
1987
1988
1989 /* Copy the function body or variable constructor of NODE without deserializing. */
1990
1991 static void
1992 copy_function_or_variable (struct symtab_node *node)
1993 {
1994 tree function = node->decl;
1995 struct lto_file_decl_data *file_data = node->lto_file_data;
1996 struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
1997 const char *data;
1998 size_t len;
1999 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2000 char *section_name =
2001 lto_get_section_name (LTO_section_function_body, name, NULL);
2002 size_t i, j;
2003 struct lto_in_decl_state *in_state;
2004 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2005
2006 lto_begin_section (section_name, !flag_wpa);
2007 free (section_name);
2008
2009 /* We may have renamed the declaration, e.g., a static function. */
2010 name = lto_get_decl_name_mapping (file_data, name);
2011
2012 data = lto_get_section_data (file_data, LTO_section_function_body,
2013 name, &len);
2014 gcc_assert (data);
2015
2016 /* Do a bit copy of the function body. */
2017 lto_output_data_stream (output_stream, data, len);
2018 lto_write_stream (output_stream);
2019
2020 /* Copy decls. */
2021 in_state =
2022 lto_get_function_in_decl_state (node->lto_file_data, function);
2023 gcc_assert (in_state);
2024
2025 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2026 {
2027 size_t n = in_state->streams[i].size;
2028 tree *trees = in_state->streams[i].trees;
2029 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2030
2031 /* The out state must have the same indices and the in state.
2032 So just copy the vector. All the encoders in the in state
2033 must be empty where we reach here. */
2034 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2035 encoder->trees.reserve_exact (n);
2036 for (j = 0; j < n; j++)
2037 encoder->trees.safe_push (trees[j]);
2038 }
2039
2040 lto_free_section_data (file_data, LTO_section_function_body, name,
2041 data, len);
2042 free (output_stream);
2043 lto_end_section ();
2044 }
2045
2046 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2047
2048 static tree
2049 wrap_refs (tree *tp, int *ws, void *)
2050 {
2051 tree t = *tp;
2052 if (handled_component_p (t)
2053 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
2054 {
2055 tree decl = TREE_OPERAND (t, 0);
2056 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2057 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2058 build1 (ADDR_EXPR, ptrtype, decl),
2059 build_int_cst (ptrtype, 0));
2060 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2061 *ws = 0;
2062 }
2063 else if (TREE_CODE (t) == CONSTRUCTOR)
2064 ;
2065 else if (!EXPR_P (t))
2066 *ws = 0;
2067 return NULL_TREE;
2068 }
2069
2070 /* Main entry point from the pass manager. */
2071
2072 void
2073 lto_output (void)
2074 {
2075 struct lto_out_decl_state *decl_state;
2076 #ifdef ENABLE_CHECKING
2077 bitmap output = lto_bitmap_alloc ();
2078 #endif
2079 int i, n_nodes;
2080 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2081
2082 /* Initialize the streamer. */
2083 lto_streamer_init ();
2084
2085 n_nodes = lto_symtab_encoder_size (encoder);
2086 /* Process only the functions with bodies. */
2087 for (i = 0; i < n_nodes; i++)
2088 {
2089 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2090 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2091 {
2092 if (lto_symtab_encoder_encode_body_p (encoder, node)
2093 && !node->alias)
2094 {
2095 #ifdef ENABLE_CHECKING
2096 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2097 bitmap_set_bit (output, DECL_UID (node->decl));
2098 #endif
2099 decl_state = lto_new_out_decl_state ();
2100 lto_push_out_decl_state (decl_state);
2101 if (gimple_has_body_p (node->decl) || !flag_wpa)
2102 output_function (node);
2103 else
2104 copy_function_or_variable (node);
2105 gcc_assert (lto_get_out_decl_state () == decl_state);
2106 lto_pop_out_decl_state ();
2107 lto_record_function_out_decl_state (node->decl, decl_state);
2108 }
2109 }
2110 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2111 {
2112 /* Wrap symbol references inside the ctor in a type
2113 preserving MEM_REF. */
2114 tree ctor = DECL_INITIAL (node->decl);
2115 if (ctor && !in_lto_p)
2116 walk_tree (&ctor, wrap_refs, NULL, NULL);
2117 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2118 && lto_symtab_encoder_encode_initializer_p (encoder, node)
2119 && !node->alias)
2120 {
2121 timevar_push (TV_IPA_LTO_CTORS_OUT);
2122 #ifdef ENABLE_CHECKING
2123 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2124 bitmap_set_bit (output, DECL_UID (node->decl));
2125 #endif
2126 decl_state = lto_new_out_decl_state ();
2127 lto_push_out_decl_state (decl_state);
2128 if (DECL_INITIAL (node->decl) != error_mark_node
2129 || !flag_wpa)
2130 output_constructor (node);
2131 else
2132 copy_function_or_variable (node);
2133 gcc_assert (lto_get_out_decl_state () == decl_state);
2134 lto_pop_out_decl_state ();
2135 lto_record_function_out_decl_state (node->decl, decl_state);
2136 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2137 }
2138 }
2139 }
2140
2141 /* Emit the callgraph after emitting function bodies. This needs to
2142 be done now to make sure that all the statements in every function
2143 have been renumbered so that edges can be associated with call
2144 statements using the statement UIDs. */
2145 output_symtab ();
2146
2147 #ifdef ENABLE_CHECKING
2148 lto_bitmap_free (output);
2149 #endif
2150 }
2151
2152 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2153 from it and required for correct representation of its semantics.
2154 Each node in ENCODER must be a global declaration or a type. A node
2155 is written only once, even if it appears multiple times in the
2156 vector. Certain transitively-reachable nodes, such as those
2157 representing expressions, may be duplicated, but such nodes
2158 must not appear in ENCODER itself. */
2159
2160 static void
2161 write_global_stream (struct output_block *ob,
2162 struct lto_tree_ref_encoder *encoder)
2163 {
2164 tree t;
2165 size_t index;
2166 const size_t size = lto_tree_ref_encoder_size (encoder);
2167
2168 for (index = 0; index < size; index++)
2169 {
2170 t = lto_tree_ref_encoder_get_tree (encoder, index);
2171 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2172 stream_write_tree (ob, t, false);
2173 }
2174 }
2175
2176
2177 /* Write a sequence of indices into the globals vector corresponding
2178 to the trees in ENCODER. These are used by the reader to map the
2179 indices used to refer to global entities within function bodies to
2180 their referents. */
2181
2182 static void
2183 write_global_references (struct output_block *ob,
2184 struct lto_output_stream *ref_stream,
2185 struct lto_tree_ref_encoder *encoder)
2186 {
2187 tree t;
2188 uint32_t index;
2189 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2190
2191 /* Write size as 32-bit unsigned. */
2192 lto_output_data_stream (ref_stream, &size, sizeof (int32_t));
2193
2194 for (index = 0; index < size; index++)
2195 {
2196 uint32_t slot_num;
2197
2198 t = lto_tree_ref_encoder_get_tree (encoder, index);
2199 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2200 gcc_assert (slot_num != (unsigned)-1);
2201 lto_output_data_stream (ref_stream, &slot_num, sizeof slot_num);
2202 }
2203 }
2204
2205
2206 /* Write all the streams in an lto_out_decl_state STATE using
2207 output block OB and output stream OUT_STREAM. */
2208
2209 void
2210 lto_output_decl_state_streams (struct output_block *ob,
2211 struct lto_out_decl_state *state)
2212 {
2213 int i;
2214
2215 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2216 write_global_stream (ob, &state->streams[i]);
2217 }
2218
2219
2220 /* Write all the references in an lto_out_decl_state STATE using
2221 output block OB and output stream OUT_STREAM. */
2222
2223 void
2224 lto_output_decl_state_refs (struct output_block *ob,
2225 struct lto_output_stream *out_stream,
2226 struct lto_out_decl_state *state)
2227 {
2228 unsigned i;
2229 uint32_t ref;
2230 tree decl;
2231
2232 /* Write reference to FUNCTION_DECL. If there is not function,
2233 write reference to void_type_node. */
2234 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2235 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2236 gcc_assert (ref != (unsigned)-1);
2237 lto_output_data_stream (out_stream, &ref, sizeof (uint32_t));
2238
2239 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2240 write_global_references (ob, out_stream, &state->streams[i]);
2241 }
2242
2243
2244 /* Return the written size of STATE. */
2245
2246 static size_t
2247 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2248 {
2249 int i;
2250 size_t size;
2251
2252 size = sizeof (int32_t); /* fn_ref. */
2253 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2254 {
2255 size += sizeof (int32_t); /* vector size. */
2256 size += (lto_tree_ref_encoder_size (&state->streams[i])
2257 * sizeof (int32_t));
2258 }
2259 return size;
2260 }
2261
2262
2263 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2264 so far. */
2265
2266 static void
2267 write_symbol (struct streamer_tree_cache_d *cache,
2268 struct lto_output_stream *stream,
2269 tree t, struct pointer_set_t *seen, bool alias)
2270 {
2271 const char *name;
2272 enum gcc_plugin_symbol_kind kind;
2273 enum gcc_plugin_symbol_visibility visibility;
2274 unsigned slot_num;
2275 uint64_t size;
2276 const char *comdat;
2277 unsigned char c;
2278
2279 /* None of the following kinds of symbols are needed in the
2280 symbol table. */
2281 if (!TREE_PUBLIC (t)
2282 || is_builtin_fn (t)
2283 || DECL_ABSTRACT (t)
2284 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2285 return;
2286 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2287
2288 gcc_assert (TREE_CODE (t) == VAR_DECL
2289 || TREE_CODE (t) == FUNCTION_DECL);
2290
2291 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2292
2293 /* This behaves like assemble_name_raw in varasm.c, performing the
2294 same name manipulations that ASM_OUTPUT_LABELREF does. */
2295 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2296
2297 if (pointer_set_contains (seen, name))
2298 return;
2299 pointer_set_insert (seen, name);
2300
2301 streamer_tree_cache_lookup (cache, t, &slot_num);
2302 gcc_assert (slot_num != (unsigned)-1);
2303
2304 if (DECL_EXTERNAL (t))
2305 {
2306 if (DECL_WEAK (t))
2307 kind = GCCPK_WEAKUNDEF;
2308 else
2309 kind = GCCPK_UNDEF;
2310 }
2311 else
2312 {
2313 if (DECL_WEAK (t))
2314 kind = GCCPK_WEAKDEF;
2315 else if (DECL_COMMON (t))
2316 kind = GCCPK_COMMON;
2317 else
2318 kind = GCCPK_DEF;
2319
2320 /* When something is defined, it should have node attached. */
2321 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2322 || varpool_node::get (t)->definition);
2323 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2324 || (cgraph_node::get (t)
2325 && cgraph_node::get (t)->definition));
2326 }
2327
2328 /* Imitate what default_elf_asm_output_external do.
2329 When symbol is external, we need to output it with DEFAULT visibility
2330 when compiling with -fvisibility=default, while with HIDDEN visibility
2331 when symbol has attribute (visibility("hidden")) specified.
2332 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2333 right. */
2334
2335 if (DECL_EXTERNAL (t)
2336 && !targetm.binds_local_p (t))
2337 visibility = GCCPV_DEFAULT;
2338 else
2339 switch (DECL_VISIBILITY (t))
2340 {
2341 case VISIBILITY_DEFAULT:
2342 visibility = GCCPV_DEFAULT;
2343 break;
2344 case VISIBILITY_PROTECTED:
2345 visibility = GCCPV_PROTECTED;
2346 break;
2347 case VISIBILITY_HIDDEN:
2348 visibility = GCCPV_HIDDEN;
2349 break;
2350 case VISIBILITY_INTERNAL:
2351 visibility = GCCPV_INTERNAL;
2352 break;
2353 }
2354
2355 if (kind == GCCPK_COMMON
2356 && DECL_SIZE_UNIT (t)
2357 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2358 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2359 else
2360 size = 0;
2361
2362 if (DECL_ONE_ONLY (t))
2363 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2364 else
2365 comdat = "";
2366
2367 lto_output_data_stream (stream, name, strlen (name) + 1);
2368 lto_output_data_stream (stream, comdat, strlen (comdat) + 1);
2369 c = (unsigned char) kind;
2370 lto_output_data_stream (stream, &c, 1);
2371 c = (unsigned char) visibility;
2372 lto_output_data_stream (stream, &c, 1);
2373 lto_output_data_stream (stream, &size, 8);
2374 lto_output_data_stream (stream, &slot_num, 4);
2375 }
2376
2377 /* Return true if NODE should appear in the plugin symbol table. */
2378
2379 bool
2380 output_symbol_p (symtab_node *node)
2381 {
2382 struct cgraph_node *cnode;
2383 if (!node->real_symbol_p ())
2384 return false;
2385 /* We keep external functions in symtab for sake of inlining
2386 and devirtualization. We do not want to see them in symbol table as
2387 references unless they are really used. */
2388 cnode = dyn_cast <cgraph_node *> (node);
2389 if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
2390 && cnode->callers)
2391 return true;
2392
2393 /* Ignore all references from external vars initializers - they are not really
2394 part of the compilation unit until they are used by folding. Some symbols,
2395 like references to external construction vtables can not be referred to at all.
2396 We decide this at can_refer_decl_in_current_unit_p. */
2397 if (!node->definition || DECL_EXTERNAL (node->decl))
2398 {
2399 int i;
2400 struct ipa_ref *ref;
2401 for (i = 0; node->iterate_referring (i, ref); i++)
2402 {
2403 if (ref->use == IPA_REF_ALIAS)
2404 continue;
2405 if (is_a <cgraph_node *> (ref->referring))
2406 return true;
2407 if (!DECL_EXTERNAL (ref->referring->decl))
2408 return true;
2409 }
2410 return false;
2411 }
2412 return true;
2413 }
2414
2415
2416 /* Write an IL symbol table to OB.
2417 SET and VSET are cgraph/varpool node sets we are outputting. */
2418
2419 static void
2420 produce_symtab (struct output_block *ob)
2421 {
2422 struct streamer_tree_cache_d *cache = ob->writer_cache;
2423 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2424 struct pointer_set_t *seen;
2425 struct lto_output_stream stream;
2426 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2427 lto_symtab_encoder_iterator lsei;
2428
2429 lto_begin_section (section_name, false);
2430 free (section_name);
2431
2432 seen = pointer_set_create ();
2433 memset (&stream, 0, sizeof (stream));
2434
2435 /* Write the symbol table.
2436 First write everything defined and then all declarations.
2437 This is necessary to handle cases where we have duplicated symbols. */
2438 for (lsei = lsei_start (encoder);
2439 !lsei_end_p (lsei); lsei_next (&lsei))
2440 {
2441 symtab_node *node = lsei_node (lsei);
2442
2443 if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
2444 continue;
2445 write_symbol (cache, &stream, node->decl, seen, false);
2446 }
2447 for (lsei = lsei_start (encoder);
2448 !lsei_end_p (lsei); lsei_next (&lsei))
2449 {
2450 symtab_node *node = lsei_node (lsei);
2451
2452 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
2453 continue;
2454 write_symbol (cache, &stream, node->decl, seen, false);
2455 }
2456
2457 lto_write_stream (&stream);
2458 pointer_set_destroy (seen);
2459
2460 lto_end_section ();
2461 }
2462
2463
2464 /* This pass is run after all of the functions are serialized and all
2465 of the IPA passes have written their serialized forms. This pass
2466 causes the vector of all of the global decls and types used from
2467 this file to be written in to a section that can then be read in to
2468 recover these on other side. */
2469
2470 void
2471 produce_asm_for_decls (void)
2472 {
2473 struct lto_out_decl_state *out_state;
2474 struct lto_out_decl_state *fn_out_state;
2475 struct lto_decl_header header;
2476 char *section_name;
2477 struct output_block *ob;
2478 struct lto_output_stream *header_stream, *decl_state_stream;
2479 unsigned idx, num_fns;
2480 size_t decl_state_size;
2481 int32_t num_decl_states;
2482
2483 ob = create_output_block (LTO_section_decls);
2484 ob->global = true;
2485
2486 memset (&header, 0, sizeof (struct lto_decl_header));
2487
2488 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2489 lto_begin_section (section_name, !flag_wpa);
2490 free (section_name);
2491
2492 /* Make string 0 be a NULL string. */
2493 streamer_write_char_stream (ob->string_stream, 0);
2494
2495 gcc_assert (!alias_pairs);
2496
2497 /* Get rid of the global decl state hash tables to save some memory. */
2498 out_state = lto_get_out_decl_state ();
2499 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2500 if (out_state->streams[i].tree_hash_table)
2501 {
2502 delete out_state->streams[i].tree_hash_table;
2503 out_state->streams[i].tree_hash_table = NULL;
2504 }
2505
2506 /* Write the global symbols. */
2507 lto_output_decl_state_streams (ob, out_state);
2508 num_fns = lto_function_decl_states.length ();
2509 for (idx = 0; idx < num_fns; idx++)
2510 {
2511 fn_out_state =
2512 lto_function_decl_states[idx];
2513 lto_output_decl_state_streams (ob, fn_out_state);
2514 }
2515
2516 header.lto_header.major_version = LTO_major_version;
2517 header.lto_header.minor_version = LTO_minor_version;
2518
2519 /* Currently not used. This field would allow us to preallocate
2520 the globals vector, so that it need not be resized as it is extended. */
2521 header.num_nodes = -1;
2522
2523 /* Compute the total size of all decl out states. */
2524 decl_state_size = sizeof (int32_t);
2525 decl_state_size += lto_out_decl_state_written_size (out_state);
2526 for (idx = 0; idx < num_fns; idx++)
2527 {
2528 fn_out_state =
2529 lto_function_decl_states[idx];
2530 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2531 }
2532 header.decl_state_size = decl_state_size;
2533
2534 header.main_size = ob->main_stream->total_size;
2535 header.string_size = ob->string_stream->total_size;
2536
2537 header_stream = XCNEW (struct lto_output_stream);
2538 lto_output_data_stream (header_stream, &header, sizeof header);
2539 lto_write_stream (header_stream);
2540 free (header_stream);
2541
2542 /* Write the main out-decl state, followed by out-decl states of
2543 functions. */
2544 decl_state_stream = XCNEW (struct lto_output_stream);
2545 num_decl_states = num_fns + 1;
2546 lto_output_data_stream (decl_state_stream, &num_decl_states,
2547 sizeof (num_decl_states));
2548 lto_output_decl_state_refs (ob, decl_state_stream, out_state);
2549 for (idx = 0; idx < num_fns; idx++)
2550 {
2551 fn_out_state =
2552 lto_function_decl_states[idx];
2553 lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
2554 }
2555 lto_write_stream (decl_state_stream);
2556 free (decl_state_stream);
2557
2558 lto_write_stream (ob->main_stream);
2559 lto_write_stream (ob->string_stream);
2560
2561 lto_end_section ();
2562
2563 /* Write the symbol table. It is used by linker to determine dependencies
2564 and thus we can skip it for WPA. */
2565 if (!flag_wpa)
2566 produce_symtab (ob);
2567
2568 /* Write command line opts. */
2569 lto_write_options ();
2570
2571 /* Deallocate memory and clean up. */
2572 for (idx = 0; idx < num_fns; idx++)
2573 {
2574 fn_out_state =
2575 lto_function_decl_states[idx];
2576 lto_delete_out_decl_state (fn_out_state);
2577 }
2578 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2579 lto_function_decl_states.release ();
2580 destroy_output_block (ob);
2581 }