Fix a bug that broke -freorder-functions
[official-gcc.git] / gcc / lto-streamer-out.c
blob6345d83d2c999f5a98c2b9211f95007840bc887c
1 /* Write the GIMPLE representation to a file stream.
3 Copyright 2009, 2010 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 "tm.h"
27 #include "tree.h"
28 #include "expr.h"
29 #include "flags.h"
30 #include "params.h"
31 #include "input.h"
32 #include "hashtab.h"
33 #include "basic-block.h"
34 #include "tree-flow.h"
35 #include "tree-pass.h"
36 #include "cgraph.h"
37 #include "function.h"
38 #include "ggc.h"
39 #include "diagnostic-core.h"
40 #include "except.h"
41 #include "vec.h"
42 #include "lto-symtab.h"
43 #include "lto-streamer.h"
46 struct string_slot
48 const char *s;
49 int len;
50 unsigned int slot_num;
54 /* Returns a hash code for P.
55 Shamelessly stollen from libiberty. */
57 static hashval_t
58 hash_string_slot_node (const void *p)
60 const struct string_slot *ds = (const struct string_slot *) p;
61 hashval_t r = ds->len;
62 int i;
64 for (i = 0; i < ds->len; i++)
65 r = r * 67 + (unsigned)ds->s[i] - 113;
66 return r;
70 /* Returns nonzero if P1 and P2 are equal. */
72 static int
73 eq_string_slot_node (const void *p1, const void *p2)
75 const struct string_slot *ds1 = (const struct string_slot *) p1;
76 const struct string_slot *ds2 = (const struct string_slot *) p2;
78 if (ds1->len == ds2->len)
79 return memcmp (ds1->s, ds2->s, ds1->len) == 0;
81 return 0;
85 /* Clear the line info stored in DATA_IN. */
87 static void
88 clear_line_info (struct output_block *ob)
90 ob->current_file = NULL;
91 ob->current_line = 0;
92 ob->current_col = 0;
96 /* Create the output block and return it. SECTION_TYPE is
97 LTO_section_function_body or LTO_static_initializer. */
99 struct output_block *
100 create_output_block (enum lto_section_type section_type)
102 struct output_block *ob = XCNEW (struct output_block);
104 ob->section_type = section_type;
105 ob->decl_state = lto_get_out_decl_state ();
106 ob->main_stream = XCNEW (struct lto_output_stream);
107 ob->string_stream = XCNEW (struct lto_output_stream);
108 ob->writer_cache = lto_streamer_cache_create ();
110 if (section_type == LTO_section_function_body)
111 ob->cfg_stream = XCNEW (struct lto_output_stream);
113 clear_line_info (ob);
115 ob->string_hash_table = htab_create (37, hash_string_slot_node,
116 eq_string_slot_node, NULL);
117 gcc_obstack_init (&ob->obstack);
119 return ob;
123 /* Destroy the output block OB. */
125 void
126 destroy_output_block (struct output_block *ob)
128 enum lto_section_type section_type = ob->section_type;
130 htab_delete (ob->string_hash_table);
132 free (ob->main_stream);
133 free (ob->string_stream);
134 if (section_type == LTO_section_function_body)
135 free (ob->cfg_stream);
137 lto_streamer_cache_delete (ob->writer_cache);
138 obstack_free (&ob->obstack, NULL);
140 free (ob);
143 /* Return index used to reference STRING of LEN characters in the string table
144 in OB. The string might or might not include a trailing '\0'.
145 Then put the index onto the INDEX_STREAM.
146 When PERSISTENT is set, the string S is supposed to not change during
147 duration of the OB and thus OB can keep pointer into it. */
149 static unsigned
150 lto_string_index (struct output_block *ob,
151 const char *s,
152 unsigned int len,
153 bool persistent)
155 struct string_slot **slot;
156 struct string_slot s_slot;
158 s_slot.s = s;
159 s_slot.len = len;
160 s_slot.slot_num = 0;
162 slot = (struct string_slot **) htab_find_slot (ob->string_hash_table,
163 &s_slot, INSERT);
164 if (*slot == NULL)
166 struct lto_output_stream *string_stream = ob->string_stream;
167 unsigned int start = string_stream->total_size;
168 struct string_slot *new_slot
169 = XOBNEW (&ob->obstack, struct string_slot);
170 const char *string;
172 if (!persistent)
174 char *tmp;
175 string = tmp = XOBNEWVEC (&ob->obstack, char, len);
176 memcpy (tmp, s, len);
178 else
179 string = s;
181 new_slot->s = string;
182 new_slot->len = len;
183 new_slot->slot_num = start;
184 *slot = new_slot;
185 lto_output_uleb128_stream (string_stream, len);
186 lto_output_data_stream (string_stream, string, len);
187 return start + 1;
189 else
191 struct string_slot *old_slot = *slot;
192 return old_slot->slot_num + 1;
197 /* Output STRING of LEN characters to the string
198 table in OB. The string might or might not include a trailing '\0'.
199 Then put the index onto the INDEX_STREAM.
200 When PERSISTENT is set, the string S is supposed to not change during
201 duration of the OB and thus OB can keep pointer into it. */
203 static void
204 lto_output_string_with_length (struct output_block *ob,
205 struct lto_output_stream *index_stream,
206 const char *s,
207 unsigned int len,
208 bool persistent)
210 if (s)
211 lto_output_uleb128_stream (index_stream,
212 lto_string_index (ob, s, len, persistent));
213 else
214 lto_output_1_stream (index_stream, 0);
217 /* Output the '\0' terminated STRING to the string
218 table in OB. Then put the index onto the INDEX_STREAM.
219 When PERSISTENT is set, the string S is supposed to not change during
220 duration of the OB and thus OB can keep pointer into it. */
222 static void
223 lto_output_string (struct output_block *ob,
224 struct lto_output_stream *index_stream,
225 const char *string,
226 bool persistent)
228 if (string)
229 lto_output_string_with_length (ob, index_stream, string,
230 strlen (string) + 1,
231 persistent);
232 else
233 lto_output_1_stream (index_stream, 0);
237 /* Output the STRING constant to the string
238 table in OB. Then put the index onto the INDEX_STREAM. */
240 static void
241 output_string_cst (struct output_block *ob,
242 struct lto_output_stream *index_stream,
243 tree string)
245 lto_output_string_with_length (ob, index_stream,
246 TREE_STRING_POINTER (string),
247 TREE_STRING_LENGTH (string),
248 true);
252 /* Output the identifier ID to the string
253 table in OB. Then put the index onto the INDEX_STREAM. */
255 static void
256 output_identifier (struct output_block *ob,
257 struct lto_output_stream *index_stream,
258 tree id)
260 lto_output_string_with_length (ob, index_stream,
261 IDENTIFIER_POINTER (id),
262 IDENTIFIER_LENGTH (id),
263 true);
267 /* Write a zero to the output stream. */
269 static void
270 output_zero (struct output_block *ob)
272 lto_output_1_stream (ob->main_stream, 0);
276 /* Output an unsigned LEB128 quantity to OB->main_stream. */
278 static void
279 output_uleb128 (struct output_block *ob, unsigned HOST_WIDE_INT work)
281 lto_output_uleb128_stream (ob->main_stream, work);
285 /* Output a signed LEB128 quantity to OB->main_stream. */
287 static void
288 output_sleb128 (struct output_block *ob, HOST_WIDE_INT work)
290 lto_output_sleb128_stream (ob->main_stream, work);
294 /* Output the start of a record with TAG to output block OB. */
296 static inline void
297 output_record_start (struct output_block *ob, enum LTO_tags tag)
299 lto_output_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS, tag);
303 /* Look up NODE in the type table and write the index for it to OB. */
305 static void
306 output_type_ref (struct output_block *ob, tree node)
308 output_record_start (ob, LTO_type_ref);
309 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
313 /* Pack all the non-pointer fields of the TS_BASE structure of
314 expression EXPR into bitpack BP. */
316 static void
317 pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
319 bp_pack_value (bp, TREE_CODE (expr), 16);
320 if (!TYPE_P (expr))
322 bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
323 bp_pack_value (bp, TREE_CONSTANT (expr), 1);
324 bp_pack_value (bp, TREE_READONLY (expr), 1);
326 /* TREE_PUBLIC is used on types to indicate that the type
327 has a TYPE_CACHED_VALUES vector. This is not streamed out,
328 so we skip it here. */
329 bp_pack_value (bp, TREE_PUBLIC (expr), 1);
331 else
332 bp_pack_value (bp, 0, 4);
333 bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
334 bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
335 if (DECL_P (expr))
336 bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
337 else if (TYPE_P (expr))
338 bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
339 else
340 bp_pack_value (bp, 0, 1);
341 /* We write debug info two times, do not confuse the second one. */
342 bp_pack_value (bp, TYPE_P (expr) ? 0 : TREE_ASM_WRITTEN (expr), 1);
343 if (TYPE_P (expr))
344 bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
345 else
346 bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
347 bp_pack_value (bp, TREE_USED (expr), 1);
348 bp_pack_value (bp, TREE_NOTHROW (expr), 1);
349 bp_pack_value (bp, TREE_STATIC (expr), 1);
350 bp_pack_value (bp, TREE_PRIVATE (expr), 1);
351 bp_pack_value (bp, TREE_PROTECTED (expr), 1);
352 bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
353 if (TYPE_P (expr))
354 bp_pack_value (bp, TYPE_SATURATING (expr), 1);
355 else if (TREE_CODE (expr) == SSA_NAME)
356 bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
357 else
358 bp_pack_value (bp, 0, 1);
362 /* Pack all the non-pointer fields of the TS_REAL_CST structure of
363 expression EXPR into bitpack BP. */
365 static void
366 pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
368 unsigned i;
369 REAL_VALUE_TYPE r;
371 r = TREE_REAL_CST (expr);
372 bp_pack_value (bp, r.cl, 2);
373 bp_pack_value (bp, r.decimal, 1);
374 bp_pack_value (bp, r.sign, 1);
375 bp_pack_value (bp, r.signalling, 1);
376 bp_pack_value (bp, r.canonical, 1);
377 bp_pack_value (bp, r.uexp, EXP_BITS);
378 for (i = 0; i < SIGSZ; i++)
379 bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
383 /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
384 expression EXPR into bitpack BP. */
386 static void
387 pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
389 struct fixed_value fv = TREE_FIXED_CST (expr);
390 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, fv.mode);
391 bp_pack_var_len_int (bp, fv.data.low);
392 bp_pack_var_len_int (bp, fv.data.high);
396 /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
397 of expression EXPR into bitpack BP. */
399 static void
400 pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
402 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, DECL_MODE (expr));
403 bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
404 bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
405 bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
406 bp_pack_value (bp, DECL_ABSTRACT (expr), 1);
407 bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
408 bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
409 bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
410 bp_pack_value (bp, DECL_DEBUG_EXPR_IS_FROM (expr), 1);
411 bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
412 bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
413 bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
415 if (TREE_CODE (expr) == LABEL_DECL)
417 /* Note that we do not write LABEL_DECL_UID. The reader will
418 always assume an initial value of -1 so that the
419 label_to_block_map is recreated by gimple_set_bb. */
420 bp_pack_value (bp, DECL_ERROR_ISSUED (expr), 1);
421 bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
424 if (TREE_CODE (expr) == FIELD_DECL)
426 bp_pack_value (bp, DECL_PACKED (expr), 1);
427 bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
428 bp_pack_value (bp, expr->decl_common.off_align, 8);
431 if (TREE_CODE (expr) == RESULT_DECL
432 || TREE_CODE (expr) == PARM_DECL
433 || TREE_CODE (expr) == VAR_DECL)
435 bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
436 if (TREE_CODE (expr) == VAR_DECL
437 || TREE_CODE (expr) == PARM_DECL)
438 bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
439 bp_pack_value (bp, DECL_RESTRICTED_P (expr), 1);
444 /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
445 of expression EXPR into bitpack BP. */
447 static void
448 pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
450 bp_pack_value (bp, DECL_REGISTER (expr), 1);
454 /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
455 of expression EXPR into bitpack BP. */
457 static void
458 pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
460 bp_pack_value (bp, DECL_DEFER_OUTPUT (expr), 1);
461 bp_pack_value (bp, DECL_COMMON (expr), 1);
462 bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
463 bp_pack_value (bp, DECL_WEAK (expr), 1);
464 bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1);
465 bp_pack_value (bp, DECL_COMDAT (expr), 1);
466 bp_pack_value (bp, DECL_VISIBILITY (expr), 2);
467 bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1);
469 if (TREE_CODE (expr) == VAR_DECL)
471 bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
472 bp_pack_value (bp, DECL_IN_TEXT_SECTION (expr), 1);
473 bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
474 bp_pack_value (bp, DECL_TLS_MODEL (expr), 3);
477 if (VAR_OR_FUNCTION_DECL_P (expr))
478 bp_pack_var_len_unsigned (bp, DECL_INIT_PRIORITY (expr));
482 /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
483 of expression EXPR into bitpack BP. */
485 static void
486 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
488 /* For normal/md builtins we only write the class and code, so they
489 should never be handled here. */
490 gcc_assert (!lto_stream_as_builtin_p (expr));
492 bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
493 DECL_BUILT_IN_CLASS (expr));
494 bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
495 bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
496 bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
497 bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
498 bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
499 bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
500 bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
501 bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
502 bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
503 bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
504 bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
505 bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
506 bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
507 bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
508 bp_pack_value (bp, DECL_PURE_P (expr), 1);
509 bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
510 if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
511 bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 11);
512 if (DECL_STATIC_DESTRUCTOR (expr))
513 bp_pack_var_len_unsigned (bp, DECL_FINI_PRIORITY (expr));
517 /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
518 of expression EXPR into bitpack BP. */
520 static void
521 pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
523 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, TYPE_MODE (expr));
524 bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
525 bp_pack_value (bp, TYPE_NO_FORCE_BLK (expr), 1);
526 bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
527 if (RECORD_OR_UNION_TYPE_P (expr))
528 bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
529 bp_pack_value (bp, TYPE_PACKED (expr), 1);
530 bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
531 bp_pack_value (bp, TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr), 2);
532 bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
533 bp_pack_value (bp, TYPE_READONLY (expr), 1);
534 bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
535 bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
536 bp_pack_var_len_int (bp, TYPE_ALIAS_SET (expr) == 0 ? 0 : -1);
540 /* Pack all the non-pointer fields of the TS_BLOCK structure
541 of expression EXPR into bitpack BP. */
543 static void
544 pack_ts_block_value_fields (struct bitpack_d *bp, tree expr)
546 bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
547 /* BLOCK_NUMBER is recomputed. */
550 /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
551 of expression EXPR into bitpack BP. */
553 static void
554 pack_ts_translation_unit_decl_value_fields (struct bitpack_d *bp ATTRIBUTE_UNUSED, tree expr ATTRIBUTE_UNUSED)
558 /* Pack all the non-pointer fields in EXPR into a bit pack. */
560 static void
561 pack_value_fields (struct bitpack_d *bp, tree expr)
563 enum tree_code code;
565 code = TREE_CODE (expr);
567 /* Note that all these functions are highly sensitive to changes in
568 the types and sizes of each of the fields being packed. */
569 pack_ts_base_value_fields (bp, expr);
571 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
572 pack_ts_real_cst_value_fields (bp, expr);
574 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
575 pack_ts_fixed_cst_value_fields (bp, expr);
577 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
578 pack_ts_decl_common_value_fields (bp, expr);
580 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
581 pack_ts_decl_wrtl_value_fields (bp, expr);
583 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
584 pack_ts_decl_with_vis_value_fields (bp, expr);
586 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
587 pack_ts_function_decl_value_fields (bp, expr);
589 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
590 pack_ts_type_common_value_fields (bp, expr);
592 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
593 pack_ts_block_value_fields (bp, expr);
595 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
596 pack_ts_translation_unit_decl_value_fields (bp, expr);
598 if (streamer_hooks.pack_value_fields)
599 streamer_hooks.pack_value_fields (bp, expr);
603 /* Output info about new location into bitpack BP.
604 After outputting bitpack, lto_output_location_data has
605 to be done to output actual data. */
607 static inline void
608 lto_output_location_bitpack (struct bitpack_d *bp,
609 struct output_block *ob,
610 location_t loc)
612 expanded_location xloc;
614 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
615 if (loc == UNKNOWN_LOCATION)
616 return;
618 xloc = expand_location (loc);
620 bp_pack_value (bp, ob->current_file != xloc.file, 1);
621 if (ob->current_file != xloc.file)
622 bp_pack_var_len_unsigned (bp, lto_string_index (ob,
623 xloc.file,
624 strlen (xloc.file) + 1,
625 true));
626 ob->current_file = xloc.file;
628 bp_pack_value (bp, ob->current_line != xloc.line, 1);
629 if (ob->current_line != xloc.line)
630 bp_pack_var_len_unsigned (bp, xloc.line);
631 ob->current_line = xloc.line;
633 bp_pack_value (bp, ob->current_col != xloc.column, 1);
634 if (ob->current_col != xloc.column)
635 bp_pack_var_len_unsigned (bp, xloc.column);
636 ob->current_col = xloc.column;
640 /* Emit location LOC to output block OB.
641 When bitpack is handy, it is more space effecient to call
642 lto_output_location_bitpack with existing bitpack. */
644 static void
645 lto_output_location (struct output_block *ob, location_t loc)
647 struct bitpack_d bp = bitpack_create (ob->main_stream);
648 lto_output_location_bitpack (&bp, ob, loc);
649 lto_output_bitpack (&bp);
653 /* Return true if tree node T is written to various tables. For these
654 nodes, we sometimes want to write their phyiscal representation
655 (via lto_output_tree), and sometimes we need to emit an index
656 reference into a table (via lto_output_tree_ref). */
658 static bool
659 tree_is_indexable (tree t)
661 if (TREE_CODE (t) == PARM_DECL)
662 return false;
663 else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t)
664 && !TREE_STATIC (t))
665 return false;
666 else
667 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
671 /* If EXPR is an indexable tree node, output a reference to it to
672 output block OB. Otherwise, output the physical representation of
673 EXPR to OB. */
675 static void
676 lto_output_tree_ref (struct output_block *ob, tree expr)
678 enum tree_code code;
680 if (expr == NULL_TREE)
682 output_record_start (ob, LTO_null);
683 return;
686 if (!tree_is_indexable (expr))
688 /* Even though we are emitting the physical representation of
689 EXPR, its leaves must be emitted as references. */
690 lto_output_tree (ob, expr, true);
691 return;
694 if (TYPE_P (expr))
696 output_type_ref (ob, expr);
697 return;
700 code = TREE_CODE (expr);
701 switch (code)
703 case SSA_NAME:
704 output_record_start (ob, LTO_ssa_name_ref);
705 output_uleb128 (ob, SSA_NAME_VERSION (expr));
706 break;
708 case FIELD_DECL:
709 output_record_start (ob, LTO_field_decl_ref);
710 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
711 break;
713 case FUNCTION_DECL:
714 output_record_start (ob, LTO_function_decl_ref);
715 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
716 break;
718 case VAR_DECL:
719 case DEBUG_EXPR_DECL:
720 gcc_assert (decl_function_context (expr) == NULL
721 || TREE_STATIC (expr));
722 output_record_start (ob, LTO_global_decl_ref);
723 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
724 break;
726 case CONST_DECL:
727 output_record_start (ob, LTO_const_decl_ref);
728 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
729 break;
731 case IMPORTED_DECL:
732 gcc_assert (decl_function_context (expr) == NULL);
733 output_record_start (ob, LTO_imported_decl_ref);
734 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
735 break;
737 case TYPE_DECL:
738 output_record_start (ob, LTO_type_decl_ref);
739 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
740 break;
742 case NAMESPACE_DECL:
743 output_record_start (ob, LTO_namespace_decl_ref);
744 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
745 break;
747 case LABEL_DECL:
748 output_record_start (ob, LTO_label_decl_ref);
749 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
750 break;
752 case RESULT_DECL:
753 output_record_start (ob, LTO_result_decl_ref);
754 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
755 break;
757 case TRANSLATION_UNIT_DECL:
758 output_record_start (ob, LTO_translation_unit_decl_ref);
759 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
760 break;
762 default:
764 /* See if the streamer allows this node to be indexable
765 like other global declarations. */
766 if (streamer_hooks.indexable_with_decls_p
767 && streamer_hooks.indexable_with_decls_p (expr))
769 output_record_start (ob, LTO_global_decl_ref);
770 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
772 else
774 /* No other node is indexable, so it should have been
775 handled by lto_output_tree. */
776 gcc_unreachable ();
783 /* If REF_P is true, emit a reference to EXPR in output block OB,
784 otherwise emit the physical representation of EXPR in OB. */
786 static inline void
787 lto_output_tree_or_ref (struct output_block *ob, tree expr, bool ref_p)
789 if (ref_p)
790 lto_output_tree_ref (ob, expr);
791 else
792 lto_output_tree (ob, expr, false);
796 /* Emit the chain of tree nodes starting at T. OB is the output block
797 to write to. REF_P is true if chain elements should be emitted
798 as references. */
800 static void
801 lto_output_chain (struct output_block *ob, tree t, bool ref_p)
803 int i, count;
805 count = list_length (t);
806 output_sleb128 (ob, count);
807 for (i = 0; i < count; i++)
809 tree saved_chain;
811 /* Clear TREE_CHAIN to avoid blindly recursing into the rest
812 of the list. */
813 saved_chain = TREE_CHAIN (t);
814 TREE_CHAIN (t) = NULL_TREE;
816 lto_output_tree_or_ref (ob, t, ref_p);
818 TREE_CHAIN (t) = saved_chain;
819 t = TREE_CHAIN (t);
824 /* Write all pointer fields in the TS_COMMON structure of EXPR to output
825 block OB. If REF_P is true, write a reference to EXPR's pointer
826 fields. */
828 static void
829 lto_output_ts_common_tree_pointers (struct output_block *ob, tree expr,
830 bool ref_p)
832 if (TREE_CODE (expr) != IDENTIFIER_NODE)
833 lto_output_tree_or_ref (ob, TREE_TYPE (expr), ref_p);
837 /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
838 block OB. If REF_P is true, write a reference to EXPR's pointer
839 fields. */
841 static void
842 lto_output_ts_vector_tree_pointers (struct output_block *ob, tree expr,
843 bool ref_p)
845 lto_output_chain (ob, TREE_VECTOR_CST_ELTS (expr), ref_p);
849 /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
850 block OB. If REF_P is true, write a reference to EXPR's pointer
851 fields. */
853 static void
854 lto_output_ts_complex_tree_pointers (struct output_block *ob, tree expr,
855 bool ref_p)
857 lto_output_tree_or_ref (ob, TREE_REALPART (expr), ref_p);
858 lto_output_tree_or_ref (ob, TREE_IMAGPART (expr), ref_p);
862 /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
863 to output block OB. If REF_P is true, write a reference to EXPR's
864 pointer fields. */
866 static void
867 lto_output_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
868 bool ref_p)
870 lto_output_tree_or_ref (ob, DECL_NAME (expr), ref_p);
871 lto_output_tree_or_ref (ob, DECL_CONTEXT (expr), ref_p);
872 lto_output_location (ob, DECL_SOURCE_LOCATION (expr));
876 /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
877 output block OB. If REF_P is true, write a reference to EXPR's
878 pointer fields. */
880 static void
881 lto_output_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
882 bool ref_p)
884 lto_output_tree_or_ref (ob, DECL_SIZE (expr), ref_p);
885 lto_output_tree_or_ref (ob, DECL_SIZE_UNIT (expr), ref_p);
887 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
888 special handling in LTO, it must be handled by streamer hooks. */
890 lto_output_tree_or_ref (ob, DECL_ATTRIBUTES (expr), ref_p);
892 /* Do not stream DECL_ABSTRACT_ORIGIN. We cannot handle debug information
893 for early inlining so drop it on the floor instead of ICEing in
894 dwarf2out.c. */
896 if (TREE_CODE (expr) == PARM_DECL)
897 lto_output_chain (ob, TREE_CHAIN (expr), ref_p);
899 if ((TREE_CODE (expr) == VAR_DECL
900 || TREE_CODE (expr) == PARM_DECL)
901 && DECL_HAS_VALUE_EXPR_P (expr))
902 lto_output_tree_or_ref (ob, DECL_VALUE_EXPR (expr), ref_p);
904 if (TREE_CODE (expr) == VAR_DECL)
905 lto_output_tree_or_ref (ob, DECL_DEBUG_EXPR (expr), ref_p);
909 /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
910 EXPR to output block OB. If REF_P is true, write a reference to EXPR's
911 pointer fields. */
913 static void
914 lto_output_ts_decl_non_common_tree_pointers (struct output_block *ob,
915 tree expr, bool ref_p)
917 if (TREE_CODE (expr) == FUNCTION_DECL)
919 lto_output_tree_or_ref (ob, DECL_ARGUMENTS (expr), ref_p);
920 lto_output_tree_or_ref (ob, DECL_RESULT (expr), ref_p);
922 lto_output_tree_or_ref (ob, DECL_VINDEX (expr), ref_p);
926 /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
927 to output block OB. If REF_P is true, write a reference to EXPR's
928 pointer fields. */
930 static void
931 lto_output_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
932 bool ref_p)
934 /* Make sure we don't inadvertently set the assembler name. */
935 if (DECL_ASSEMBLER_NAME_SET_P (expr))
936 lto_output_tree_or_ref (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
937 else
938 output_record_start (ob, LTO_null);
940 lto_output_tree_or_ref (ob, DECL_SECTION_NAME (expr), ref_p);
941 lto_output_tree_or_ref (ob, DECL_COMDAT_GROUP (expr), ref_p);
945 /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
946 output block OB. If REF_P is true, write a reference to EXPR's
947 pointer fields. */
949 static void
950 lto_output_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
951 bool ref_p)
953 lto_output_tree_or_ref (ob, DECL_FIELD_OFFSET (expr), ref_p);
954 lto_output_tree_or_ref (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
955 lto_output_tree_or_ref (ob, DECL_QUALIFIER (expr), ref_p);
956 lto_output_tree_or_ref (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
957 lto_output_tree_or_ref (ob, DECL_FCONTEXT (expr), ref_p);
958 lto_output_chain (ob, TREE_CHAIN (expr), ref_p);
962 /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
963 to output block OB. If REF_P is true, write a reference to EXPR's
964 pointer fields. */
966 static void
967 lto_output_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
968 bool ref_p)
970 /* DECL_STRUCT_FUNCTION is handled by lto_output_function. FIXME lto,
971 maybe it should be handled here? */
972 lto_output_tree_or_ref (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
973 lto_output_tree_or_ref (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
974 lto_output_tree_or_ref (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr),
975 ref_p);
979 /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
980 output block OB. If REF_P is true, write a reference to EXPR's
981 pointer fields. */
983 static void
984 lto_output_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
985 bool ref_p)
987 lto_output_tree_or_ref (ob, TYPE_SIZE (expr), ref_p);
988 lto_output_tree_or_ref (ob, TYPE_SIZE_UNIT (expr), ref_p);
989 lto_output_tree_or_ref (ob, TYPE_ATTRIBUTES (expr), ref_p);
990 lto_output_tree_or_ref (ob, TYPE_NAME (expr), ref_p);
991 /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
992 reconstructed during fixup. */
993 /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
994 during fixup. */
995 lto_output_tree_or_ref (ob, TYPE_MAIN_VARIANT (expr), ref_p);
996 lto_output_tree_or_ref (ob, TYPE_CONTEXT (expr), ref_p);
997 /* TYPE_CANONICAL is re-computed during type merging, so no need
998 to stream it here. */
999 lto_output_tree_or_ref (ob, TYPE_STUB_DECL (expr), ref_p);
1002 /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
1003 to output block OB. If REF_P is true, write a reference to EXPR's
1004 pointer fields. */
1006 static void
1007 lto_output_ts_type_non_common_tree_pointers (struct output_block *ob,
1008 tree expr, bool ref_p)
1010 if (TREE_CODE (expr) == ENUMERAL_TYPE)
1011 lto_output_tree_or_ref (ob, TYPE_VALUES (expr), ref_p);
1012 else if (TREE_CODE (expr) == ARRAY_TYPE)
1013 lto_output_tree_or_ref (ob, TYPE_DOMAIN (expr), ref_p);
1014 else if (RECORD_OR_UNION_TYPE_P (expr))
1015 lto_output_tree_or_ref (ob, TYPE_FIELDS (expr), ref_p);
1016 else if (TREE_CODE (expr) == FUNCTION_TYPE
1017 || TREE_CODE (expr) == METHOD_TYPE)
1018 lto_output_tree_or_ref (ob, TYPE_ARG_TYPES (expr), ref_p);
1020 if (!POINTER_TYPE_P (expr))
1021 lto_output_tree_or_ref (ob, TYPE_MINVAL (expr), ref_p);
1022 lto_output_tree_or_ref (ob, TYPE_MAXVAL (expr), ref_p);
1023 if (RECORD_OR_UNION_TYPE_P (expr))
1024 lto_output_tree_or_ref (ob, TYPE_BINFO (expr), ref_p);
1028 /* Write all pointer fields in the TS_LIST structure of EXPR to output
1029 block OB. If REF_P is true, write a reference to EXPR's pointer
1030 fields. */
1032 static void
1033 lto_output_ts_list_tree_pointers (struct output_block *ob, tree expr,
1034 bool ref_p)
1036 lto_output_tree_or_ref (ob, TREE_PURPOSE (expr), ref_p);
1037 lto_output_tree_or_ref (ob, TREE_VALUE (expr), ref_p);
1038 lto_output_chain (ob, TREE_CHAIN (expr), ref_p);
1042 /* Write all pointer fields in the TS_VEC structure of EXPR to output
1043 block OB. If REF_P is true, write a reference to EXPR's pointer
1044 fields. */
1046 static void
1047 lto_output_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
1049 int i;
1051 /* Note that the number of slots for EXPR has already been emitted
1052 in EXPR's header (see lto_output_tree_header). */
1053 for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
1054 lto_output_tree_or_ref (ob, TREE_VEC_ELT (expr, i), ref_p);
1058 /* Write all pointer fields in the TS_EXP structure of EXPR to output
1059 block OB. If REF_P is true, write a reference to EXPR's pointer
1060 fields. */
1062 static void
1063 lto_output_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
1065 int i;
1067 output_sleb128 (ob, TREE_OPERAND_LENGTH (expr));
1068 for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
1069 lto_output_tree_or_ref (ob, TREE_OPERAND (expr, i), ref_p);
1070 lto_output_location (ob, EXPR_LOCATION (expr));
1071 lto_output_tree_or_ref (ob, TREE_BLOCK (expr), ref_p);
1075 /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
1076 block OB. If REF_P is true, write a reference to EXPR's pointer
1077 fields. */
1079 static void
1080 lto_output_ts_block_tree_pointers (struct output_block *ob, tree expr,
1081 bool ref_p)
1083 /* Do not stream BLOCK_SOURCE_LOCATION. We cannot handle debug information
1084 for early inlining so drop it on the floor instead of ICEing in
1085 dwarf2out.c. */
1086 lto_output_chain (ob, BLOCK_VARS (expr), ref_p);
1088 /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
1089 for early inlining so drop it on the floor instead of ICEing in
1090 dwarf2out.c. */
1092 lto_output_tree_or_ref (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
1093 /* Do not stream BLOCK_ABSTRACT_ORIGIN. We cannot handle debug information
1094 for early inlining so drop it on the floor instead of ICEing in
1095 dwarf2out.c. */
1096 lto_output_tree_or_ref (ob, BLOCK_FRAGMENT_ORIGIN (expr), ref_p);
1097 lto_output_tree_or_ref (ob, BLOCK_FRAGMENT_CHAIN (expr), ref_p);
1098 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
1099 list is re-constructed from BLOCK_SUPERCONTEXT. */
1103 /* Write all pointer fields in the TS_BINFO structure of EXPR to output
1104 block OB. If REF_P is true, write a reference to EXPR's pointer
1105 fields. */
1107 static void
1108 lto_output_ts_binfo_tree_pointers (struct output_block *ob, tree expr,
1109 bool ref_p)
1111 unsigned i;
1112 tree t;
1114 /* Note that the number of BINFO slots has already been emitted in
1115 EXPR's header (see lto_output_tree_header) because this length
1116 is needed to build the empty BINFO node on the reader side. */
1117 FOR_EACH_VEC_ELT (tree, BINFO_BASE_BINFOS (expr), i, t)
1118 lto_output_tree_or_ref (ob, t, ref_p);
1119 output_record_start (ob, LTO_null);
1121 lto_output_tree_or_ref (ob, BINFO_OFFSET (expr), ref_p);
1122 lto_output_tree_or_ref (ob, BINFO_VTABLE (expr), ref_p);
1123 /* BINFO_VIRTUALS is used to drive type based devirtualizatoin. It often links
1124 together large portions of programs making it harder to partition. Becuase
1125 devirtualization is interesting before inlining, only, there is no real
1126 need to ship it into ltrans partition. */
1127 lto_output_tree_or_ref (ob, flag_wpa ? NULL : BINFO_VIRTUALS (expr), ref_p);
1128 lto_output_tree_or_ref (ob, BINFO_VPTR_FIELD (expr), ref_p);
1130 output_uleb128 (ob, VEC_length (tree, BINFO_BASE_ACCESSES (expr)));
1131 FOR_EACH_VEC_ELT (tree, BINFO_BASE_ACCESSES (expr), i, t)
1132 lto_output_tree_or_ref (ob, t, ref_p);
1134 lto_output_tree_or_ref (ob, BINFO_INHERITANCE_CHAIN (expr), ref_p);
1135 lto_output_tree_or_ref (ob, BINFO_SUBVTT_INDEX (expr), ref_p);
1136 lto_output_tree_or_ref (ob, BINFO_VPTR_INDEX (expr), ref_p);
1140 /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
1141 output block OB. If REF_P is true, write a reference to EXPR's
1142 pointer fields. */
1144 static void
1145 lto_output_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
1146 bool ref_p)
1148 unsigned i;
1149 tree index, value;
1151 output_uleb128 (ob, CONSTRUCTOR_NELTS (expr));
1152 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
1154 lto_output_tree_or_ref (ob, index, ref_p);
1155 lto_output_tree_or_ref (ob, value, ref_p);
1159 /* Write a TS_TARGET_OPTION tree in EXPR to OB. */
1161 static void
1162 lto_output_ts_target_option (struct output_block *ob, tree expr)
1164 struct cl_target_option *t = TREE_TARGET_OPTION (expr);
1165 struct bitpack_d bp;
1166 unsigned i, len;
1168 /* The cl_target_option is target specific and generated by the options
1169 awk script, so we just recreate a byte-by-byte copy here. */
1171 bp = bitpack_create (ob->main_stream);
1172 len = sizeof (struct cl_target_option);
1173 for (i = 0; i < len; i++)
1174 bp_pack_value (&bp, ((unsigned char *)t)[i], 8);
1175 /* Catch struct size mismatches between reader and writer. */
1176 bp_pack_value (&bp, 0x12345678, 32);
1177 lto_output_bitpack (&bp);
1180 /* Write a TS_TRANSLATION_UNIT_DECL tree in EXPR to OB. */
1182 static void
1183 lto_output_ts_translation_unit_decl_tree_pointers (struct output_block *ob,
1184 tree expr)
1186 lto_output_string (ob, ob->main_stream,
1187 TRANSLATION_UNIT_LANGUAGE (expr), true);
1190 /* Helper for lto_output_tree. Write all pointer fields in EXPR to output
1191 block OB. If REF_P is true, the leaves of EXPR are emitted as
1192 references. */
1194 static void
1195 lto_output_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
1197 enum tree_code code;
1199 code = TREE_CODE (expr);
1201 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
1202 lto_output_ts_common_tree_pointers (ob, expr, ref_p);
1204 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1205 lto_output_ts_vector_tree_pointers (ob, expr, ref_p);
1207 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1208 lto_output_ts_complex_tree_pointers (ob, expr, ref_p);
1210 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1211 lto_output_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
1213 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1214 lto_output_ts_decl_common_tree_pointers (ob, expr, ref_p);
1216 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
1217 lto_output_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
1219 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1220 lto_output_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
1222 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1223 lto_output_ts_field_decl_tree_pointers (ob, expr, ref_p);
1225 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1226 lto_output_ts_function_decl_tree_pointers (ob, expr, ref_p);
1228 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1229 lto_output_ts_type_common_tree_pointers (ob, expr, ref_p);
1231 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1232 lto_output_ts_type_non_common_tree_pointers (ob, expr, ref_p);
1234 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1235 lto_output_ts_list_tree_pointers (ob, expr, ref_p);
1237 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1238 lto_output_ts_vec_tree_pointers (ob, expr, ref_p);
1240 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1241 lto_output_ts_exp_tree_pointers (ob, expr, ref_p);
1243 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
1244 lto_output_ts_block_tree_pointers (ob, expr, ref_p);
1246 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1247 lto_output_ts_binfo_tree_pointers (ob, expr, ref_p);
1249 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1250 lto_output_ts_constructor_tree_pointers (ob, expr, ref_p);
1252 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
1253 lto_output_ts_target_option (ob, expr);
1255 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
1256 lto_output_ts_translation_unit_decl_tree_pointers (ob, expr);
1260 /* Emit header information for tree EXPR to output block OB. The header
1261 contains everything needed to instantiate an empty skeleton for
1262 EXPR on the reading side. IX is the index into the streamer cache
1263 where EXPR is stored. REF_P is as in lto_output_tree. */
1265 static void
1266 lto_output_tree_header (struct output_block *ob, tree expr)
1268 enum LTO_tags tag;
1269 enum tree_code code;
1271 /* We should not see any tree nodes not handled by the streamer. */
1272 code = TREE_CODE (expr);
1273 if (!streamer_hooks.is_streamable (expr))
1274 internal_error ("tree code %qs is not supported in %s streams",
1275 tree_code_name[code], streamer_hooks.name);
1277 /* The header of a tree node consists of its tag, the size of
1278 the node, and any other information needed to instantiate
1279 EXPR on the reading side (such as the number of slots in
1280 variable sized nodes). */
1281 tag = lto_tree_code_to_tag (code);
1282 output_record_start (ob, tag);
1284 /* The following will cause bootstrap miscomparisons. Enable with care. */
1285 #ifdef LTO_STREAMER_DEBUG
1286 /* This is used mainly for debugging purposes. When the reader
1287 and the writer do not agree on a streamed node, the pointer
1288 value for EXPR can be used to track down the differences in
1289 the debugger. */
1290 gcc_assert ((HOST_WIDEST_INT) (intptr_t) expr == (intptr_t) expr);
1291 output_sleb128 (ob, (HOST_WIDEST_INT) (intptr_t) expr);
1292 #endif
1294 /* The text in strings and identifiers are completely emitted in
1295 the header. */
1296 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
1297 output_string_cst (ob, ob->main_stream, expr);
1298 else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
1299 output_identifier (ob, ob->main_stream, expr);
1300 else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1301 output_sleb128 (ob, TREE_VEC_LENGTH (expr));
1302 else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1303 output_uleb128 (ob, BINFO_N_BASE_BINFOS (expr));
1305 /* Allow the streamer to write any streamer-specific information
1306 needed to instantiate the node when reading. */
1307 if (streamer_hooks.output_tree_header)
1308 streamer_hooks.output_tree_header (ob, expr);
1312 /* Write the code and class of builtin EXPR to output block OB. IX is
1313 the index into the streamer cache where EXPR is stored.*/
1315 static void
1316 lto_output_builtin_tree (struct output_block *ob, tree expr)
1318 gcc_assert (lto_stream_as_builtin_p (expr));
1320 if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD
1321 && !targetm.builtin_decl)
1322 sorry ("gimple bytecode streams do not support machine specific builtin "
1323 "functions on this target");
1325 output_record_start (ob, LTO_builtin_decl);
1326 lto_output_enum (ob->main_stream, built_in_class, BUILT_IN_LAST,
1327 DECL_BUILT_IN_CLASS (expr));
1328 output_uleb128 (ob, DECL_FUNCTION_CODE (expr));
1330 if (DECL_ASSEMBLER_NAME_SET_P (expr))
1332 /* When the assembler name of a builtin gets a user name,
1333 the new name is always prefixed with '*' by
1334 set_builtin_user_assembler_name. So, to prevent the
1335 reader side from adding a second '*', we omit it here. */
1336 const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr));
1337 if (strlen (str) > 1 && str[0] == '*')
1338 lto_output_string (ob, ob->main_stream, &str[1], true);
1339 else
1340 lto_output_string (ob, ob->main_stream, NULL, true);
1342 else
1343 lto_output_string (ob, ob->main_stream, NULL, true);
1347 /* Write a physical representation of tree node EXPR to output block
1348 OB. If REF_P is true, the leaves of EXPR are emitted as references
1349 via lto_output_tree_ref. IX is the index into the streamer cache
1350 where EXPR is stored. */
1352 static void
1353 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
1355 struct bitpack_d bp;
1357 /* Write the header, containing everything needed to materialize
1358 EXPR on the reading side. */
1359 lto_output_tree_header (ob, expr);
1361 /* Pack all the non-pointer fields in EXPR into a bitpack and write
1362 the resulting bitpack. */
1363 bp = bitpack_create (ob->main_stream);
1364 pack_value_fields (&bp, expr);
1365 lto_output_bitpack (&bp);
1367 /* Write all the pointer fields in EXPR. */
1368 lto_output_tree_pointers (ob, expr, ref_p);
1370 /* Call back into the streaming module to see if it needs to write
1371 anything that was not written by the common streamer. */
1372 if (streamer_hooks.write_tree)
1373 streamer_hooks.write_tree (ob, expr, ref_p);
1375 /* Mark the end of EXPR. */
1376 output_zero (ob);
1380 /* GIMPLE hook for writing GIMPLE-specific parts of trees. OB, EXPR
1381 and REF_P are as in lto_write_tree. */
1383 void
1384 lto_streamer_write_tree (struct output_block *ob, tree expr, bool ref_p)
1386 if (DECL_P (expr)
1387 && TREE_CODE (expr) != FUNCTION_DECL
1388 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1390 /* Handle DECL_INITIAL for symbols. */
1391 tree initial = DECL_INITIAL (expr);
1392 if (TREE_CODE (expr) == VAR_DECL
1393 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
1394 && initial)
1396 lto_varpool_encoder_t varpool_encoder;
1397 struct varpool_node *vnode;
1399 varpool_encoder = ob->decl_state->varpool_node_encoder;
1400 vnode = varpool_get_node (expr);
1401 if (!vnode)
1402 initial = error_mark_node;
1403 else if (!lto_varpool_encoder_encode_initializer_p (varpool_encoder,
1404 vnode))
1405 initial = NULL;
1408 lto_output_tree_or_ref (ob, initial, ref_p);
1413 /* Emit the integer constant CST to output block OB. If REF_P is true,
1414 CST's type will be emitted as a reference. */
1416 static void
1417 lto_output_integer_cst (struct output_block *ob, tree cst, bool ref_p)
1419 output_record_start (ob, lto_tree_code_to_tag (INTEGER_CST));
1420 lto_output_tree_or_ref (ob, TREE_TYPE (cst), ref_p);
1421 lto_output_1_stream (ob->main_stream, TREE_OVERFLOW_P (cst));
1422 output_uleb128 (ob, TREE_INT_CST_LOW (cst));
1423 output_uleb128 (ob, TREE_INT_CST_HIGH (cst));
1427 /* Emit the physical representation of tree node EXPR to output block
1428 OB. If REF_P is true, the leaves of EXPR are emitted as references
1429 via lto_output_tree_ref. */
1431 void
1432 lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
1434 unsigned ix;
1435 bool existed_p;
1437 if (expr == NULL_TREE)
1439 output_record_start (ob, LTO_null);
1440 return;
1443 /* INTEGER_CST nodes are special because they need their original type
1444 to be materialized by the reader (to implement TYPE_CACHED_VALUES). */
1445 if (TREE_CODE (expr) == INTEGER_CST)
1447 lto_output_integer_cst (ob, expr, ref_p);
1448 return;
1451 existed_p = lto_streamer_cache_insert (ob->writer_cache, expr, &ix);
1452 if (existed_p)
1454 /* If a node has already been streamed out, make sure that
1455 we don't write it more than once. Otherwise, the reader
1456 will instantiate two different nodes for the same object. */
1457 output_record_start (ob, LTO_tree_pickle_reference);
1458 output_uleb128 (ob, ix);
1459 lto_output_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1460 lto_tree_code_to_tag (TREE_CODE (expr)));
1462 else if (lto_stream_as_builtin_p (expr))
1464 /* MD and NORMAL builtins do not need to be written out
1465 completely as they are always instantiated by the
1466 compiler on startup. The only builtins that need to
1467 be written out are BUILT_IN_FRONTEND. For all other
1468 builtins, we simply write the class and code. */
1469 lto_output_builtin_tree (ob, expr);
1471 else
1473 /* This is the first time we see EXPR, write its fields
1474 to OB. */
1475 lto_write_tree (ob, expr, ref_p);
1480 /* Output to OB a list of try/catch handlers starting with FIRST. */
1482 static void
1483 output_eh_try_list (struct output_block *ob, eh_catch first)
1485 eh_catch n;
1487 for (n = first; n; n = n->next_catch)
1489 output_record_start (ob, LTO_eh_catch);
1490 lto_output_tree_ref (ob, n->type_list);
1491 lto_output_tree_ref (ob, n->filter_list);
1492 lto_output_tree_ref (ob, n->label);
1495 output_record_start (ob, LTO_null);
1499 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1500 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1501 detect EH region sharing. */
1503 static void
1504 output_eh_region (struct output_block *ob, eh_region r)
1506 enum LTO_tags tag;
1508 if (r == NULL)
1510 output_record_start (ob, LTO_null);
1511 return;
1514 if (r->type == ERT_CLEANUP)
1515 tag = LTO_ert_cleanup;
1516 else if (r->type == ERT_TRY)
1517 tag = LTO_ert_try;
1518 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1519 tag = LTO_ert_allowed_exceptions;
1520 else if (r->type == ERT_MUST_NOT_THROW)
1521 tag = LTO_ert_must_not_throw;
1522 else
1523 gcc_unreachable ();
1525 output_record_start (ob, tag);
1526 output_sleb128 (ob, r->index);
1528 if (r->outer)
1529 output_sleb128 (ob, r->outer->index);
1530 else
1531 output_zero (ob);
1533 if (r->inner)
1534 output_sleb128 (ob, r->inner->index);
1535 else
1536 output_zero (ob);
1538 if (r->next_peer)
1539 output_sleb128 (ob, r->next_peer->index);
1540 else
1541 output_zero (ob);
1543 if (r->type == ERT_TRY)
1545 output_eh_try_list (ob, r->u.eh_try.first_catch);
1547 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1549 lto_output_tree_ref (ob, r->u.allowed.type_list);
1550 lto_output_tree_ref (ob, r->u.allowed.label);
1551 output_uleb128 (ob, r->u.allowed.filter);
1553 else if (r->type == ERT_MUST_NOT_THROW)
1555 lto_output_tree_ref (ob, r->u.must_not_throw.failure_decl);
1556 lto_output_location (ob, r->u.must_not_throw.failure_loc);
1559 if (r->landing_pads)
1560 output_sleb128 (ob, r->landing_pads->index);
1561 else
1562 output_zero (ob);
1566 /* Output landing pad LP to OB. */
1568 static void
1569 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1571 if (lp == NULL)
1573 output_record_start (ob, LTO_null);
1574 return;
1577 output_record_start (ob, LTO_eh_landing_pad);
1578 output_sleb128 (ob, lp->index);
1579 if (lp->next_lp)
1580 output_sleb128 (ob, lp->next_lp->index);
1581 else
1582 output_zero (ob);
1584 if (lp->region)
1585 output_sleb128 (ob, lp->region->index);
1586 else
1587 output_zero (ob);
1589 lto_output_tree_ref (ob, lp->post_landing_pad);
1593 /* Output the existing eh_table to OB. */
1595 static void
1596 output_eh_regions (struct output_block *ob, struct function *fn)
1598 if (fn->eh && fn->eh->region_tree)
1600 unsigned i;
1601 eh_region eh;
1602 eh_landing_pad lp;
1603 tree ttype;
1605 output_record_start (ob, LTO_eh_table);
1607 /* Emit the index of the root of the EH region tree. */
1608 output_sleb128 (ob, fn->eh->region_tree->index);
1610 /* Emit all the EH regions in the region array. */
1611 output_sleb128 (ob, VEC_length (eh_region, fn->eh->region_array));
1612 FOR_EACH_VEC_ELT (eh_region, fn->eh->region_array, i, eh)
1613 output_eh_region (ob, eh);
1615 /* Emit all landing pads. */
1616 output_sleb128 (ob, VEC_length (eh_landing_pad, fn->eh->lp_array));
1617 FOR_EACH_VEC_ELT (eh_landing_pad, fn->eh->lp_array, i, lp)
1618 output_eh_lp (ob, lp);
1620 /* Emit all the runtime type data. */
1621 output_sleb128 (ob, VEC_length (tree, fn->eh->ttype_data));
1622 FOR_EACH_VEC_ELT (tree, fn->eh->ttype_data, i, ttype)
1623 lto_output_tree_ref (ob, ttype);
1625 /* Emit the table of action chains. */
1626 if (targetm.arm_eabi_unwinder)
1628 tree t;
1629 output_sleb128 (ob, VEC_length (tree, fn->eh->ehspec_data.arm_eabi));
1630 FOR_EACH_VEC_ELT (tree, fn->eh->ehspec_data.arm_eabi, i, t)
1631 lto_output_tree_ref (ob, t);
1633 else
1635 uchar c;
1636 output_sleb128 (ob, VEC_length (uchar, fn->eh->ehspec_data.other));
1637 FOR_EACH_VEC_ELT (uchar, fn->eh->ehspec_data.other, i, c)
1638 lto_output_1_stream (ob->main_stream, c);
1642 /* The LTO_null either terminates the record or indicates that there
1643 are no eh_records at all. */
1644 output_record_start (ob, LTO_null);
1648 /* Output all of the active ssa names to the ssa_names stream. */
1650 static void
1651 output_ssa_names (struct output_block *ob, struct function *fn)
1653 unsigned int i, len;
1655 len = VEC_length (tree, SSANAMES (fn));
1656 output_uleb128 (ob, len);
1658 for (i = 1; i < len; i++)
1660 tree ptr = VEC_index (tree, SSANAMES (fn), i);
1662 if (ptr == NULL_TREE
1663 || SSA_NAME_IN_FREE_LIST (ptr)
1664 || !is_gimple_reg (ptr))
1665 continue;
1667 output_uleb128 (ob, i);
1668 lto_output_1_stream (ob->main_stream, SSA_NAME_IS_DEFAULT_DEF (ptr));
1669 lto_output_tree_ref (ob, SSA_NAME_VAR (ptr));
1672 output_zero (ob);
1676 /* Output the cfg. */
1678 static void
1679 output_cfg (struct output_block *ob, struct function *fn)
1681 struct lto_output_stream *tmp_stream = ob->main_stream;
1682 basic_block bb;
1684 ob->main_stream = ob->cfg_stream;
1686 lto_output_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1687 profile_status_for_function (fn));
1689 /* Output the number of the highest basic block. */
1690 output_uleb128 (ob, last_basic_block_for_function (fn));
1692 FOR_ALL_BB_FN (bb, fn)
1694 edge_iterator ei;
1695 edge e;
1697 output_sleb128 (ob, bb->index);
1699 /* Output the successors and the edge flags. */
1700 output_uleb128 (ob, EDGE_COUNT (bb->succs));
1701 FOR_EACH_EDGE (e, ei, bb->succs)
1703 output_uleb128 (ob, e->dest->index);
1704 output_sleb128 (ob, e->probability);
1705 output_sleb128 (ob, e->count);
1706 output_uleb128 (ob, e->flags);
1710 output_sleb128 (ob, -1);
1712 bb = ENTRY_BLOCK_PTR;
1713 while (bb->next_bb)
1715 output_sleb128 (ob, bb->next_bb->index);
1716 bb = bb->next_bb;
1719 output_sleb128 (ob, -1);
1721 ob->main_stream = tmp_stream;
1725 /* Output PHI function PHI to the main stream in OB. */
1727 static void
1728 output_phi (struct output_block *ob, gimple phi)
1730 unsigned i, len = gimple_phi_num_args (phi);
1732 output_record_start (ob, lto_gimple_code_to_tag (GIMPLE_PHI));
1733 output_uleb128 (ob, SSA_NAME_VERSION (PHI_RESULT (phi)));
1735 for (i = 0; i < len; i++)
1737 lto_output_tree_ref (ob, gimple_phi_arg_def (phi, i));
1738 output_uleb128 (ob, gimple_phi_arg_edge (phi, i)->src->index);
1739 lto_output_location (ob, gimple_phi_arg_location (phi, i));
1744 /* Emit statement STMT on the main stream of output block OB. */
1746 static void
1747 output_gimple_stmt (struct output_block *ob, gimple stmt)
1749 unsigned i;
1750 enum gimple_code code;
1751 enum LTO_tags tag;
1752 struct bitpack_d bp;
1754 /* Emit identifying tag. */
1755 code = gimple_code (stmt);
1756 tag = lto_gimple_code_to_tag (code);
1757 output_record_start (ob, tag);
1759 /* Emit the tuple header. */
1760 bp = bitpack_create (ob->main_stream);
1761 bp_pack_var_len_unsigned (&bp, gimple_num_ops (stmt));
1762 bp_pack_value (&bp, gimple_no_warning_p (stmt), 1);
1763 if (is_gimple_assign (stmt))
1764 bp_pack_value (&bp, gimple_assign_nontemporal_move_p (stmt), 1);
1765 bp_pack_value (&bp, gimple_has_volatile_ops (stmt), 1);
1766 bp_pack_var_len_unsigned (&bp, stmt->gsbase.subcode);
1767 lto_output_bitpack (&bp);
1769 /* Emit location information for the statement. */
1770 lto_output_location (ob, gimple_location (stmt));
1772 /* Emit the lexical block holding STMT. */
1773 lto_output_tree (ob, gimple_block (stmt), true);
1775 /* Emit the operands. */
1776 switch (gimple_code (stmt))
1778 case GIMPLE_RESX:
1779 output_sleb128 (ob, gimple_resx_region (stmt));
1780 break;
1782 case GIMPLE_EH_MUST_NOT_THROW:
1783 lto_output_tree_ref (ob, gimple_eh_must_not_throw_fndecl (stmt));
1784 break;
1786 case GIMPLE_EH_DISPATCH:
1787 output_sleb128 (ob, gimple_eh_dispatch_region (stmt));
1788 break;
1790 case GIMPLE_ASM:
1791 lto_output_uleb128_stream (ob->main_stream, gimple_asm_ninputs (stmt));
1792 lto_output_uleb128_stream (ob->main_stream, gimple_asm_noutputs (stmt));
1793 lto_output_uleb128_stream (ob->main_stream, gimple_asm_nclobbers (stmt));
1794 lto_output_uleb128_stream (ob->main_stream, gimple_asm_nlabels (stmt));
1795 lto_output_string (ob, ob->main_stream, gimple_asm_string (stmt), true);
1796 /* Fallthru */
1798 case GIMPLE_ASSIGN:
1799 case GIMPLE_CALL:
1800 case GIMPLE_RETURN:
1801 case GIMPLE_SWITCH:
1802 case GIMPLE_LABEL:
1803 case GIMPLE_COND:
1804 case GIMPLE_GOTO:
1805 case GIMPLE_DEBUG:
1806 for (i = 0; i < gimple_num_ops (stmt); i++)
1808 tree op = gimple_op (stmt, i);
1809 /* Wrap all uses of non-automatic variables inside MEM_REFs
1810 so that we do not have to deal with type mismatches on
1811 merged symbols during IL read in. The first operand
1812 of GIMPLE_DEBUG must be a decl, not MEM_REF, though. */
1813 if (op && (i || !is_gimple_debug (stmt)))
1815 tree *basep = &op;
1816 while (handled_component_p (*basep))
1817 basep = &TREE_OPERAND (*basep, 0);
1818 if (TREE_CODE (*basep) == VAR_DECL
1819 && !auto_var_in_fn_p (*basep, current_function_decl)
1820 && !DECL_REGISTER (*basep))
1822 bool volatilep = TREE_THIS_VOLATILE (*basep);
1823 *basep = build2 (MEM_REF, TREE_TYPE (*basep),
1824 build_fold_addr_expr (*basep),
1825 build_int_cst (build_pointer_type
1826 (TREE_TYPE (*basep)), 0));
1827 TREE_THIS_VOLATILE (*basep) = volatilep;
1830 lto_output_tree_ref (ob, op);
1832 if (is_gimple_call (stmt))
1834 if (gimple_call_internal_p (stmt))
1835 lto_output_enum (ob->main_stream, internal_fn,
1836 IFN_LAST, gimple_call_internal_fn (stmt));
1837 else
1838 lto_output_tree_ref (ob, gimple_call_fntype (stmt));
1840 break;
1842 case GIMPLE_NOP:
1843 case GIMPLE_PREDICT:
1844 break;
1846 default:
1847 gcc_unreachable ();
1852 /* Output a basic block BB to the main stream in OB for this FN. */
1854 static void
1855 output_bb (struct output_block *ob, basic_block bb, struct function *fn)
1857 gimple_stmt_iterator bsi = gsi_start_bb (bb);
1859 output_record_start (ob,
1860 (!gsi_end_p (bsi)) || phi_nodes (bb)
1861 ? LTO_bb1
1862 : LTO_bb0);
1864 output_uleb128 (ob, bb->index);
1865 output_sleb128 (ob, bb->count);
1866 output_sleb128 (ob, bb->loop_depth);
1867 output_sleb128 (ob, bb->frequency);
1868 output_sleb128 (ob, bb->flags);
1870 if (!gsi_end_p (bsi) || phi_nodes (bb))
1872 /* Output the statements. The list of statements is terminated
1873 with a zero. */
1874 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1876 int region;
1877 gimple stmt = gsi_stmt (bsi);
1879 output_gimple_stmt (ob, stmt);
1881 /* Emit the EH region holding STMT. */
1882 region = lookup_stmt_eh_lp_fn (fn, stmt);
1883 if (region != 0)
1885 output_record_start (ob, LTO_eh_region);
1886 output_sleb128 (ob, region);
1888 else
1889 output_record_start (ob, LTO_null);
1892 output_record_start (ob, LTO_null);
1894 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1896 gimple phi = gsi_stmt (bsi);
1898 /* Only emit PHIs for gimple registers. PHI nodes for .MEM
1899 will be filled in on reading when the SSA form is
1900 updated. */
1901 if (is_gimple_reg (gimple_phi_result (phi)))
1902 output_phi (ob, phi);
1905 output_record_start (ob, LTO_null);
1909 /* Create the header in the file using OB. If the section type is for
1910 a function, set FN to the decl for that function. */
1912 void
1913 produce_asm (struct output_block *ob, tree fn)
1915 enum lto_section_type section_type = ob->section_type;
1916 struct lto_function_header header;
1917 char *section_name;
1918 struct lto_output_stream *header_stream;
1920 if (section_type == LTO_section_function_body)
1922 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1923 section_name = lto_get_section_name (section_type, name, NULL);
1925 else
1926 section_name = lto_get_section_name (section_type, NULL, NULL);
1928 lto_begin_section (section_name, !flag_wpa);
1929 free (section_name);
1931 /* The entire header is stream computed here. */
1932 memset (&header, 0, sizeof (struct lto_function_header));
1934 /* Write the header. */
1935 header.lto_header.major_version = LTO_major_version;
1936 header.lto_header.minor_version = LTO_minor_version;
1937 header.lto_header.section_type = section_type;
1939 header.compressed_size = 0;
1941 if (section_type == LTO_section_function_body)
1942 header.cfg_size = ob->cfg_stream->total_size;
1943 header.main_size = ob->main_stream->total_size;
1944 header.string_size = ob->string_stream->total_size;
1946 header_stream = XCNEW (struct lto_output_stream);
1947 lto_output_data_stream (header_stream, &header, sizeof header);
1948 lto_write_stream (header_stream);
1949 free (header_stream);
1951 /* Put all of the gimple and the string table out the asm file as a
1952 block of text. */
1953 if (section_type == LTO_section_function_body)
1954 lto_write_stream (ob->cfg_stream);
1955 lto_write_stream (ob->main_stream);
1956 lto_write_stream (ob->string_stream);
1958 lto_end_section ();
1962 /* Output the body of function NODE->DECL. */
1964 static void
1965 output_function (struct cgraph_node *node)
1967 struct bitpack_d bp;
1968 tree function;
1969 struct function *fn;
1970 basic_block bb;
1971 struct output_block *ob;
1972 unsigned i;
1973 tree t;
1975 function = node->decl;
1976 fn = DECL_STRUCT_FUNCTION (function);
1977 ob = create_output_block (LTO_section_function_body);
1979 clear_line_info (ob);
1980 ob->cgraph_node = node;
1982 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1984 /* Set current_function_decl and cfun. */
1985 current_function_decl = function;
1986 push_cfun (fn);
1988 /* Make string 0 be a NULL string. */
1989 lto_output_1_stream (ob->string_stream, 0);
1991 output_record_start (ob, LTO_function);
1993 /* Write all the attributes for FN. */
1994 bp = bitpack_create (ob->main_stream);
1995 bp_pack_value (&bp, fn->is_thunk, 1);
1996 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1997 bp_pack_value (&bp, fn->after_tree_profile, 1);
1998 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1999 bp_pack_value (&bp, fn->returns_struct, 1);
2000 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
2001 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
2002 bp_pack_value (&bp, fn->after_inlining, 1);
2003 bp_pack_value (&bp, fn->stdarg, 1);
2004 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
2005 bp_pack_value (&bp, fn->calls_alloca, 1);
2006 bp_pack_value (&bp, fn->calls_setjmp, 1);
2007 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
2008 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
2009 lto_output_bitpack (&bp);
2011 /* Output the function start and end loci. */
2012 lto_output_location (ob, fn->function_start_locus);
2013 lto_output_location (ob, fn->function_end_locus);
2015 /* Output current IL state of the function. */
2016 output_uleb128 (ob, fn->curr_properties);
2018 /* Output the static chain and non-local goto save area. */
2019 lto_output_tree_ref (ob, fn->static_chain_decl);
2020 lto_output_tree_ref (ob, fn->nonlocal_goto_save_area);
2022 /* Output all the local variables in the function. */
2023 output_sleb128 (ob, VEC_length (tree, fn->local_decls));
2024 FOR_EACH_VEC_ELT (tree, fn->local_decls, i, t)
2025 lto_output_tree_ref (ob, t);
2027 /* Output the head of the arguments list. */
2028 lto_output_tree_ref (ob, DECL_ARGUMENTS (function));
2030 /* Output all the SSA names used in the function. */
2031 output_ssa_names (ob, fn);
2033 /* Output any exception handling regions. */
2034 output_eh_regions (ob, fn);
2036 /* Output DECL_INITIAL for the function, which contains the tree of
2037 lexical scopes. */
2038 lto_output_tree (ob, DECL_INITIAL (function), true);
2040 /* We will renumber the statements. The code that does this uses
2041 the same ordering that we use for serializing them so we can use
2042 the same code on the other end and not have to write out the
2043 statement numbers. We do not assign UIDs to PHIs here because
2044 virtual PHIs get re-computed on-the-fly which would make numbers
2045 inconsistent. */
2046 set_gimple_stmt_max_uid (cfun, 0);
2047 FOR_ALL_BB (bb)
2049 gimple_stmt_iterator gsi;
2050 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2052 gimple stmt = gsi_stmt (gsi);
2053 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2057 /* Output the code for the function. */
2058 FOR_ALL_BB_FN (bb, fn)
2059 output_bb (ob, bb, fn);
2061 /* The terminator for this function. */
2062 output_record_start (ob, LTO_null);
2064 output_cfg (ob, fn);
2066 /* Create a section to hold the pickled output of this function. */
2067 produce_asm (ob, function);
2069 destroy_output_block (ob);
2071 current_function_decl = NULL;
2072 pop_cfun ();
2076 /* Used to pass data to trivally_defined_alias callback. */
2077 struct sets {
2078 cgraph_node_set set;
2079 varpool_node_set vset;
2083 /* Return true if alias pair P belongs to the set of cgraph nodes in
2084 SET. If P is a an alias for a VAR_DECL, it can always be emitted.
2085 However, for FUNCTION_DECL aliases, we should only output the pair
2086 if it belongs to a function whose cgraph node is in SET.
2087 Otherwise, the LTRANS phase will get into trouble when finalizing
2088 aliases because the alias will refer to a function not defined in
2089 the file processed by LTRANS. */
2091 static bool
2092 trivally_defined_alias (tree decl ATTRIBUTE_UNUSED,
2093 tree target, void *data)
2095 struct sets *set = (struct sets *) data;
2096 struct cgraph_node *fnode = NULL;
2097 struct varpool_node *vnode = NULL;
2099 fnode = cgraph_node_for_asm (target);
2100 if (fnode)
2101 return cgraph_node_in_set_p (fnode, set->set);
2102 vnode = varpool_node_for_asm (target);
2103 return vnode && varpool_node_in_set_p (vnode, set->vset);
2106 /* Return true if alias pair P should be output in the current
2107 partition contains cgrpah nodes SET and varpool nodes VSET.
2108 DEFINED is set of all aliases whose targets are defined in
2109 the partition.
2111 Normal aliases are output when they are defined, while WEAKREF
2112 aliases are output when they are used. */
2114 static bool
2115 output_alias_pair_p (alias_pair *p, symbol_alias_set_t *defined,
2116 cgraph_node_set set, varpool_node_set vset)
2118 struct cgraph_node *node;
2119 struct varpool_node *vnode;
2121 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
2123 if (TREE_CODE (p->decl) == VAR_DECL)
2125 vnode = varpool_get_node (p->decl);
2126 return (vnode
2127 && referenced_from_this_partition_p (&vnode->ref_list, set, vset));
2129 node = cgraph_get_node (p->decl);
2130 return (node
2131 && (referenced_from_this_partition_p (&node->ref_list, set, vset)
2132 || reachable_from_this_partition_p (node, set)));
2134 else
2135 return symbol_alias_set_contains (defined, p->decl);
2138 /* Output any unreferenced global symbol defined in SET, alias pairs
2139 and labels. */
2141 static void
2142 output_unreferenced_globals (cgraph_node_set set, varpool_node_set vset)
2144 struct output_block *ob;
2145 alias_pair *p;
2146 unsigned i;
2147 symbol_alias_set_t *defined;
2148 struct sets setdata;
2150 setdata.set = set;
2151 setdata.vset = vset;
2153 ob = create_output_block (LTO_section_static_initializer);
2154 ob->cgraph_node = NULL;
2156 clear_line_info (ob);
2158 /* Make string 0 be a NULL string. */
2159 lto_output_1_stream (ob->string_stream, 0);
2161 /* We really need to propagate in both directoins:
2162 for normal aliases we propagate from first defined alias to
2163 all aliases defined based on it. For weakrefs we propagate in
2164 the oposite direction. */
2165 defined = propagate_aliases_backward (trivally_defined_alias, &setdata);
2167 /* Emit the alias pairs for the nodes in SET. */
2168 FOR_EACH_VEC_ELT (alias_pair, alias_pairs, i, p)
2169 if (output_alias_pair_p (p, defined, set, vset))
2171 lto_output_tree_ref (ob, p->decl);
2172 lto_output_tree_ref (ob, p->target);
2174 symbol_alias_set_destroy (defined);
2176 output_record_start (ob, LTO_null);
2178 produce_asm (ob, NULL);
2179 destroy_output_block (ob);
2183 /* Copy the function body of NODE without deserializing. */
2185 static void
2186 copy_function (struct cgraph_node *node)
2188 tree function = node->decl;
2189 struct lto_file_decl_data *file_data = node->local.lto_file_data;
2190 struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
2191 const char *data;
2192 size_t len;
2193 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2194 char *section_name =
2195 lto_get_section_name (LTO_section_function_body, name, NULL);
2196 size_t i, j;
2197 struct lto_in_decl_state *in_state;
2198 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2200 lto_begin_section (section_name, !flag_wpa);
2201 free (section_name);
2203 /* We may have renamed the declaration, e.g., a static function. */
2204 name = lto_get_decl_name_mapping (file_data, name);
2206 data = lto_get_section_data (file_data, LTO_section_function_body,
2207 name, &len);
2208 gcc_assert (data);
2210 /* Do a bit copy of the function body. */
2211 lto_output_data_stream (output_stream, data, len);
2212 lto_write_stream (output_stream);
2214 /* Copy decls. */
2215 in_state =
2216 lto_get_function_in_decl_state (node->local.lto_file_data, function);
2217 gcc_assert (in_state);
2219 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2221 size_t n = in_state->streams[i].size;
2222 tree *trees = in_state->streams[i].trees;
2223 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2225 /* The out state must have the same indices and the in state.
2226 So just copy the vector. All the encoders in the in state
2227 must be empty where we reach here. */
2228 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2229 for (j = 0; j < n; j++)
2230 VEC_safe_push (tree, heap, encoder->trees, trees[j]);
2231 encoder->next_index = n;
2234 lto_free_section_data (file_data, LTO_section_function_body, name,
2235 data, len);
2236 free (output_stream);
2237 lto_end_section ();
2241 /* Main entry point from the pass manager. */
2243 static void
2244 lto_output (cgraph_node_set set, varpool_node_set vset)
2246 struct cgraph_node *node;
2247 struct lto_out_decl_state *decl_state;
2248 #ifdef ENABLE_CHECKING
2249 bitmap output = lto_bitmap_alloc ();
2250 #endif
2251 int i, n_nodes;
2252 lto_cgraph_encoder_t encoder = lto_get_out_decl_state ()->cgraph_node_encoder;
2254 /* Initialize the streamer. */
2255 lto_streamer_init ();
2257 n_nodes = lto_cgraph_encoder_size (encoder);
2258 /* Process only the functions with bodies. */
2259 for (i = 0; i < n_nodes; i++)
2261 node = lto_cgraph_encoder_deref (encoder, i);
2262 if (lto_cgraph_encoder_encode_body_p (encoder, node)
2263 && !node->alias
2264 && !node->thunk.thunk_p)
2266 #ifdef ENABLE_CHECKING
2267 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2268 bitmap_set_bit (output, DECL_UID (node->decl));
2269 #endif
2270 decl_state = lto_new_out_decl_state ();
2271 lto_push_out_decl_state (decl_state);
2272 if (gimple_has_body_p (node->decl))
2273 output_function (node);
2274 else
2275 copy_function (node);
2276 gcc_assert (lto_get_out_decl_state () == decl_state);
2277 lto_pop_out_decl_state ();
2278 lto_record_function_out_decl_state (node->decl, decl_state);
2282 /* Emit the callgraph after emitting function bodies. This needs to
2283 be done now to make sure that all the statements in every function
2284 have been renumbered so that edges can be associated with call
2285 statements using the statement UIDs. */
2286 output_cgraph (set, vset);
2288 #ifdef ENABLE_CHECKING
2289 lto_bitmap_free (output);
2290 #endif
2293 struct ipa_opt_pass_d pass_ipa_lto_gimple_out =
2296 IPA_PASS,
2297 "lto_gimple_out", /* name */
2298 gate_lto_out, /* gate */
2299 NULL, /* execute */
2300 NULL, /* sub */
2301 NULL, /* next */
2302 0, /* static_pass_number */
2303 TV_IPA_LTO_GIMPLE_OUT, /* tv_id */
2304 0, /* properties_required */
2305 0, /* properties_provided */
2306 0, /* properties_destroyed */
2307 0, /* todo_flags_start */
2308 0 /* todo_flags_finish */
2310 NULL, /* generate_summary */
2311 lto_output, /* write_summary */
2312 NULL, /* read_summary */
2313 lto_output, /* write_optimization_summary */
2314 NULL, /* read_optimization_summary */
2315 NULL, /* stmt_fixup */
2316 0, /* TODOs */
2317 NULL, /* function_transform */
2318 NULL /* variable_transform */
2322 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2323 from it and required for correct representation of its semantics.
2324 Each node in ENCODER must be a global declaration or a type. A node
2325 is written only once, even if it appears multiple times in the
2326 vector. Certain transitively-reachable nodes, such as those
2327 representing expressions, may be duplicated, but such nodes
2328 must not appear in ENCODER itself. */
2330 static void
2331 write_global_stream (struct output_block *ob,
2332 struct lto_tree_ref_encoder *encoder)
2334 tree t;
2335 size_t index;
2336 const size_t size = lto_tree_ref_encoder_size (encoder);
2338 for (index = 0; index < size; index++)
2340 t = lto_tree_ref_encoder_get_tree (encoder, index);
2341 if (!lto_streamer_cache_lookup (ob->writer_cache, t, NULL))
2342 lto_output_tree (ob, t, false);
2347 /* Write a sequence of indices into the globals vector corresponding
2348 to the trees in ENCODER. These are used by the reader to map the
2349 indices used to refer to global entities within function bodies to
2350 their referents. */
2352 static void
2353 write_global_references (struct output_block *ob,
2354 struct lto_output_stream *ref_stream,
2355 struct lto_tree_ref_encoder *encoder)
2357 tree t;
2358 uint32_t index;
2359 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2361 /* Write size as 32-bit unsigned. */
2362 lto_output_data_stream (ref_stream, &size, sizeof (int32_t));
2364 for (index = 0; index < size; index++)
2366 uint32_t slot_num;
2368 t = lto_tree_ref_encoder_get_tree (encoder, index);
2369 lto_streamer_cache_lookup (ob->writer_cache, t, &slot_num);
2370 gcc_assert (slot_num != (unsigned)-1);
2371 lto_output_data_stream (ref_stream, &slot_num, sizeof slot_num);
2376 /* Write all the streams in an lto_out_decl_state STATE using
2377 output block OB and output stream OUT_STREAM. */
2379 void
2380 lto_output_decl_state_streams (struct output_block *ob,
2381 struct lto_out_decl_state *state)
2383 int i;
2385 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2386 write_global_stream (ob, &state->streams[i]);
2390 /* Write all the references in an lto_out_decl_state STATE using
2391 output block OB and output stream OUT_STREAM. */
2393 void
2394 lto_output_decl_state_refs (struct output_block *ob,
2395 struct lto_output_stream *out_stream,
2396 struct lto_out_decl_state *state)
2398 unsigned i;
2399 uint32_t ref;
2400 tree decl;
2402 /* Write reference to FUNCTION_DECL. If there is not function,
2403 write reference to void_type_node. */
2404 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2405 lto_streamer_cache_lookup (ob->writer_cache, decl, &ref);
2406 gcc_assert (ref != (unsigned)-1);
2407 lto_output_data_stream (out_stream, &ref, sizeof (uint32_t));
2409 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2410 write_global_references (ob, out_stream, &state->streams[i]);
2414 /* Return the written size of STATE. */
2416 static size_t
2417 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2419 int i;
2420 size_t size;
2422 size = sizeof (int32_t); /* fn_ref. */
2423 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2425 size += sizeof (int32_t); /* vector size. */
2426 size += (lto_tree_ref_encoder_size (&state->streams[i])
2427 * sizeof (int32_t));
2429 return size;
2433 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2434 so far. */
2436 static void
2437 write_symbol (struct lto_streamer_cache_d *cache,
2438 struct lto_output_stream *stream,
2439 tree t, struct pointer_set_t *seen, bool alias)
2441 const char *name;
2442 enum gcc_plugin_symbol_kind kind;
2443 enum gcc_plugin_symbol_visibility visibility;
2444 unsigned slot_num;
2445 uint64_t size;
2446 const char *comdat;
2447 unsigned char c;
2449 /* None of the following kinds of symbols are needed in the
2450 symbol table. */
2451 if (!TREE_PUBLIC (t)
2452 || is_builtin_fn (t)
2453 || DECL_ABSTRACT (t)
2454 || TREE_CODE (t) == RESULT_DECL)
2455 return;
2457 gcc_assert (TREE_CODE (t) == VAR_DECL
2458 || TREE_CODE (t) == FUNCTION_DECL);
2460 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2462 /* This behaves like assemble_name_raw in varasm.c, performing the
2463 same name manipulations that ASM_OUTPUT_LABELREF does. */
2464 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2466 if (pointer_set_contains (seen, name))
2467 return;
2468 pointer_set_insert (seen, name);
2470 lto_streamer_cache_lookup (cache, t, &slot_num);
2471 gcc_assert (slot_num != (unsigned)-1);
2473 if (DECL_EXTERNAL (t))
2475 if (DECL_WEAK (t))
2476 kind = GCCPK_WEAKUNDEF;
2477 else
2478 kind = GCCPK_UNDEF;
2480 else
2482 if (DECL_WEAK (t))
2483 kind = GCCPK_WEAKDEF;
2484 else if (DECL_COMMON (t))
2485 kind = GCCPK_COMMON;
2486 else
2487 kind = GCCPK_DEF;
2489 /* When something is defined, it should have node attached. */
2490 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2491 || varpool_get_node (t)->finalized);
2492 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2493 || (cgraph_get_node (t)
2494 && cgraph_get_node (t)->analyzed));
2497 /* Imitate what default_elf_asm_output_external do.
2498 When symbol is external, we need to output it with DEFAULT visibility
2499 when compiling with -fvisibility=default, while with HIDDEN visibility
2500 when symbol has attribute (visibility("hidden")) specified.
2501 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2502 right. */
2504 if (DECL_EXTERNAL (t)
2505 && !targetm.binds_local_p (t))
2506 visibility = GCCPV_DEFAULT;
2507 else
2508 switch (DECL_VISIBILITY(t))
2510 case VISIBILITY_DEFAULT:
2511 visibility = GCCPV_DEFAULT;
2512 break;
2513 case VISIBILITY_PROTECTED:
2514 visibility = GCCPV_PROTECTED;
2515 break;
2516 case VISIBILITY_HIDDEN:
2517 visibility = GCCPV_HIDDEN;
2518 break;
2519 case VISIBILITY_INTERNAL:
2520 visibility = GCCPV_INTERNAL;
2521 break;
2524 if (kind == GCCPK_COMMON
2525 && DECL_SIZE (t)
2526 && TREE_CODE (DECL_SIZE (t)) == INTEGER_CST)
2528 size = (HOST_BITS_PER_WIDE_INT >= 64)
2529 ? (uint64_t) int_size_in_bytes (TREE_TYPE (t))
2530 : (((uint64_t) TREE_INT_CST_HIGH (DECL_SIZE_UNIT (t))) << 32)
2531 | TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2533 else
2534 size = 0;
2536 if (DECL_ONE_ONLY (t))
2537 comdat = IDENTIFIER_POINTER (DECL_COMDAT_GROUP (t));
2538 else
2539 comdat = "";
2541 lto_output_data_stream (stream, name, strlen (name) + 1);
2542 lto_output_data_stream (stream, comdat, strlen (comdat) + 1);
2543 c = (unsigned char) kind;
2544 lto_output_data_stream (stream, &c, 1);
2545 c = (unsigned char) visibility;
2546 lto_output_data_stream (stream, &c, 1);
2547 lto_output_data_stream (stream, &size, 8);
2548 lto_output_data_stream (stream, &slot_num, 4);
2552 /* Write an IL symbol table to OB.
2553 SET and VSET are cgraph/varpool node sets we are outputting. */
2555 static void
2556 produce_symtab (struct output_block *ob,
2557 cgraph_node_set set, varpool_node_set vset)
2559 struct lto_streamer_cache_d *cache = ob->writer_cache;
2560 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2561 struct pointer_set_t *seen;
2562 struct cgraph_node *node;
2563 struct varpool_node *vnode;
2564 struct lto_output_stream stream;
2565 lto_varpool_encoder_t varpool_encoder = ob->decl_state->varpool_node_encoder;
2566 lto_cgraph_encoder_t encoder = ob->decl_state->cgraph_node_encoder;
2567 int i;
2568 alias_pair *p;
2569 struct sets setdata;
2570 symbol_alias_set_t *defined;
2572 setdata.set = set;
2573 setdata.vset = vset;
2575 lto_begin_section (section_name, false);
2576 free (section_name);
2578 seen = pointer_set_create ();
2579 memset (&stream, 0, sizeof (stream));
2581 /* Write all functions.
2582 First write all defined functions and then write all used functions.
2583 This is done so only to handle duplicated symbols in cgraph. */
2584 for (i = 0; i < lto_cgraph_encoder_size (encoder); i++)
2586 node = lto_cgraph_encoder_deref (encoder, i);
2587 if (DECL_EXTERNAL (node->decl))
2588 continue;
2589 if (DECL_COMDAT (node->decl)
2590 && cgraph_comdat_can_be_unshared_p (node))
2591 continue;
2592 if ((node->alias && !node->thunk.alias) || node->global.inlined_to)
2593 continue;
2594 write_symbol (cache, &stream, node->decl, seen, false);
2596 for (i = 0; i < lto_cgraph_encoder_size (encoder); i++)
2598 node = lto_cgraph_encoder_deref (encoder, i);
2599 if (!DECL_EXTERNAL (node->decl))
2600 continue;
2601 if (DECL_COMDAT (node->decl)
2602 && cgraph_comdat_can_be_unshared_p (node))
2603 continue;
2604 if ((node->alias && !node->thunk.alias) || node->global.inlined_to)
2605 continue;
2606 write_symbol (cache, &stream, node->decl, seen, false);
2609 /* Write all variables. */
2610 for (i = 0; i < lto_varpool_encoder_size (varpool_encoder); i++)
2612 vnode = lto_varpool_encoder_deref (varpool_encoder, i);
2613 if (DECL_EXTERNAL (vnode->decl))
2614 continue;
2615 /* COMDAT virtual tables can be unshared. Do not declare them
2616 in the LTO symbol table to prevent linker from forcing them
2617 into the output. */
2618 if (DECL_COMDAT (vnode->decl)
2619 && !vnode->force_output
2620 && vnode->finalized
2621 && DECL_VIRTUAL_P (vnode->decl))
2622 continue;
2623 if (vnode->alias && !vnode->alias_of)
2624 continue;
2625 write_symbol (cache, &stream, vnode->decl, seen, false);
2627 for (i = 0; i < lto_varpool_encoder_size (varpool_encoder); i++)
2629 vnode = lto_varpool_encoder_deref (varpool_encoder, i);
2630 if (!DECL_EXTERNAL (vnode->decl))
2631 continue;
2632 if (DECL_COMDAT (vnode->decl)
2633 && !vnode->force_output
2634 && vnode->finalized
2635 && DECL_VIRTUAL_P (vnode->decl))
2636 continue;
2637 if (vnode->alias && !vnode->alias_of)
2638 continue;
2639 write_symbol (cache, &stream, vnode->decl, seen, false);
2642 /* Write all aliases. */
2643 defined = propagate_aliases_backward (trivally_defined_alias, &setdata);
2644 FOR_EACH_VEC_ELT (alias_pair, alias_pairs, i, p)
2645 if (output_alias_pair_p (p, defined, set, vset))
2646 write_symbol (cache, &stream, p->decl, seen, true);
2647 symbol_alias_set_destroy (defined);
2649 lto_write_stream (&stream);
2650 pointer_set_destroy (seen);
2652 lto_end_section ();
2656 /* This pass is run after all of the functions are serialized and all
2657 of the IPA passes have written their serialized forms. This pass
2658 causes the vector of all of the global decls and types used from
2659 this file to be written in to a section that can then be read in to
2660 recover these on other side. */
2662 static void
2663 produce_asm_for_decls (cgraph_node_set set, varpool_node_set vset)
2665 struct lto_out_decl_state *out_state;
2666 struct lto_out_decl_state *fn_out_state;
2667 struct lto_decl_header header;
2668 char *section_name;
2669 struct output_block *ob;
2670 struct lto_output_stream *header_stream, *decl_state_stream;
2671 unsigned idx, num_fns;
2672 size_t decl_state_size;
2673 int32_t num_decl_states;
2675 ob = create_output_block (LTO_section_decls);
2676 ob->global = true;
2678 /* Write out unreferenced globals, alias pairs and labels. We defer
2679 doing this until now so that we can write out only what is
2680 needed. */
2681 output_unreferenced_globals (set, vset);
2683 memset (&header, 0, sizeof (struct lto_decl_header));
2685 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2686 lto_begin_section (section_name, !flag_wpa);
2687 free (section_name);
2689 /* Make string 0 be a NULL string. */
2690 lto_output_1_stream (ob->string_stream, 0);
2692 /* Write the global symbols. */
2693 out_state = lto_get_out_decl_state ();
2694 num_fns = VEC_length (lto_out_decl_state_ptr, lto_function_decl_states);
2695 lto_output_decl_state_streams (ob, out_state);
2696 for (idx = 0; idx < num_fns; idx++)
2698 fn_out_state =
2699 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2700 lto_output_decl_state_streams (ob, fn_out_state);
2703 header.lto_header.major_version = LTO_major_version;
2704 header.lto_header.minor_version = LTO_minor_version;
2705 header.lto_header.section_type = LTO_section_decls;
2707 /* Currently not used. This field would allow us to preallocate
2708 the globals vector, so that it need not be resized as it is extended. */
2709 header.num_nodes = -1;
2711 /* Compute the total size of all decl out states. */
2712 decl_state_size = sizeof (int32_t);
2713 decl_state_size += lto_out_decl_state_written_size (out_state);
2714 for (idx = 0; idx < num_fns; idx++)
2716 fn_out_state =
2717 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2718 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2720 header.decl_state_size = decl_state_size;
2722 header.main_size = ob->main_stream->total_size;
2723 header.string_size = ob->string_stream->total_size;
2725 header_stream = XCNEW (struct lto_output_stream);
2726 lto_output_data_stream (header_stream, &header, sizeof header);
2727 lto_write_stream (header_stream);
2728 free (header_stream);
2730 /* Write the main out-decl state, followed by out-decl states of
2731 functions. */
2732 decl_state_stream = ((struct lto_output_stream *)
2733 xcalloc (1, sizeof (struct lto_output_stream)));
2734 num_decl_states = num_fns + 1;
2735 lto_output_data_stream (decl_state_stream, &num_decl_states,
2736 sizeof (num_decl_states));
2737 lto_output_decl_state_refs (ob, decl_state_stream, out_state);
2738 for (idx = 0; idx < num_fns; idx++)
2740 fn_out_state =
2741 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2742 lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
2744 lto_write_stream (decl_state_stream);
2745 free(decl_state_stream);
2747 lto_write_stream (ob->main_stream);
2748 lto_write_stream (ob->string_stream);
2750 lto_end_section ();
2752 /* Write the symbol table. It is used by linker to determine dependencies
2753 and thus we can skip it for WPA. */
2754 if (!flag_wpa)
2755 produce_symtab (ob, set, vset);
2757 /* Write command line opts. */
2758 lto_write_options ();
2760 /* Deallocate memory and clean up. */
2761 for (idx = 0; idx < num_fns; idx++)
2763 fn_out_state =
2764 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2765 lto_delete_out_decl_state (fn_out_state);
2767 lto_cgraph_encoder_delete (ob->decl_state->cgraph_node_encoder);
2768 lto_varpool_encoder_delete (ob->decl_state->varpool_node_encoder);
2769 VEC_free (lto_out_decl_state_ptr, heap, lto_function_decl_states);
2770 lto_function_decl_states = NULL;
2771 destroy_output_block (ob);
2775 struct ipa_opt_pass_d pass_ipa_lto_finish_out =
2778 IPA_PASS,
2779 "lto_decls_out", /* name */
2780 gate_lto_out, /* gate */
2781 NULL, /* execute */
2782 NULL, /* sub */
2783 NULL, /* next */
2784 0, /* static_pass_number */
2785 TV_IPA_LTO_DECL_OUT, /* tv_id */
2786 0, /* properties_required */
2787 0, /* properties_provided */
2788 0, /* properties_destroyed */
2789 0, /* todo_flags_start */
2790 0 /* todo_flags_finish */
2792 NULL, /* generate_summary */
2793 produce_asm_for_decls, /* write_summary */
2794 NULL, /* read_summary */
2795 produce_asm_for_decls, /* write_optimization_summary */
2796 NULL, /* read_optimization_summary */
2797 NULL, /* stmt_fixup */
2798 0, /* TODOs */
2799 NULL, /* function_transform */
2800 NULL /* variable_transform */