lto-streamer-out.c (pack_ts_decl_common_value_fields): Revert previous change.
[gcc.git] / gcc / lto-streamer-out.c
1 /* Write the GIMPLE representation to a file stream.
2
3 Copyright 2009 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 "toplev.h"
28 #include "tree.h"
29 #include "expr.h"
30 #include "flags.h"
31 #include "params.h"
32 #include "input.h"
33 #include "varray.h"
34 #include "hashtab.h"
35 #include "basic-block.h"
36 #include "tree-flow.h"
37 #include "tree-pass.h"
38 #include "cgraph.h"
39 #include "function.h"
40 #include "ggc.h"
41 #include "diagnostic.h"
42 #include "except.h"
43 #include "vec.h"
44 #include "lto-symtab.h"
45 #include "lto-streamer.h"
46
47
48 struct string_slot
49 {
50 const char *s;
51 int len;
52 unsigned int slot_num;
53 };
54
55
56 /* Returns a hash code for P. */
57
58 static hashval_t
59 hash_string_slot_node (const void *p)
60 {
61 const struct string_slot *ds = (const struct string_slot *) p;
62 return (hashval_t) htab_hash_string (ds->s);
63 }
64
65
66 /* Returns nonzero if P1 and P2 are equal. */
67
68 static int
69 eq_string_slot_node (const void *p1, const void *p2)
70 {
71 const struct string_slot *ds1 = (const struct string_slot *) p1;
72 const struct string_slot *ds2 = (const struct string_slot *) p2;
73
74 if (ds1->len == ds2->len)
75 {
76 int i;
77 for (i = 0; i < ds1->len; i++)
78 if (ds1->s[i] != ds2->s[i])
79 return 0;
80 return 1;
81 }
82
83 return 0;
84 }
85
86
87 /* Free the string slot pointed-to by P. */
88
89 static void
90 string_slot_free (void *p)
91 {
92 struct string_slot *slot = (struct string_slot *) p;
93 free (CONST_CAST (void *, (const void *) slot->s));
94 free (slot);
95 }
96
97
98 /* Clear the line info stored in DATA_IN. */
99
100 static void
101 clear_line_info (struct output_block *ob)
102 {
103 ob->current_file = NULL;
104 ob->current_line = 0;
105 ob->current_col = 0;
106 }
107
108
109 /* Create the output block and return it. SECTION_TYPE is
110 LTO_section_function_body or LTO_static_initializer. */
111
112 struct output_block *
113 create_output_block (enum lto_section_type section_type)
114 {
115 struct output_block *ob = XCNEW (struct output_block);
116
117 ob->section_type = section_type;
118 ob->decl_state = lto_get_out_decl_state ();
119 ob->main_stream = XCNEW (struct lto_output_stream);
120 ob->string_stream = XCNEW (struct lto_output_stream);
121 ob->writer_cache = lto_streamer_cache_create ();
122
123 if (section_type == LTO_section_function_body)
124 ob->cfg_stream = XCNEW (struct lto_output_stream);
125
126 clear_line_info (ob);
127
128 ob->string_hash_table = htab_create (37, hash_string_slot_node,
129 eq_string_slot_node, string_slot_free);
130
131 return ob;
132 }
133
134
135 /* Destroy the output block OB. */
136
137 void
138 destroy_output_block (struct output_block *ob)
139 {
140 enum lto_section_type section_type = ob->section_type;
141
142 htab_delete (ob->string_hash_table);
143
144 free (ob->main_stream);
145 free (ob->string_stream);
146 if (section_type == LTO_section_function_body)
147 free (ob->cfg_stream);
148
149 lto_streamer_cache_delete (ob->writer_cache);
150
151 free (ob);
152 }
153
154
155 /* Output bitpack BP to output stream S. */
156
157 void
158 lto_output_bitpack (struct lto_output_stream *s, struct bitpack_d *bp)
159 {
160 unsigned i;
161 bitpack_word_t v;
162
163 lto_output_uleb128_stream (s, VEC_length (bitpack_word_t, bp->values));
164 for (i = 0; VEC_iterate (bitpack_word_t, bp->values, i, v); i++)
165 lto_output_uleb128_stream (s, v);
166 }
167
168
169 /* Output STRING of LEN characters to the string
170 table in OB. The string might or might not include a trailing '\0'.
171 Then put the index onto the INDEX_STREAM. */
172
173 static void
174 output_string_with_length (struct output_block *ob,
175 struct lto_output_stream *index_stream,
176 const char *s,
177 unsigned int len)
178 {
179 struct string_slot **slot;
180 struct string_slot s_slot;
181 char *string = (char *) xmalloc (len + 1);
182 memcpy (string, s, len);
183 string[len] = '\0';
184
185 s_slot.s = string;
186 s_slot.len = len;
187 s_slot.slot_num = 0;
188
189 slot = (struct string_slot **) htab_find_slot (ob->string_hash_table,
190 &s_slot, INSERT);
191 if (*slot == NULL)
192 {
193 struct lto_output_stream *string_stream = ob->string_stream;
194 unsigned int start = string_stream->total_size;
195 struct string_slot *new_slot
196 = (struct string_slot *) xmalloc (sizeof (struct string_slot));
197 unsigned int i;
198
199 new_slot->s = string;
200 new_slot->len = len;
201 new_slot->slot_num = start;
202 *slot = new_slot;
203 lto_output_uleb128_stream (index_stream, start);
204 lto_output_uleb128_stream (string_stream, len);
205 for (i = 0; i < len; i++)
206 lto_output_1_stream (string_stream, string[i]);
207 }
208 else
209 {
210 struct string_slot *old_slot = (struct string_slot *)*slot;
211 lto_output_uleb128_stream (index_stream, old_slot->slot_num);
212 free (string);
213 }
214 }
215
216 /* Output the '\0' terminated STRING to the string
217 table in OB. Then put the index onto the INDEX_STREAM. */
218
219 static void
220 output_string (struct output_block *ob,
221 struct lto_output_stream *index_stream,
222 const char *string)
223 {
224 if (string)
225 {
226 lto_output_uleb128_stream (index_stream, 0);
227 output_string_with_length (ob, index_stream, string, strlen (string) + 1);
228 }
229 else
230 lto_output_uleb128_stream (index_stream, 1);
231 }
232
233
234 /* Output the STRING constant to the string
235 table in OB. Then put the index onto the INDEX_STREAM. */
236
237 static void
238 output_string_cst (struct output_block *ob,
239 struct lto_output_stream *index_stream,
240 tree string)
241 {
242 if (string)
243 {
244 lto_output_uleb128_stream (index_stream, 0);
245 output_string_with_length (ob, index_stream,
246 TREE_STRING_POINTER (string),
247 TREE_STRING_LENGTH (string));
248 }
249 else
250 lto_output_uleb128_stream (index_stream, 1);
251 }
252
253
254 /* Output the identifier ID to the string
255 table in OB. Then put the index onto the INDEX_STREAM. */
256
257 static void
258 output_identifier (struct output_block *ob,
259 struct lto_output_stream *index_stream,
260 tree id)
261 {
262 if (id)
263 {
264 lto_output_uleb128_stream (index_stream, 0);
265 output_string_with_length (ob, index_stream,
266 IDENTIFIER_POINTER (id),
267 IDENTIFIER_LENGTH (id));
268 }
269 else
270 lto_output_uleb128_stream (index_stream, 1);
271 }
272
273 /* Write a zero to the output stream. */
274
275 static void
276 output_zero (struct output_block *ob)
277 {
278 lto_output_1_stream (ob->main_stream, 0);
279 }
280
281
282 /* Output an unsigned LEB128 quantity to OB->main_stream. */
283
284 static void
285 output_uleb128 (struct output_block *ob, unsigned HOST_WIDE_INT work)
286 {
287 lto_output_uleb128_stream (ob->main_stream, work);
288 }
289
290
291 /* Output a signed LEB128 quantity to OB->main_stream. */
292
293 static void
294 output_sleb128 (struct output_block *ob, HOST_WIDE_INT work)
295 {
296 lto_output_sleb128_stream (ob->main_stream, work);
297 }
298
299
300 /* Output the start of a record with TAG to output block OB. */
301
302 static void
303 output_record_start (struct output_block *ob, enum LTO_tags tag)
304 {
305 /* Make sure TAG fits inside an unsigned int. */
306 gcc_assert (tag == (enum LTO_tags) (unsigned) tag);
307 output_uleb128 (ob, tag);
308 }
309
310
311 /* Look up NODE in the type table and write the index for it to OB. */
312
313 static void
314 output_type_ref (struct output_block *ob, tree node)
315 {
316 output_record_start (ob, LTO_type_ref);
317 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
318 }
319
320
321 /* Pack all the non-pointer fields of the TS_BASE structure of
322 expression EXPR into bitpack BP. */
323
324 static void
325 pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
326 {
327 bp_pack_value (bp, TREE_CODE (expr), 16);
328 if (!TYPE_P (expr))
329 {
330 bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
331 bp_pack_value (bp, TREE_CONSTANT (expr), 1);
332 bp_pack_value (bp, TREE_READONLY (expr), 1);
333
334 /* TREE_PUBLIC is used on types to indicate that the type
335 has a TYPE_CACHED_VALUES vector. This is not streamed out,
336 so we skip it here. */
337 bp_pack_value (bp, TREE_PUBLIC (expr), 1);
338 }
339 bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
340 bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
341 if (DECL_P (expr))
342 bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
343 else if (TYPE_P (expr))
344 bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
345 bp_pack_value (bp, TREE_ASM_WRITTEN (expr), 1);
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 if (TREE_CODE (expr) == SSA_NAME)
356 bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
357 }
358
359
360 /* Pack all the non-pointer fields of the TS_REAL_CST structure of
361 expression EXPR into bitpack BP. */
362
363 static void
364 pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
365 {
366 unsigned i;
367 REAL_VALUE_TYPE r;
368
369 r = TREE_REAL_CST (expr);
370 bp_pack_value (bp, r.cl, 2);
371 bp_pack_value (bp, r.decimal, 1);
372 bp_pack_value (bp, r.sign, 1);
373 bp_pack_value (bp, r.signalling, 1);
374 bp_pack_value (bp, r.canonical, 1);
375 bp_pack_value (bp, r.uexp, EXP_BITS);
376 for (i = 0; i < SIGSZ; i++)
377 bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
378 }
379
380
381 /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
382 expression EXPR into bitpack BP. */
383
384 static void
385 pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
386 {
387 struct fixed_value fv = TREE_FIXED_CST (expr);
388 bp_pack_value (bp, fv.data.low, HOST_BITS_PER_WIDE_INT);
389 bp_pack_value (bp, fv.data.high, HOST_BITS_PER_WIDE_INT);
390 }
391
392
393 /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
394 of expression EXPR into bitpack BP. */
395
396 static void
397 pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
398 {
399 bp_pack_value (bp, DECL_MODE (expr), 8);
400 bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
401 bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
402 bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
403 bp_pack_value (bp, DECL_ABSTRACT (expr), 1);
404 bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
405 bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
406 bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
407 bp_pack_value (bp, DECL_DEBUG_EXPR_IS_FROM (expr), 1);
408 bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
409 bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
410 bp_pack_value (bp, DECL_ALIGN (expr), HOST_BITS_PER_INT);
411
412 if (TREE_CODE (expr) == LABEL_DECL)
413 {
414 /* Note that we do not write LABEL_DECL_UID. The reader will
415 always assume an initial value of -1 so that the
416 label_to_block_map is recreated by gimple_set_bb. */
417 bp_pack_value (bp, DECL_ERROR_ISSUED (expr), 1);
418 bp_pack_value (bp, EH_LANDING_PAD_NR (expr), HOST_BITS_PER_INT);
419 }
420
421 if (TREE_CODE (expr) == FIELD_DECL)
422 {
423 bp_pack_value (bp, DECL_PACKED (expr), 1);
424 bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
425 bp_pack_value (bp, DECL_OFFSET_ALIGN (expr), 8);
426 }
427
428 if (TREE_CODE (expr) == RESULT_DECL
429 || TREE_CODE (expr) == PARM_DECL
430 || TREE_CODE (expr) == VAR_DECL)
431 {
432 bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
433 if (TREE_CODE (expr) == VAR_DECL
434 || TREE_CODE (expr) == PARM_DECL)
435 bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
436 bp_pack_value (bp, DECL_RESTRICTED_P (expr), 1);
437 }
438 }
439
440
441 /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
442 of expression EXPR into bitpack BP. */
443
444 static void
445 pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
446 {
447 bp_pack_value (bp, DECL_REGISTER (expr), 1);
448 }
449
450
451 /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
452 of expression EXPR into bitpack BP. */
453
454 static void
455 pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
456 {
457 bp_pack_value (bp, DECL_DEFER_OUTPUT (expr), 1);
458 bp_pack_value (bp, DECL_COMMON (expr), 1);
459 bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
460 bp_pack_value (bp, DECL_WEAK (expr), 1);
461 bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1);
462 bp_pack_value (bp, DECL_COMDAT (expr), 1);
463 bp_pack_value (bp, DECL_VISIBILITY (expr), 2);
464 bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1);
465
466 if (TREE_CODE (expr) == VAR_DECL)
467 {
468 bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
469 bp_pack_value (bp, DECL_IN_TEXT_SECTION (expr), 1);
470 bp_pack_value (bp, DECL_TLS_MODEL (expr), 3);
471 }
472
473 if (VAR_OR_FUNCTION_DECL_P (expr))
474 bp_pack_value (bp, DECL_INIT_PRIORITY (expr), HOST_BITS_PER_SHORT);
475 }
476
477
478 /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
479 of expression EXPR into bitpack BP. */
480
481 static void
482 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
483 {
484 /* For normal/md builtins we only write the class and code, so they
485 should never be handled here. */
486 gcc_assert (!lto_stream_as_builtin_p (expr));
487
488 bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 11);
489 bp_pack_value (bp, DECL_BUILT_IN_CLASS (expr), 2);
490 bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
491 bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
492 bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
493 bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
494 bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
495 bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
496 bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
497 bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
498 bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
499 bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
500 bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
501 bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
502 bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
503 bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
504 bp_pack_value (bp, DECL_PURE_P (expr), 1);
505 bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
506 }
507
508
509 /* Pack all the non-pointer fields of the TS_TYPE structure
510 of expression EXPR into bitpack BP. */
511
512 static void
513 pack_ts_type_value_fields (struct bitpack_d *bp, tree expr)
514 {
515 bp_pack_value (bp, TYPE_PRECISION (expr), 9);
516 bp_pack_value (bp, TYPE_MODE (expr), 7);
517 bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
518 bp_pack_value (bp, TYPE_NO_FORCE_BLK (expr), 1);
519 bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING(expr), 1);
520 if (TREE_CODE (expr) == UNION_TYPE)
521 bp_pack_value (bp, TYPE_TRANSPARENT_UNION (expr), 1);
522 bp_pack_value (bp, TYPE_PACKED (expr), 1);
523 bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
524 bp_pack_value (bp, TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr), 2);
525 bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
526 bp_pack_value (bp, TYPE_READONLY (expr), 1);
527 bp_pack_value (bp, TYPE_ALIGN (expr), HOST_BITS_PER_INT);
528 bp_pack_value (bp, TYPE_ALIAS_SET (expr) == 0 ? 0 : -1, HOST_BITS_PER_INT);
529 }
530
531
532 /* Pack all the non-pointer fields of the TS_BLOCK structure
533 of expression EXPR into bitpack BP. */
534
535 static void
536 pack_ts_block_value_fields (struct bitpack_d *bp, tree expr)
537 {
538 bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
539 bp_pack_value (bp, BLOCK_NUMBER (expr), 31);
540 }
541
542
543 /* Pack all the non-pointer fields in EXPR into a bit pack. */
544
545 static struct bitpack_d *
546 pack_value_fields (tree expr)
547 {
548 enum tree_code code;
549 struct bitpack_d *bp;
550
551 code = TREE_CODE (expr);
552 bp = bitpack_create ();
553
554 /* Note that all these functions are highly sensitive to changes in
555 the types and sizes of each of the fields being packed. */
556 pack_ts_base_value_fields (bp, expr);
557
558 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
559 pack_ts_real_cst_value_fields (bp, expr);
560
561 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
562 pack_ts_fixed_cst_value_fields (bp, expr);
563
564 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
565 pack_ts_decl_common_value_fields (bp, expr);
566
567 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
568 pack_ts_decl_wrtl_value_fields (bp, expr);
569
570 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
571 pack_ts_decl_with_vis_value_fields (bp, expr);
572
573 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
574 pack_ts_function_decl_value_fields (bp, expr);
575
576 if (CODE_CONTAINS_STRUCT (code, TS_TYPE))
577 pack_ts_type_value_fields (bp, expr);
578
579 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
580 pack_ts_block_value_fields (bp, expr);
581
582 if (CODE_CONTAINS_STRUCT (code, TS_SSA_NAME))
583 {
584 /* We only stream the version number of SSA names. */
585 gcc_unreachable ();
586 }
587
588 if (CODE_CONTAINS_STRUCT (code, TS_STATEMENT_LIST))
589 {
590 /* This is only used by GENERIC. */
591 gcc_unreachable ();
592 }
593
594 if (CODE_CONTAINS_STRUCT (code, TS_OMP_CLAUSE))
595 {
596 /* This is only used by High GIMPLE. */
597 gcc_unreachable ();
598 }
599
600 return bp;
601 }
602
603
604 /* Emit location LOC to output block OB. */
605
606 static void
607 lto_output_location (struct output_block *ob, location_t loc)
608 {
609 expanded_location xloc;
610
611 if (loc == UNKNOWN_LOCATION)
612 {
613 output_string (ob, ob->main_stream, NULL);
614 return;
615 }
616
617 xloc = expand_location (loc);
618
619 output_string (ob, ob->main_stream, xloc.file);
620 output_sleb128 (ob, xloc.line);
621 output_sleb128 (ob, xloc.column);
622 output_sleb128 (ob, xloc.sysp);
623
624 ob->current_file = xloc.file;
625 ob->current_line = xloc.line;
626 ob->current_col = xloc.column;
627 }
628
629
630 /* Return true if tree node T is written to various tables. For these
631 nodes, we sometimes want to write their phyiscal representation
632 (via lto_output_tree), and sometimes we need to emit an index
633 reference into a table (via lto_output_tree_ref). */
634
635 static bool
636 tree_is_indexable (tree t)
637 {
638 if (TREE_CODE (t) == PARM_DECL)
639 return false;
640 else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t))
641 return false;
642 else
643 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
644 }
645
646
647 /* If EXPR is an indexable tree node, output a reference to it to
648 output block OB. Otherwise, output the physical representation of
649 EXPR to OB. */
650
651 static void
652 lto_output_tree_ref (struct output_block *ob, tree expr)
653 {
654 enum tree_code code;
655
656 if (expr == NULL_TREE)
657 {
658 output_zero (ob);
659 return;
660 }
661
662 if (!tree_is_indexable (expr))
663 {
664 /* Even though we are emitting the physical representation of
665 EXPR, its leaves must be emitted as references. */
666 lto_output_tree (ob, expr, true);
667 return;
668 }
669
670 if (TYPE_P (expr))
671 {
672 output_type_ref (ob, expr);
673 return;
674 }
675
676 code = TREE_CODE (expr);
677 switch (code)
678 {
679 case SSA_NAME:
680 output_record_start (ob, LTO_ssa_name_ref);
681 output_uleb128 (ob, SSA_NAME_VERSION (expr));
682 break;
683
684 case FIELD_DECL:
685 output_record_start (ob, LTO_field_decl_ref);
686 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
687 break;
688
689 case FUNCTION_DECL:
690 output_record_start (ob, LTO_function_decl_ref);
691 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
692 break;
693
694 case VAR_DECL:
695 case DEBUG_EXPR_DECL:
696 gcc_assert (decl_function_context (expr) == NULL);
697 output_record_start (ob, LTO_global_decl_ref);
698 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
699 break;
700
701 case CONST_DECL:
702 output_record_start (ob, LTO_const_decl_ref);
703 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
704 break;
705
706 case IMPORTED_DECL:
707 gcc_assert (decl_function_context (expr) == NULL);
708 output_record_start (ob, LTO_imported_decl_ref);
709 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
710 break;
711
712 case TYPE_DECL:
713 output_record_start (ob, LTO_type_decl_ref);
714 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
715 break;
716
717 case NAMESPACE_DECL:
718 output_record_start (ob, LTO_namespace_decl_ref);
719 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
720 break;
721
722 case LABEL_DECL:
723 output_record_start (ob, LTO_label_decl_ref);
724 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
725 break;
726
727 case RESULT_DECL:
728 output_record_start (ob, LTO_result_decl_ref);
729 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
730 break;
731
732 default:
733 /* No other node is indexable, so it should have been handled
734 by lto_output_tree. */
735 gcc_unreachable ();
736 }
737 }
738
739
740 /* If REF_P is true, emit a reference to EXPR in output block OB,
741 otherwise emit the physical representation of EXPR in OB. */
742
743 static inline void
744 lto_output_tree_or_ref (struct output_block *ob, tree expr, bool ref_p)
745 {
746 if (ref_p)
747 lto_output_tree_ref (ob, expr);
748 else
749 lto_output_tree (ob, expr, false);
750 }
751
752
753 /* Emit the chain of tree nodes starting at T. OB is the output block
754 to write to. REF_P is true if chain elements should be emitted
755 as references. */
756
757 static void
758 lto_output_chain (struct output_block *ob, tree t, bool ref_p)
759 {
760 int i, count;
761
762 count = list_length (t);
763 output_sleb128 (ob, count);
764 for (i = 0; i < count; i++)
765 {
766 tree saved_chain;
767
768 /* Clear TREE_CHAIN to avoid blindly recursing into the rest
769 of the list. */
770 saved_chain = TREE_CHAIN (t);
771 TREE_CHAIN (t) = NULL_TREE;
772
773 lto_output_tree_or_ref (ob, t, ref_p);
774
775 TREE_CHAIN (t) = saved_chain;
776 t = TREE_CHAIN (t);
777 }
778 }
779
780
781 /* Write all pointer fields in the TS_COMMON structure of EXPR to output
782 block OB. If REF_P is true, write a reference to EXPR's pointer
783 fields. */
784
785 static void
786 lto_output_ts_common_tree_pointers (struct output_block *ob, tree expr,
787 bool ref_p)
788 {
789 lto_output_tree_or_ref (ob, TREE_TYPE (expr), ref_p);
790 }
791
792
793 /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
794 block OB. If REF_P is true, write a reference to EXPR's pointer
795 fields. */
796
797 static void
798 lto_output_ts_vector_tree_pointers (struct output_block *ob, tree expr,
799 bool ref_p)
800 {
801 lto_output_chain (ob, TREE_VECTOR_CST_ELTS (expr), ref_p);
802 }
803
804
805 /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
806 block OB. If REF_P is true, write a reference to EXPR's pointer
807 fields. */
808
809 static void
810 lto_output_ts_complex_tree_pointers (struct output_block *ob, tree expr,
811 bool ref_p)
812 {
813 lto_output_tree_or_ref (ob, TREE_REALPART (expr), ref_p);
814 lto_output_tree_or_ref (ob, TREE_IMAGPART (expr), ref_p);
815 }
816
817
818 /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
819 to output block OB. If REF_P is true, write a reference to EXPR's
820 pointer fields. */
821
822 static void
823 lto_output_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
824 bool ref_p)
825 {
826 lto_output_tree_or_ref (ob, DECL_NAME (expr), ref_p);
827 lto_output_tree_or_ref (ob, DECL_CONTEXT (expr), ref_p);
828 lto_output_location (ob, DECL_SOURCE_LOCATION (expr));
829 }
830
831
832 /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
833 output block OB. If REF_P is true, write a reference to EXPR's
834 pointer fields. */
835
836 static void
837 lto_output_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
838 bool ref_p)
839 {
840 lto_output_tree_or_ref (ob, DECL_SIZE (expr), ref_p);
841 lto_output_tree_or_ref (ob, DECL_SIZE_UNIT (expr), ref_p);
842
843 if (TREE_CODE (expr) != FUNCTION_DECL)
844 lto_output_tree_or_ref (ob, DECL_INITIAL (expr), ref_p);
845
846 lto_output_tree_or_ref (ob, DECL_ATTRIBUTES (expr), ref_p);
847 lto_output_tree_or_ref (ob, DECL_ABSTRACT_ORIGIN (expr), ref_p);
848
849 if (TREE_CODE (expr) == PARM_DECL)
850 lto_output_chain (ob, TREE_CHAIN (expr), ref_p);
851
852 if ((TREE_CODE (expr) == VAR_DECL
853 || TREE_CODE (expr) == PARM_DECL)
854 && DECL_HAS_VALUE_EXPR_P (expr))
855 lto_output_tree_or_ref (ob, DECL_VALUE_EXPR (expr), ref_p);
856 }
857
858
859 /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
860 EXPR to output block OB. If REF_P is true, write a reference to EXPR's
861 pointer fields. */
862
863 static void
864 lto_output_ts_decl_non_common_tree_pointers (struct output_block *ob,
865 tree expr, bool ref_p)
866 {
867 if (TREE_CODE (expr) == FUNCTION_DECL)
868 {
869 /* DECL_SAVED_TREE holds the GENERIC representation for DECL.
870 At this point, it should not exist. Either because it was
871 converted to gimple or because DECL didn't have a GENERIC
872 representation in this TU. */
873 gcc_assert (DECL_SAVED_TREE (expr) == NULL_TREE);
874 lto_output_tree_or_ref (ob, DECL_ARGUMENTS (expr), ref_p);
875 lto_output_tree_or_ref (ob, DECL_RESULT (expr), ref_p);
876 }
877 lto_output_tree_or_ref (ob, DECL_VINDEX (expr), ref_p);
878 }
879
880
881 /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
882 to output block OB. If REF_P is true, write a reference to EXPR's
883 pointer fields. */
884
885 static void
886 lto_output_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
887 bool ref_p)
888 {
889 /* Make sure we don't inadvertently set the assembler name. */
890 if (DECL_ASSEMBLER_NAME_SET_P (expr))
891 lto_output_tree_or_ref (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
892 else
893 output_zero (ob);
894
895 lto_output_tree_or_ref (ob, DECL_SECTION_NAME (expr), ref_p);
896 lto_output_tree_or_ref (ob, DECL_COMDAT_GROUP (expr), ref_p);
897 }
898
899
900 /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
901 output block OB. If REF_P is true, write a reference to EXPR's
902 pointer fields. */
903
904 static void
905 lto_output_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
906 bool ref_p)
907 {
908 lto_output_tree_or_ref (ob, DECL_FIELD_OFFSET (expr), ref_p);
909 lto_output_tree_or_ref (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
910 lto_output_tree_or_ref (ob, DECL_QUALIFIER (expr), ref_p);
911 lto_output_tree_or_ref (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
912 lto_output_tree_or_ref (ob, DECL_FCONTEXT (expr), ref_p);
913 lto_output_chain (ob, TREE_CHAIN (expr), ref_p);
914 }
915
916
917 /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
918 to output block OB. If REF_P is true, write a reference to EXPR's
919 pointer fields. */
920
921 static void
922 lto_output_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
923 bool ref_p)
924 {
925 /* DECL_STRUCT_FUNCTION is handled by lto_output_function. FIXME lto,
926 maybe it should be handled here? */
927 lto_output_tree_or_ref (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
928 lto_output_tree_or_ref (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
929 lto_output_tree_or_ref (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr),
930 ref_p);
931 }
932
933
934 /* Write all pointer fields in the TS_TYPE structure of EXPR to output
935 block OB. If REF_P is true, write a reference to EXPR's pointer
936 fields. */
937
938 static void
939 lto_output_ts_type_tree_pointers (struct output_block *ob, tree expr,
940 bool ref_p)
941 {
942 if (TREE_CODE (expr) == ENUMERAL_TYPE)
943 lto_output_tree_or_ref (ob, TYPE_VALUES (expr), ref_p);
944 else if (TREE_CODE (expr) == ARRAY_TYPE)
945 lto_output_tree_or_ref (ob, TYPE_DOMAIN (expr), ref_p);
946 else if (TREE_CODE (expr) == RECORD_TYPE || TREE_CODE (expr) == UNION_TYPE)
947 lto_output_tree_or_ref (ob, TYPE_FIELDS (expr), ref_p);
948 else if (TREE_CODE (expr) == FUNCTION_TYPE || TREE_CODE (expr) == METHOD_TYPE)
949 lto_output_tree_or_ref (ob, TYPE_ARG_TYPES (expr), ref_p);
950 else if (TREE_CODE (expr) == VECTOR_TYPE)
951 lto_output_tree_or_ref (ob, TYPE_DEBUG_REPRESENTATION_TYPE (expr), ref_p);
952
953 lto_output_tree_or_ref (ob, TYPE_SIZE (expr), ref_p);
954 lto_output_tree_or_ref (ob, TYPE_SIZE_UNIT (expr), ref_p);
955 lto_output_tree_or_ref (ob, TYPE_ATTRIBUTES (expr), ref_p);
956 lto_output_tree_or_ref (ob, TYPE_NAME (expr), ref_p);
957 /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO nor
958 TYPE_NEXT_PTR_TO or TYPE_NEXT_REF_TO. */
959 if (!POINTER_TYPE_P (expr))
960 lto_output_tree_or_ref (ob, TYPE_MINVAL (expr), ref_p);
961 lto_output_tree_or_ref (ob, TYPE_MAXVAL (expr), ref_p);
962 lto_output_tree_or_ref (ob, TYPE_MAIN_VARIANT (expr), ref_p);
963 /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
964 during fixup. */
965 if (TREE_CODE (expr) == RECORD_TYPE || TREE_CODE (expr) == UNION_TYPE)
966 lto_output_tree_or_ref (ob, TYPE_BINFO (expr), ref_p);
967 lto_output_tree_or_ref (ob, TYPE_CONTEXT (expr), ref_p);
968 lto_output_tree_or_ref (ob, TYPE_CANONICAL (expr), ref_p);
969 }
970
971
972 /* Write all pointer fields in the TS_LIST structure of EXPR to output
973 block OB. If REF_P is true, write a reference to EXPR's pointer
974 fields. */
975
976 static void
977 lto_output_ts_list_tree_pointers (struct output_block *ob, tree expr,
978 bool ref_p)
979 {
980 lto_output_tree_or_ref (ob, TREE_PURPOSE (expr), ref_p);
981 lto_output_tree_or_ref (ob, TREE_VALUE (expr), ref_p);
982 lto_output_chain (ob, TREE_CHAIN (expr), ref_p);
983 }
984
985
986 /* Write all pointer fields in the TS_VEC structure of EXPR to output
987 block OB. If REF_P is true, write a reference to EXPR's pointer
988 fields. */
989
990 static void
991 lto_output_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
992 {
993 int i;
994
995 /* Note that the number of slots for EXPR has already been emitted
996 in EXPR's header (see lto_output_tree_header). */
997 for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
998 lto_output_tree_or_ref (ob, TREE_VEC_ELT (expr, i), ref_p);
999 }
1000
1001
1002 /* Write all pointer fields in the TS_EXP structure of EXPR to output
1003 block OB. If REF_P is true, write a reference to EXPR's pointer
1004 fields. */
1005
1006 static void
1007 lto_output_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
1008 {
1009 int i;
1010
1011 output_sleb128 (ob, TREE_OPERAND_LENGTH (expr));
1012 for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
1013 lto_output_tree_or_ref (ob, TREE_OPERAND (expr, i), ref_p);
1014 lto_output_location (ob, EXPR_LOCATION (expr));
1015 lto_output_tree_or_ref (ob, TREE_BLOCK (expr), ref_p);
1016 }
1017
1018
1019 /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
1020 block OB. If REF_P is true, write a reference to EXPR's pointer
1021 fields. */
1022
1023 static void
1024 lto_output_ts_block_tree_pointers (struct output_block *ob, tree expr,
1025 bool ref_p)
1026 {
1027 unsigned i;
1028 tree t;
1029
1030 lto_output_location (ob, BLOCK_SOURCE_LOCATION (expr));
1031 lto_output_chain (ob, BLOCK_VARS (expr), ref_p);
1032
1033 output_uleb128 (ob, VEC_length (tree, BLOCK_NONLOCALIZED_VARS (expr)));
1034 for (i = 0; VEC_iterate (tree, BLOCK_NONLOCALIZED_VARS (expr), i, t); i++)
1035 lto_output_tree_or_ref (ob, t, ref_p);
1036
1037 lto_output_tree_or_ref (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
1038 lto_output_tree_or_ref (ob, BLOCK_ABSTRACT_ORIGIN (expr), ref_p);
1039 lto_output_tree_or_ref (ob, BLOCK_FRAGMENT_ORIGIN (expr), ref_p);
1040 lto_output_tree_or_ref (ob, BLOCK_FRAGMENT_CHAIN (expr), ref_p);
1041 lto_output_chain (ob, BLOCK_SUBBLOCKS (expr), ref_p);
1042 }
1043
1044
1045 /* Write all pointer fields in the TS_BINFO structure of EXPR to output
1046 block OB. If REF_P is true, write a reference to EXPR's pointer
1047 fields. */
1048
1049 static void
1050 lto_output_ts_binfo_tree_pointers (struct output_block *ob, tree expr,
1051 bool ref_p)
1052 {
1053 unsigned i;
1054 tree t;
1055
1056 /* Note that the number of BINFO slots has already been emitted in
1057 EXPR's header (see lto_output_tree_header) because this length
1058 is needed to build the empty BINFO node on the reader side. */
1059 for (i = 0; VEC_iterate (tree, BINFO_BASE_BINFOS (expr), i, t); i++)
1060 lto_output_tree_or_ref (ob, t, ref_p);
1061 output_zero (ob);
1062
1063 lto_output_tree_or_ref (ob, BINFO_OFFSET (expr), ref_p);
1064 lto_output_tree_or_ref (ob, BINFO_VTABLE (expr), ref_p);
1065 lto_output_tree_or_ref (ob, BINFO_VIRTUALS (expr), ref_p);
1066 lto_output_tree_or_ref (ob, BINFO_VPTR_FIELD (expr), ref_p);
1067
1068 output_uleb128 (ob, VEC_length (tree, BINFO_BASE_ACCESSES (expr)));
1069 for (i = 0; VEC_iterate (tree, BINFO_BASE_ACCESSES (expr), i, t); i++)
1070 lto_output_tree_or_ref (ob, t, ref_p);
1071
1072 lto_output_tree_or_ref (ob, BINFO_INHERITANCE_CHAIN (expr), ref_p);
1073 lto_output_tree_or_ref (ob, BINFO_SUBVTT_INDEX (expr), ref_p);
1074 lto_output_tree_or_ref (ob, BINFO_VPTR_INDEX (expr), ref_p);
1075 }
1076
1077
1078 /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
1079 output block OB. If REF_P is true, write a reference to EXPR's
1080 pointer fields. */
1081
1082 static void
1083 lto_output_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
1084 bool ref_p)
1085 {
1086 unsigned i;
1087 tree index, value;
1088
1089 output_uleb128 (ob, CONSTRUCTOR_NELTS (expr));
1090 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
1091 {
1092 lto_output_tree_or_ref (ob, index, ref_p);
1093 lto_output_tree_or_ref (ob, value, ref_p);
1094 }
1095 }
1096
1097
1098 /* Helper for lto_output_tree. Write all pointer fields in EXPR to output
1099 block OB. If REF_P is true, the leaves of EXPR are emitted as
1100 references. */
1101
1102 static void
1103 lto_output_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
1104 {
1105 enum tree_code code;
1106
1107 code = TREE_CODE (expr);
1108
1109 if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
1110 lto_output_ts_common_tree_pointers (ob, expr, ref_p);
1111
1112 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1113 lto_output_ts_vector_tree_pointers (ob, expr, ref_p);
1114
1115 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1116 lto_output_ts_complex_tree_pointers (ob, expr, ref_p);
1117
1118 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1119 lto_output_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
1120
1121 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1122 lto_output_ts_decl_common_tree_pointers (ob, expr, ref_p);
1123
1124 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
1125 lto_output_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
1126
1127 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1128 lto_output_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
1129
1130 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1131 lto_output_ts_field_decl_tree_pointers (ob, expr, ref_p);
1132
1133 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1134 lto_output_ts_function_decl_tree_pointers (ob, expr, ref_p);
1135
1136 if (CODE_CONTAINS_STRUCT (code, TS_TYPE))
1137 lto_output_ts_type_tree_pointers (ob, expr, ref_p);
1138
1139 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1140 lto_output_ts_list_tree_pointers (ob, expr, ref_p);
1141
1142 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1143 lto_output_ts_vec_tree_pointers (ob, expr, ref_p);
1144
1145 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1146 lto_output_ts_exp_tree_pointers (ob, expr, ref_p);
1147
1148 if (CODE_CONTAINS_STRUCT (code, TS_SSA_NAME))
1149 {
1150 /* We only stream the version number of SSA names. */
1151 gcc_unreachable ();
1152 }
1153
1154 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
1155 lto_output_ts_block_tree_pointers (ob, expr, ref_p);
1156
1157 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1158 lto_output_ts_binfo_tree_pointers (ob, expr, ref_p);
1159
1160 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1161 lto_output_ts_constructor_tree_pointers (ob, expr, ref_p);
1162
1163 if (CODE_CONTAINS_STRUCT (code, TS_STATEMENT_LIST))
1164 {
1165 /* This should only appear in GENERIC. */
1166 gcc_unreachable ();
1167 }
1168
1169 if (CODE_CONTAINS_STRUCT (code, TS_OMP_CLAUSE))
1170 {
1171 /* This should only appear in High GIMPLE. */
1172 gcc_unreachable ();
1173 }
1174
1175 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
1176 sorry ("gimple bytecode streams do not support the optimization attribute");
1177
1178 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
1179 sorry ("gimple bytecode streams do not support the target attribute");
1180 }
1181
1182
1183 /* Emit header information for tree EXPR to output block OB. The header
1184 contains everything needed to instantiate an empty skeleton for
1185 EXPR on the reading side. IX is the index into the streamer cache
1186 where EXPR is stored. REF_P is as in lto_output_tree. */
1187
1188 static void
1189 lto_output_tree_header (struct output_block *ob, tree expr, int ix)
1190 {
1191 enum LTO_tags tag;
1192 enum tree_code code;
1193
1194 /* We should not see any non-GIMPLE tree nodes here. */
1195 code = TREE_CODE (expr);
1196 if (!lto_is_streamable (expr))
1197 internal_error ("tree code %qs is not supported in gimple streams",
1198 tree_code_name[code]);
1199
1200 /* The header of a tree node consists of its tag, the size of
1201 the node, and any other information needed to instantiate
1202 EXPR on the reading side (such as the number of slots in
1203 variable sized nodes). */
1204 tag = lto_tree_code_to_tag (code);
1205 output_record_start (ob, tag);
1206 output_sleb128 (ob, ix);
1207
1208 /* The following will cause bootstrap miscomparisons. Enable with care. */
1209 #ifdef LTO_STREAMER_DEBUG
1210 /* This is used mainly for debugging purposes. When the reader
1211 and the writer do not agree on a streamed node, the pointer
1212 value for EXPR can be used to track down the differences in
1213 the debugger. */
1214 gcc_assert ((HOST_WIDEST_INT) (intptr_t) expr == (intptr_t) expr);
1215 output_sleb128 (ob, (HOST_WIDEST_INT) (intptr_t) expr);
1216 #endif
1217
1218 /* The text in strings and identifiers are completely emitted in
1219 the header. */
1220 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
1221 output_string_cst (ob, ob->main_stream, expr);
1222 else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
1223 output_identifier (ob, ob->main_stream, expr);
1224 else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1225 output_sleb128 (ob, TREE_VEC_LENGTH (expr));
1226 else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1227 output_uleb128 (ob, BINFO_N_BASE_BINFOS (expr));
1228 }
1229
1230
1231 /* Write the code and class of builtin EXPR to output block OB. IX is
1232 the index into the streamer cache where EXPR is stored.*/
1233
1234 static void
1235 lto_output_builtin_tree (struct output_block *ob, tree expr, int ix)
1236 {
1237 gcc_assert (lto_stream_as_builtin_p (expr));
1238
1239 if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD
1240 && !targetm.builtin_decl)
1241 sorry ("gimple bytecode streams do not support machine specific builtin "
1242 "functions on this target");
1243
1244 output_record_start (ob, LTO_builtin_decl);
1245 output_uleb128 (ob, DECL_BUILT_IN_CLASS (expr));
1246 output_uleb128 (ob, DECL_FUNCTION_CODE (expr));
1247 output_sleb128 (ob, ix);
1248
1249 if (DECL_ASSEMBLER_NAME_SET_P (expr))
1250 {
1251 /* When the assembler name of a builtin gets a user name,
1252 the new name is always prefixed with '*' by
1253 set_builtin_user_assembler_name. So, to prevent the
1254 reader side from adding a second '*', we omit it here. */
1255 const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr));
1256 if (strlen (str) > 1 && str[0] == '*')
1257 output_string (ob, ob->main_stream, &str[1]);
1258 else
1259 output_string (ob, ob->main_stream, NULL);
1260 }
1261 else
1262 output_string (ob, ob->main_stream, NULL);
1263 }
1264
1265
1266 /* Write a physical representation of tree node EXPR to output block
1267 OB. If REF_P is true, the leaves of EXPR are emitted as references
1268 via lto_output_tree_ref. IX is the index into the streamer cache
1269 where EXPR is stored. */
1270
1271 static void
1272 lto_write_tree (struct output_block *ob, tree expr, bool ref_p, int ix)
1273 {
1274 struct bitpack_d *bp;
1275
1276 /* Write the header, containing everything needed to materialize
1277 EXPR on the reading side. */
1278 lto_output_tree_header (ob, expr, ix);
1279
1280 /* Pack all the non-pointer fields in EXPR into a bitpack and write
1281 the resulting bitpack. */
1282 bp = pack_value_fields (expr);
1283 lto_output_bitpack (ob->main_stream, bp);
1284 bitpack_delete (bp);
1285
1286 /* Write all the pointer fields in EXPR. */
1287 lto_output_tree_pointers (ob, expr, ref_p);
1288
1289 /* Mark the end of EXPR. */
1290 output_zero (ob);
1291 }
1292
1293
1294 /* Emit the integer constant CST to output block OB. If REF_P is true,
1295 CST's type will be emitted as a reference. */
1296
1297 static void
1298 lto_output_integer_cst (struct output_block *ob, tree cst, bool ref_p)
1299 {
1300 output_record_start (ob, lto_tree_code_to_tag (INTEGER_CST));
1301 lto_output_tree_or_ref (ob, TREE_TYPE (cst), ref_p);
1302 lto_output_1_stream (ob->main_stream, TREE_OVERFLOW_P (cst));
1303 output_uleb128 (ob, TREE_INT_CST_LOW (cst));
1304 output_uleb128 (ob, TREE_INT_CST_HIGH (cst));
1305 }
1306
1307
1308 /* Emit the physical representation of tree node EXPR to output block
1309 OB. If REF_P is true, the leaves of EXPR are emitted as references
1310 via lto_output_tree_ref. */
1311
1312 void
1313 lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
1314 {
1315 int ix;
1316 bool existed_p;
1317 unsigned offset;
1318
1319 if (expr == NULL_TREE)
1320 {
1321 output_zero (ob);
1322 return;
1323 }
1324
1325 /* INTEGER_CST nodes are special because they need their original type
1326 to be materialized by the reader (to implement TYPE_CACHED_VALUES). */
1327 if (TREE_CODE (expr) == INTEGER_CST)
1328 {
1329 lto_output_integer_cst (ob, expr, ref_p);
1330 return;
1331 }
1332
1333 /* Determine the offset in the stream where EXPR will be written.
1334 This is used when emitting pickle references so the reader knows
1335 where to reconstruct the pickled object from. This allows
1336 circular and forward references within the same stream. */
1337 offset = ob->main_stream->total_size;
1338
1339 existed_p = lto_streamer_cache_insert (ob->writer_cache, expr, &ix, &offset);
1340 if (existed_p)
1341 {
1342 /* If a node has already been streamed out, make sure that
1343 we don't write it more than once. Otherwise, the reader
1344 will instantiate two different nodes for the same object. */
1345 output_record_start (ob, LTO_tree_pickle_reference);
1346 output_sleb128 (ob, ix);
1347 output_uleb128 (ob, lto_tree_code_to_tag (TREE_CODE (expr)));
1348 output_uleb128 (ob, offset);
1349 }
1350 else if (lto_stream_as_builtin_p (expr))
1351 {
1352 /* MD and NORMAL builtins do not need to be written out
1353 completely as they are always instantiated by the
1354 compiler on startup. The only builtins that need to
1355 be written out are BUILT_IN_FRONTEND. For all other
1356 builtins, we simply write the class and code. */
1357 lto_output_builtin_tree (ob, expr, ix);
1358 }
1359 else
1360 {
1361 /* This is the first time we see EXPR, write its fields
1362 to OB. */
1363 lto_write_tree (ob, expr, ref_p, ix);
1364 }
1365 }
1366
1367
1368 /* Output to OB a list of try/catch handlers starting with FIRST. */
1369
1370 static void
1371 output_eh_try_list (struct output_block *ob, eh_catch first)
1372 {
1373 eh_catch n;
1374
1375 for (n = first; n; n = n->next_catch)
1376 {
1377 output_record_start (ob, LTO_eh_catch);
1378 lto_output_tree_ref (ob, n->type_list);
1379 lto_output_tree_ref (ob, n->filter_list);
1380 lto_output_tree_ref (ob, n->label);
1381 }
1382
1383 output_zero (ob);
1384 }
1385
1386
1387 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1388 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1389 detect EH region sharing. */
1390
1391 static void
1392 output_eh_region (struct output_block *ob, eh_region r)
1393 {
1394 enum LTO_tags tag;
1395
1396 if (r == NULL)
1397 {
1398 output_zero (ob);
1399 return;
1400 }
1401
1402 if (r->type == ERT_CLEANUP)
1403 tag = LTO_ert_cleanup;
1404 else if (r->type == ERT_TRY)
1405 tag = LTO_ert_try;
1406 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1407 tag = LTO_ert_allowed_exceptions;
1408 else if (r->type == ERT_MUST_NOT_THROW)
1409 tag = LTO_ert_must_not_throw;
1410 else
1411 gcc_unreachable ();
1412
1413 output_record_start (ob, tag);
1414 output_sleb128 (ob, r->index);
1415
1416 if (r->outer)
1417 output_sleb128 (ob, r->outer->index);
1418 else
1419 output_zero (ob);
1420
1421 if (r->inner)
1422 output_sleb128 (ob, r->inner->index);
1423 else
1424 output_zero (ob);
1425
1426 if (r->next_peer)
1427 output_sleb128 (ob, r->next_peer->index);
1428 else
1429 output_zero (ob);
1430
1431 if (r->type == ERT_TRY)
1432 {
1433 output_eh_try_list (ob, r->u.eh_try.first_catch);
1434 }
1435 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1436 {
1437 lto_output_tree_ref (ob, r->u.allowed.type_list);
1438 lto_output_tree_ref (ob, r->u.allowed.label);
1439 output_uleb128 (ob, r->u.allowed.filter);
1440 }
1441 else if (r->type == ERT_MUST_NOT_THROW)
1442 {
1443 lto_output_tree_ref (ob, r->u.must_not_throw.failure_decl);
1444 lto_output_location (ob, r->u.must_not_throw.failure_loc);
1445 }
1446
1447 if (r->landing_pads)
1448 output_sleb128 (ob, r->landing_pads->index);
1449 else
1450 output_zero (ob);
1451 }
1452
1453
1454 /* Output landing pad LP to OB. */
1455
1456 static void
1457 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1458 {
1459 if (lp == NULL)
1460 {
1461 output_zero (ob);
1462 return;
1463 }
1464
1465 output_record_start (ob, LTO_eh_landing_pad);
1466 output_sleb128 (ob, lp->index);
1467 if (lp->next_lp)
1468 output_sleb128 (ob, lp->next_lp->index);
1469 else
1470 output_zero (ob);
1471
1472 if (lp->region)
1473 output_sleb128 (ob, lp->region->index);
1474 else
1475 output_zero (ob);
1476
1477 lto_output_tree_ref (ob, lp->post_landing_pad);
1478 }
1479
1480
1481 /* Output the existing eh_table to OB. */
1482
1483 static void
1484 output_eh_regions (struct output_block *ob, struct function *fn)
1485 {
1486 if (fn->eh && fn->eh->region_tree)
1487 {
1488 unsigned i;
1489 eh_region eh;
1490 eh_landing_pad lp;
1491 tree ttype;
1492
1493 output_record_start (ob, LTO_eh_table);
1494
1495 /* Emit the index of the root of the EH region tree. */
1496 output_sleb128 (ob, fn->eh->region_tree->index);
1497
1498 /* Emit all the EH regions in the region array. */
1499 output_sleb128 (ob, VEC_length (eh_region, fn->eh->region_array));
1500 for (i = 0; VEC_iterate (eh_region, fn->eh->region_array, i, eh); i++)
1501 output_eh_region (ob, eh);
1502
1503 /* Emit all landing pads. */
1504 output_sleb128 (ob, VEC_length (eh_landing_pad, fn->eh->lp_array));
1505 for (i = 0; VEC_iterate (eh_landing_pad, fn->eh->lp_array, i, lp); i++)
1506 output_eh_lp (ob, lp);
1507
1508 /* Emit all the runtime type data. */
1509 output_sleb128 (ob, VEC_length (tree, fn->eh->ttype_data));
1510 for (i = 0; VEC_iterate (tree, fn->eh->ttype_data, i, ttype); i++)
1511 lto_output_tree_ref (ob, ttype);
1512
1513 /* Emit the table of action chains. */
1514 if (targetm.arm_eabi_unwinder)
1515 {
1516 tree t;
1517 output_sleb128 (ob, VEC_length (tree, fn->eh->ehspec_data.arm_eabi));
1518 for (i = 0;
1519 VEC_iterate (tree, fn->eh->ehspec_data.arm_eabi, i, t);
1520 i++)
1521 lto_output_tree_ref (ob, t);
1522 }
1523 else
1524 {
1525 uchar c;
1526 output_sleb128 (ob, VEC_length (uchar, fn->eh->ehspec_data.other));
1527 for (i = 0; VEC_iterate (uchar, fn->eh->ehspec_data.other, i, c); i++)
1528 lto_output_1_stream (ob->main_stream, c);
1529 }
1530 }
1531
1532 /* The 0 either terminates the record or indicates that there are no
1533 eh_records at all. */
1534 output_zero (ob);
1535 }
1536
1537
1538 /* Output all of the active ssa names to the ssa_names stream. */
1539
1540 static void
1541 output_ssa_names (struct output_block *ob, struct function *fn)
1542 {
1543 unsigned int i, len;
1544
1545 len = VEC_length (tree, SSANAMES (fn));
1546 output_uleb128 (ob, len);
1547
1548 for (i = 1; i < len; i++)
1549 {
1550 tree ptr = VEC_index (tree, SSANAMES (fn), i);
1551
1552 if (ptr == NULL_TREE
1553 || SSA_NAME_IN_FREE_LIST (ptr)
1554 || !is_gimple_reg (ptr))
1555 continue;
1556
1557 output_uleb128 (ob, i);
1558 lto_output_1_stream (ob->main_stream, SSA_NAME_IS_DEFAULT_DEF (ptr));
1559 lto_output_tree_ref (ob, SSA_NAME_VAR (ptr));
1560 }
1561
1562 output_zero (ob);
1563 }
1564
1565
1566 /* Output the cfg. */
1567
1568 static void
1569 output_cfg (struct output_block *ob, struct function *fn)
1570 {
1571 struct lto_output_stream *tmp_stream = ob->main_stream;
1572 basic_block bb;
1573
1574 ob->main_stream = ob->cfg_stream;
1575
1576 output_uleb128 (ob, profile_status_for_function (fn));
1577
1578 /* Output the number of the highest basic block. */
1579 output_uleb128 (ob, last_basic_block_for_function (fn));
1580
1581 FOR_ALL_BB_FN (bb, fn)
1582 {
1583 edge_iterator ei;
1584 edge e;
1585
1586 output_sleb128 (ob, bb->index);
1587
1588 /* Output the successors and the edge flags. */
1589 output_uleb128 (ob, EDGE_COUNT (bb->succs));
1590 FOR_EACH_EDGE (e, ei, bb->succs)
1591 {
1592 output_uleb128 (ob, e->dest->index);
1593 output_sleb128 (ob, e->probability);
1594 output_sleb128 (ob, e->count);
1595 output_uleb128 (ob, e->flags);
1596 }
1597 }
1598
1599 output_sleb128 (ob, -1);
1600
1601 bb = ENTRY_BLOCK_PTR;
1602 while (bb->next_bb)
1603 {
1604 output_sleb128 (ob, bb->next_bb->index);
1605 bb = bb->next_bb;
1606 }
1607
1608 output_sleb128 (ob, -1);
1609
1610 ob->main_stream = tmp_stream;
1611 }
1612
1613
1614 /* Output PHI function PHI to the main stream in OB. */
1615
1616 static void
1617 output_phi (struct output_block *ob, gimple phi)
1618 {
1619 unsigned i, len = gimple_phi_num_args (phi);
1620
1621 output_record_start (ob, lto_gimple_code_to_tag (GIMPLE_PHI));
1622 output_uleb128 (ob, SSA_NAME_VERSION (PHI_RESULT (phi)));
1623
1624 for (i = 0; i < len; i++)
1625 {
1626 lto_output_tree_ref (ob, gimple_phi_arg_def (phi, i));
1627 output_uleb128 (ob, gimple_phi_arg_edge (phi, i)->src->index);
1628 lto_output_location (ob, gimple_phi_arg_location (phi, i));
1629 }
1630 }
1631
1632
1633 /* Emit statement STMT on the main stream of output block OB. */
1634
1635 static void
1636 output_gimple_stmt (struct output_block *ob, gimple stmt)
1637 {
1638 unsigned i;
1639 enum gimple_code code;
1640 enum LTO_tags tag;
1641 struct bitpack_d *bp;
1642
1643 /* Emit identifying tag. */
1644 code = gimple_code (stmt);
1645 tag = lto_gimple_code_to_tag (code);
1646 output_record_start (ob, tag);
1647
1648 /* Emit the tuple header. */
1649 bp = bitpack_create ();
1650 bp_pack_value (bp, gimple_num_ops (stmt), sizeof (unsigned) * 8);
1651 bp_pack_value (bp, gimple_no_warning_p (stmt), 1);
1652 if (is_gimple_assign (stmt))
1653 bp_pack_value (bp, gimple_assign_nontemporal_move_p (stmt), 1);
1654 bp_pack_value (bp, gimple_has_volatile_ops (stmt), 1);
1655 bp_pack_value (bp, stmt->gsbase.subcode, 16);
1656 lto_output_bitpack (ob->main_stream, bp);
1657 bitpack_delete (bp);
1658
1659 /* Emit location information for the statement. */
1660 lto_output_location (ob, gimple_location (stmt));
1661
1662 /* Emit the lexical block holding STMT. */
1663 lto_output_tree (ob, gimple_block (stmt), true);
1664
1665 /* Emit the operands. */
1666 switch (gimple_code (stmt))
1667 {
1668 case GIMPLE_RESX:
1669 output_sleb128 (ob, gimple_resx_region (stmt));
1670 break;
1671
1672 case GIMPLE_EH_MUST_NOT_THROW:
1673 lto_output_tree_ref (ob, gimple_eh_must_not_throw_fndecl (stmt));
1674 break;
1675
1676 case GIMPLE_EH_DISPATCH:
1677 output_sleb128 (ob, gimple_eh_dispatch_region (stmt));
1678 break;
1679
1680 case GIMPLE_ASM:
1681 lto_output_uleb128_stream (ob->main_stream, gimple_asm_ninputs (stmt));
1682 lto_output_uleb128_stream (ob->main_stream, gimple_asm_noutputs (stmt));
1683 lto_output_uleb128_stream (ob->main_stream, gimple_asm_nclobbers (stmt));
1684 output_string (ob, ob->main_stream, gimple_asm_string (stmt));
1685 /* Fallthru */
1686
1687 case GIMPLE_ASSIGN:
1688 case GIMPLE_CALL:
1689 case GIMPLE_RETURN:
1690 case GIMPLE_SWITCH:
1691 case GIMPLE_LABEL:
1692 case GIMPLE_COND:
1693 case GIMPLE_GOTO:
1694 case GIMPLE_DEBUG:
1695 for (i = 0; i < gimple_num_ops (stmt); i++)
1696 {
1697 tree op = gimple_op (stmt, i);
1698 lto_output_tree_ref (ob, op);
1699 }
1700 break;
1701
1702 case GIMPLE_NOP:
1703 case GIMPLE_PREDICT:
1704 break;
1705
1706 default:
1707 gcc_unreachable ();
1708 }
1709 }
1710
1711
1712 /* Output a basic block BB to the main stream in OB for this FN. */
1713
1714 static void
1715 output_bb (struct output_block *ob, basic_block bb, struct function *fn)
1716 {
1717 gimple_stmt_iterator bsi = gsi_start_bb (bb);
1718
1719 output_record_start (ob,
1720 (!gsi_end_p (bsi)) || phi_nodes (bb)
1721 ? LTO_bb1
1722 : LTO_bb0);
1723
1724 output_uleb128 (ob, bb->index);
1725 output_sleb128 (ob, bb->count);
1726 output_sleb128 (ob, bb->loop_depth);
1727 output_sleb128 (ob, bb->frequency);
1728 output_sleb128 (ob, bb->flags);
1729
1730 if (!gsi_end_p (bsi) || phi_nodes (bb))
1731 {
1732 /* Output the statements. The list of statements is terminated
1733 with a zero. */
1734 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1735 {
1736 int region;
1737 gimple stmt = gsi_stmt (bsi);
1738
1739 output_gimple_stmt (ob, stmt);
1740
1741 /* Emit the EH region holding STMT. */
1742 region = lookup_stmt_eh_lp_fn (fn, stmt);
1743 if (region != 0)
1744 {
1745 output_record_start (ob, LTO_eh_region);
1746 output_sleb128 (ob, region);
1747 }
1748 else
1749 output_zero (ob);
1750 }
1751
1752 output_zero (ob);
1753
1754 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1755 {
1756 gimple phi = gsi_stmt (bsi);
1757
1758 /* Only emit PHIs for gimple registers. PHI nodes for .MEM
1759 will be filled in on reading when the SSA form is
1760 updated. */
1761 if (is_gimple_reg (gimple_phi_result (phi)))
1762 output_phi (ob, phi);
1763 }
1764
1765 output_zero (ob);
1766 }
1767 }
1768
1769 /* Create the header in the file using OB. If the section type is for
1770 a function, set FN to the decl for that function. */
1771
1772 void
1773 produce_asm (struct output_block *ob, tree fn)
1774 {
1775 enum lto_section_type section_type = ob->section_type;
1776 struct lto_function_header header;
1777 char *section_name;
1778 struct lto_output_stream *header_stream;
1779
1780 if (section_type == LTO_section_function_body)
1781 {
1782 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1783 section_name = lto_get_section_name (section_type, name);
1784 }
1785 else
1786 section_name = lto_get_section_name (section_type, NULL);
1787
1788 lto_begin_section (section_name, !flag_wpa);
1789 free (section_name);
1790
1791 /* The entire header is stream computed here. */
1792 memset (&header, 0, sizeof (struct lto_function_header));
1793
1794 /* Write the header. */
1795 header.lto_header.major_version = LTO_major_version;
1796 header.lto_header.minor_version = LTO_minor_version;
1797 header.lto_header.section_type = section_type;
1798
1799 header.compressed_size = 0;
1800
1801 if (section_type == LTO_section_function_body)
1802 header.cfg_size = ob->cfg_stream->total_size;
1803 header.main_size = ob->main_stream->total_size;
1804 header.string_size = ob->string_stream->total_size;
1805
1806 header_stream = XCNEW (struct lto_output_stream);
1807 lto_output_data_stream (header_stream, &header, sizeof header);
1808 lto_write_stream (header_stream);
1809 free (header_stream);
1810
1811 /* Put all of the gimple and the string table out the asm file as a
1812 block of text. */
1813 if (section_type == LTO_section_function_body)
1814 lto_write_stream (ob->cfg_stream);
1815 lto_write_stream (ob->main_stream);
1816 lto_write_stream (ob->string_stream);
1817
1818 lto_end_section ();
1819 }
1820
1821
1822 /* Output the body of function NODE->DECL. */
1823
1824 static void
1825 output_function (struct cgraph_node *node)
1826 {
1827 struct bitpack_d *bp;
1828 tree function;
1829 struct function *fn;
1830 basic_block bb;
1831 struct output_block *ob;
1832
1833 function = node->decl;
1834 fn = DECL_STRUCT_FUNCTION (function);
1835 ob = create_output_block (LTO_section_function_body);
1836
1837 clear_line_info (ob);
1838 ob->cgraph_node = node;
1839
1840 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1841
1842 /* Set current_function_decl and cfun. */
1843 current_function_decl = function;
1844 push_cfun (fn);
1845
1846 /* Make string 0 be a NULL string. */
1847 lto_output_1_stream (ob->string_stream, 0);
1848
1849 output_record_start (ob, LTO_function);
1850
1851 /* Write all the attributes for FN. */
1852 bp = bitpack_create ();
1853 bp_pack_value (bp, fn->is_thunk, 1);
1854 bp_pack_value (bp, fn->has_local_explicit_reg_vars, 1);
1855 bp_pack_value (bp, fn->after_tree_profile, 1);
1856 bp_pack_value (bp, fn->returns_pcc_struct, 1);
1857 bp_pack_value (bp, fn->returns_struct, 1);
1858 bp_pack_value (bp, fn->always_inline_functions_inlined, 1);
1859 bp_pack_value (bp, fn->after_inlining, 1);
1860 bp_pack_value (bp, fn->dont_save_pending_sizes_p, 1);
1861 bp_pack_value (bp, fn->stdarg, 1);
1862 bp_pack_value (bp, fn->has_nonlocal_label, 1);
1863 bp_pack_value (bp, fn->calls_alloca, 1);
1864 bp_pack_value (bp, fn->calls_setjmp, 1);
1865 bp_pack_value (bp, fn->function_frequency, 2);
1866 bp_pack_value (bp, fn->va_list_fpr_size, 8);
1867 bp_pack_value (bp, fn->va_list_gpr_size, 8);
1868 lto_output_bitpack (ob->main_stream, bp);
1869 bitpack_delete (bp);
1870
1871 /* Output the static chain and non-local goto save area. */
1872 lto_output_tree_ref (ob, fn->static_chain_decl);
1873 lto_output_tree_ref (ob, fn->nonlocal_goto_save_area);
1874
1875 /* Output all the local variables in the function. */
1876 lto_output_tree_ref (ob, fn->local_decls);
1877
1878 /* Output the head of the arguments list. */
1879 lto_output_tree_ref (ob, DECL_ARGUMENTS (function));
1880
1881 /* Output all the SSA names used in the function. */
1882 output_ssa_names (ob, fn);
1883
1884 /* Output any exception handling regions. */
1885 output_eh_regions (ob, fn);
1886
1887 /* Output DECL_INITIAL for the function, which contains the tree of
1888 lexical scopes. */
1889 lto_output_tree (ob, DECL_INITIAL (function), true);
1890
1891 /* We will renumber the statements. The code that does this uses
1892 the same ordering that we use for serializing them so we can use
1893 the same code on the other end and not have to write out the
1894 statement numbers. */
1895 renumber_gimple_stmt_uids ();
1896
1897 /* Output the code for the function. */
1898 FOR_ALL_BB_FN (bb, fn)
1899 output_bb (ob, bb, fn);
1900
1901 /* The terminator for this function. */
1902 output_zero (ob);
1903
1904 output_cfg (ob, fn);
1905
1906 /* Create a section to hold the pickled output of this function. */
1907 produce_asm (ob, function);
1908
1909 destroy_output_block (ob);
1910
1911 current_function_decl = NULL;
1912 pop_cfun ();
1913 }
1914
1915
1916 /* Return true if alias pair P belongs to the set of cgraph nodes in
1917 SET. If P is a an alias for a VAR_DECL, it can always be emitted.
1918 However, for FUNCTION_DECL aliases, we should only output the pair
1919 if it belongs to a function whose cgraph node is in SET.
1920 Otherwise, the LTRANS phase will get into trouble when finalizing
1921 aliases because the alias will refer to a function not defined in
1922 the file processed by LTRANS. */
1923
1924 static bool
1925 output_alias_pair_p (alias_pair *p, cgraph_node_set set)
1926 {
1927 cgraph_node_set_iterator csi;
1928 struct cgraph_node *target_node;
1929
1930 /* Always emit VAR_DECLs. FIXME lto, we should probably only emit
1931 those VAR_DECLs that are instantiated in this file partition, but
1932 we have no easy way of knowing this based on SET. */
1933 if (TREE_CODE (p->decl) == VAR_DECL)
1934 return true;
1935
1936 /* Check if the assembler name for P->TARGET has its cgraph node in SET. */
1937 gcc_assert (TREE_CODE (p->decl) == FUNCTION_DECL);
1938 target_node = cgraph_node_for_asm (p->target);
1939 csi = cgraph_node_set_find (set, target_node);
1940 return (!csi_end_p (csi));
1941 }
1942
1943
1944 /* Output any unreferenced global symbol defined in SET, alias pairs
1945 and labels. */
1946
1947 static void
1948 output_unreferenced_globals (cgraph_node_set set)
1949 {
1950 struct output_block *ob;
1951 alias_pair *p;
1952 unsigned i;
1953 struct varpool_node *vnode;
1954
1955 ob = create_output_block (LTO_section_static_initializer);
1956 ob->cgraph_node = NULL;
1957
1958 clear_line_info (ob);
1959
1960 /* Make string 0 be a NULL string. */
1961 lto_output_1_stream (ob->string_stream, 0);
1962
1963 /* Emit references for all the global symbols. If a global symbol
1964 was never referenced in any of the functions of this file, it
1965 would not be emitted otherwise. This will result in unreferenced
1966 symbols at link time if a file defines a global symbol but
1967 never references it. */
1968 FOR_EACH_STATIC_VARIABLE (vnode)
1969 {
1970 tree var = vnode->decl;
1971
1972 if (TREE_CODE (var) == VAR_DECL && TREE_PUBLIC (var))
1973 lto_output_tree_ref (ob, var);
1974 }
1975
1976 output_zero (ob);
1977
1978 /* Emit the alias pairs for the nodes in SET. */
1979 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
1980 {
1981 if (output_alias_pair_p (p, set))
1982 {
1983 lto_output_tree_ref (ob, p->decl);
1984 lto_output_tree_ref (ob, p->target);
1985 }
1986 }
1987
1988 output_zero (ob);
1989
1990 produce_asm (ob, NULL);
1991 destroy_output_block (ob);
1992 }
1993
1994
1995 /* Copy the function body of NODE without deserializing. */
1996
1997 static void
1998 copy_function (struct cgraph_node *node)
1999 {
2000 tree function = node->decl;
2001 struct lto_file_decl_data *file_data = node->local.lto_file_data;
2002 struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
2003 const char *data;
2004 size_t len;
2005 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2006 char *section_name =
2007 lto_get_section_name (LTO_section_function_body, name);
2008 size_t i, j;
2009 struct lto_in_decl_state *in_state;
2010 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2011
2012 lto_begin_section (section_name, !flag_wpa);
2013 free (section_name);
2014
2015 /* We may have renamed the declaration, e.g., a static function. */
2016 name = lto_get_decl_name_mapping (file_data, name);
2017
2018 data = lto_get_section_data (file_data, LTO_section_function_body,
2019 name, &len);
2020 gcc_assert (data);
2021
2022 /* Do a bit copy of the function body. */
2023 lto_output_data_stream (output_stream, data, len);
2024 lto_write_stream (output_stream);
2025
2026 /* Copy decls. */
2027 in_state =
2028 lto_get_function_in_decl_state (node->local.lto_file_data, function);
2029 gcc_assert (in_state);
2030
2031 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2032 {
2033 size_t n = in_state->streams[i].size;
2034 tree *trees = in_state->streams[i].trees;
2035 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2036
2037 /* The out state must have the same indices and the in state.
2038 So just copy the vector. All the encoders in the in state
2039 must be empty where we reach here. */
2040 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2041 for (j = 0; j < n; j++)
2042 VEC_safe_push (tree, heap, encoder->trees, trees[j]);
2043 encoder->next_index = n;
2044 }
2045
2046 lto_free_section_data (file_data, LTO_section_function_body, name,
2047 data, len);
2048 free (output_stream);
2049 lto_end_section ();
2050 }
2051
2052
2053 /* Initialize the LTO writer. */
2054
2055 static void
2056 lto_writer_init (void)
2057 {
2058 lto_streamer_init ();
2059 }
2060
2061
2062 /* Main entry point from the pass manager. */
2063
2064 static void
2065 lto_output (cgraph_node_set set)
2066 {
2067 struct cgraph_node *node;
2068 struct lto_out_decl_state *decl_state;
2069 cgraph_node_set_iterator csi;
2070 bitmap output = lto_bitmap_alloc ();
2071
2072 lto_writer_init ();
2073
2074 /* Process only the functions with bodies. */
2075 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2076 {
2077 node = csi_node (csi);
2078 if (node->analyzed && !bitmap_bit_p (output, DECL_UID (node->decl)))
2079 {
2080 bitmap_set_bit (output, DECL_UID (node->decl));
2081 decl_state = lto_new_out_decl_state ();
2082 lto_push_out_decl_state (decl_state);
2083 if (!flag_wpa)
2084 output_function (node);
2085 else
2086 copy_function (node);
2087 gcc_assert (lto_get_out_decl_state () == decl_state);
2088 lto_pop_out_decl_state ();
2089 lto_record_function_out_decl_state (node->decl, decl_state);
2090 }
2091 }
2092
2093 /* Emit the callgraph after emitting function bodies. This needs to
2094 be done now to make sure that all the statements in every function
2095 have been renumbered so that edges can be associated with call
2096 statements using the statement UIDs. */
2097 output_cgraph (set);
2098
2099 lto_bitmap_free (output);
2100 }
2101
2102 struct ipa_opt_pass_d pass_ipa_lto_gimple_out =
2103 {
2104 {
2105 IPA_PASS,
2106 "lto_gimple_out", /* name */
2107 gate_lto_out, /* gate */
2108 NULL, /* execute */
2109 NULL, /* sub */
2110 NULL, /* next */
2111 0, /* static_pass_number */
2112 TV_IPA_LTO_GIMPLE_IO, /* tv_id */
2113 0, /* properties_required */
2114 0, /* properties_provided */
2115 0, /* properties_destroyed */
2116 0, /* todo_flags_start */
2117 TODO_dump_func /* todo_flags_finish */
2118 },
2119 NULL, /* generate_summary */
2120 lto_output, /* write_summary */
2121 NULL, /* read_summary */
2122 NULL, /* function_read_summary */
2123 NULL, /* stmt_fixup */
2124 0, /* TODOs */
2125 NULL, /* function_transform */
2126 NULL /* variable_transform */
2127 };
2128
2129
2130 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2131 from it and required for correct representation of its semantics.
2132 Each node in ENCODER must be a global declaration or a type. A node
2133 is written only once, even if it appears multiple times in the
2134 vector. Certain transitively-reachable nodes, such as those
2135 representing expressions, may be duplicated, but such nodes
2136 must not appear in ENCODER itself. */
2137
2138 static void
2139 write_global_stream (struct output_block *ob,
2140 struct lto_tree_ref_encoder *encoder)
2141 {
2142 tree t;
2143 size_t index;
2144 const size_t size = lto_tree_ref_encoder_size (encoder);
2145
2146 for (index = 0; index < size; index++)
2147 {
2148 t = lto_tree_ref_encoder_get_tree (encoder, index);
2149 if (!lto_streamer_cache_lookup (ob->writer_cache, t, NULL))
2150 {
2151 if (flag_wpa)
2152 {
2153 /* In WPA we should not emit multiple definitions of the
2154 same symbol to all the files in the link set. If
2155 T had already been emitted as the pervailing definition
2156 in one file, emit it as an external reference in the
2157 others. */
2158 /* FIXME lto. We should check if T belongs to the
2159 file we are writing to. */
2160 if (TREE_CODE (t) == VAR_DECL
2161 && TREE_PUBLIC (t)
2162 && !DECL_EXTERNAL (t))
2163 {
2164 /* FIXME lto. Make DECLS_ALREADY_EMITTED an argument
2165 to this function so it can be freed up afterwards.
2166 Alternately, assign global symbols to cgraph
2167 node sets. */
2168 static struct pointer_set_t *decls_already_emitted = NULL;
2169
2170 if (decls_already_emitted == NULL)
2171 decls_already_emitted = pointer_set_create ();
2172
2173 if (pointer_set_insert (decls_already_emitted, t))
2174 make_decl_one_only (t, DECL_ASSEMBLER_NAME (t));
2175 }
2176 }
2177
2178 lto_output_tree (ob, t, false);
2179 }
2180 }
2181 }
2182
2183
2184 /* Write a sequence of indices into the globals vector corresponding
2185 to the trees in ENCODER. These are used by the reader to map the
2186 indices used to refer to global entities within function bodies to
2187 their referents. */
2188
2189 static void
2190 write_global_references (struct output_block *ob,
2191 struct lto_output_stream *ref_stream,
2192 struct lto_tree_ref_encoder *encoder)
2193 {
2194 tree t;
2195 int32_t index;
2196 const int32_t size = lto_tree_ref_encoder_size (encoder);
2197
2198 /* Write size as 32-bit unsigned. */
2199 lto_output_data_stream (ref_stream, &size, sizeof (int32_t));
2200
2201 for (index = 0; index < size; index++)
2202 {
2203 int32_t slot_num;
2204
2205 t = lto_tree_ref_encoder_get_tree (encoder, index);
2206 lto_streamer_cache_lookup (ob->writer_cache, t, &slot_num);
2207 gcc_assert (slot_num >= 0);
2208 lto_output_data_stream (ref_stream, &slot_num, sizeof slot_num);
2209 }
2210 }
2211
2212
2213 /* Write all the streams in an lto_out_decl_state STATE using
2214 output block OB and output stream OUT_STREAM. */
2215
2216 static void
2217 lto_output_decl_state_streams (struct output_block *ob,
2218 struct lto_out_decl_state *state)
2219 {
2220 int i;
2221
2222 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2223 write_global_stream (ob, &state->streams[i]);
2224 }
2225
2226
2227 /* Write all the references in an lto_out_decl_state STATE using
2228 output block OB and output stream OUT_STREAM. */
2229
2230 static void
2231 lto_output_decl_state_refs (struct output_block *ob,
2232 struct lto_output_stream *out_stream,
2233 struct lto_out_decl_state *state)
2234 {
2235 unsigned i;
2236 int32_t ref;
2237 tree decl;
2238
2239 /* Write reference to FUNCTION_DECL. If there is not function,
2240 write reference to void_type_node. */
2241 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2242 lto_streamer_cache_lookup (ob->writer_cache, decl, &ref);
2243 gcc_assert (ref >= 0);
2244 lto_output_data_stream (out_stream, &ref, sizeof (int32_t));
2245
2246 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2247 write_global_references (ob, out_stream, &state->streams[i]);
2248 }
2249
2250
2251 /* Return the written size of STATE. */
2252
2253 static size_t
2254 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2255 {
2256 int i;
2257 size_t size;
2258
2259 size = sizeof (int32_t); /* fn_ref. */
2260 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2261 {
2262 size += sizeof (int32_t); /* vector size. */
2263 size += (lto_tree_ref_encoder_size (&state->streams[i])
2264 * sizeof (int32_t));
2265 }
2266 return size;
2267 }
2268
2269
2270 /* Helper function of write_symbols_of_kind. CACHE is the streamer
2271 cache with all the pickled nodes. STREAM is the stream where to
2272 write the table. V is a vector with the DECLs that should be on
2273 the table. SEEN is a bitmap of symbols written so far. */
2274
2275 static void
2276 write_symbol_vec (struct lto_streamer_cache_d *cache,
2277 struct lto_output_stream *stream,
2278 VEC(tree,heap) *v, bitmap seen)
2279 {
2280 tree t;
2281 int index;
2282
2283 for (index = 0; VEC_iterate(tree, v, index, t); index++)
2284 {
2285 const char *name;
2286 enum gcc_plugin_symbol_kind kind;
2287 enum gcc_plugin_symbol_visibility visibility;
2288 int slot_num;
2289 uint64_t size;
2290 const char *comdat;
2291
2292 /* None of the following kinds of symbols are needed in the
2293 symbol table. */
2294 if (!TREE_PUBLIC (t)
2295 || is_builtin_fn (t)
2296 || DECL_ABSTRACT (t)
2297 || TREE_CODE (t) == RESULT_DECL)
2298 continue;
2299
2300 gcc_assert (TREE_CODE (t) == VAR_DECL
2301 || TREE_CODE (t) == FUNCTION_DECL);
2302
2303 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2304
2305 /* FIXME lto: this is from assemble_name_raw in varasm.c. For some
2306 architectures we might have to do the same name manipulations that
2307 ASM_OUTPUT_LABELREF does. */
2308 if (name[0] == '*')
2309 name = &name[1];
2310
2311 lto_streamer_cache_lookup (cache, t, &slot_num);
2312 gcc_assert (slot_num >= 0);
2313
2314 /* Avoid duplicate symbols. */
2315 if (bitmap_bit_p (seen, slot_num))
2316 continue;
2317 else
2318 bitmap_set_bit (seen, slot_num);
2319
2320 if (DECL_EXTERNAL (t))
2321 {
2322 if (DECL_WEAK (t))
2323 kind = GCCPK_WEAKUNDEF;
2324 else
2325 kind = GCCPK_UNDEF;
2326 }
2327 else
2328 {
2329 if (DECL_WEAK (t))
2330 kind = GCCPK_WEAKDEF;
2331 else if (DECL_COMMON (t))
2332 kind = GCCPK_COMMON;
2333 else
2334 kind = GCCPK_DEF;
2335 }
2336
2337 switch (DECL_VISIBILITY(t))
2338 {
2339 case VISIBILITY_DEFAULT:
2340 visibility = GCCPV_DEFAULT;
2341 break;
2342 case VISIBILITY_PROTECTED:
2343 visibility = GCCPV_PROTECTED;
2344 break;
2345 case VISIBILITY_HIDDEN:
2346 visibility = GCCPV_HIDDEN;
2347 break;
2348 case VISIBILITY_INTERNAL:
2349 visibility = GCCPV_INTERNAL;
2350 break;
2351 }
2352
2353 if (kind == GCCPK_COMMON && DECL_SIZE (t))
2354 size = (((uint64_t) TREE_INT_CST_HIGH (DECL_SIZE (t))) << 32)
2355 | TREE_INT_CST_LOW (DECL_SIZE (t));
2356 else
2357 size = 0;
2358
2359 if (DECL_ONE_ONLY (t))
2360 comdat = IDENTIFIER_POINTER (DECL_COMDAT_GROUP (t));
2361 else
2362 comdat = "";
2363
2364 lto_output_data_stream (stream, name, strlen (name) + 1);
2365 lto_output_data_stream (stream, comdat, strlen (comdat) + 1);
2366 lto_output_data_stream (stream, &kind, 1);
2367 lto_output_data_stream (stream, &visibility, 1);
2368 lto_output_data_stream (stream, &size, 8);
2369 lto_output_data_stream (stream, &slot_num, 4);
2370 }
2371 }
2372
2373
2374 /* Write IL symbols of KIND. CACHE is the streamer cache with all the
2375 pickled nodes. SEEN is a bitmap of symbols written so far. */
2376
2377 static void
2378 write_symbols_of_kind (lto_decl_stream_e_t kind,
2379 struct lto_streamer_cache_d *cache, bitmap seen)
2380 {
2381 struct lto_out_decl_state *out_state;
2382 struct lto_output_stream stream;
2383 unsigned num_fns =
2384 VEC_length (lto_out_decl_state_ptr, lto_function_decl_states);
2385 unsigned idx;
2386
2387 memset (&stream, 0, sizeof (stream));
2388 out_state = lto_get_out_decl_state ();
2389 write_symbol_vec (cache, &stream, out_state->streams[kind].trees, seen);
2390
2391 for (idx = 0; idx < num_fns; idx++)
2392 {
2393 out_state =
2394 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2395 write_symbol_vec (cache, &stream, out_state->streams[kind].trees, seen);
2396 }
2397
2398 lto_write_stream (&stream);
2399 }
2400
2401
2402 /* Write an IL symbol table. CACHE is the streamer cache with all the
2403 pickled nodes. */
2404
2405 static void
2406 produce_symtab (struct lto_streamer_cache_d *cache)
2407 {
2408 char *section_name = lto_get_section_name (LTO_section_symtab, NULL);
2409 bitmap seen;
2410
2411 lto_begin_section (section_name, false);
2412 free (section_name);
2413
2414 seen = lto_bitmap_alloc ();
2415 write_symbols_of_kind (LTO_DECL_STREAM_FN_DECL, cache, seen);
2416 write_symbols_of_kind (LTO_DECL_STREAM_VAR_DECL, cache, seen);
2417 lto_bitmap_free (seen);
2418
2419 lto_end_section ();
2420 }
2421
2422
2423 /* This pass is run after all of the functions are serialized and all
2424 of the IPA passes have written their serialized forms. This pass
2425 causes the vector of all of the global decls and types used from
2426 this file to be written in to a section that can then be read in to
2427 recover these on other side. */
2428
2429 static void
2430 produce_asm_for_decls (cgraph_node_set set)
2431 {
2432 struct lto_out_decl_state *out_state;
2433 struct lto_out_decl_state *fn_out_state;
2434 struct lto_decl_header header;
2435 char *section_name;
2436 struct output_block *ob;
2437 struct lto_output_stream *header_stream, *decl_state_stream;
2438 unsigned idx, num_fns;
2439 size_t decl_state_size;
2440 int32_t num_decl_states;
2441
2442 ob = create_output_block (LTO_section_decls);
2443 ob->global = true;
2444
2445 /* Write out unreferenced globals, alias pairs and labels. We defer
2446 doing this until now so that we can write out only what is
2447 needed. */
2448 output_unreferenced_globals (set);
2449
2450 memset (&header, 0, sizeof (struct lto_decl_header));
2451
2452 section_name = lto_get_section_name (LTO_section_decls, NULL);
2453 lto_begin_section (section_name, !flag_wpa);
2454 free (section_name);
2455
2456 /* Make string 0 be a NULL string. */
2457 lto_output_1_stream (ob->string_stream, 0);
2458
2459 /* Write the global symbols. */
2460 out_state = lto_get_out_decl_state ();
2461 num_fns = VEC_length (lto_out_decl_state_ptr, lto_function_decl_states);
2462 lto_output_decl_state_streams (ob, out_state);
2463 for (idx = 0; idx < num_fns; idx++)
2464 {
2465 fn_out_state =
2466 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2467 lto_output_decl_state_streams (ob, fn_out_state);
2468 }
2469
2470 header.lto_header.major_version = LTO_major_version;
2471 header.lto_header.minor_version = LTO_minor_version;
2472 header.lto_header.section_type = LTO_section_decls;
2473
2474 /* Currently not used. This field would allow us to preallocate
2475 the globals vector, so that it need not be resized as it is extended. */
2476 header.num_nodes = -1;
2477
2478 /* Compute the total size of all decl out states. */
2479 decl_state_size = sizeof (int32_t);
2480 decl_state_size += lto_out_decl_state_written_size (out_state);
2481 for (idx = 0; idx < num_fns; idx++)
2482 {
2483 fn_out_state =
2484 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2485 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2486 }
2487 header.decl_state_size = decl_state_size;
2488
2489 header.main_size = ob->main_stream->total_size;
2490 header.string_size = ob->string_stream->total_size;
2491
2492 header_stream = XCNEW (struct lto_output_stream);
2493 lto_output_data_stream (header_stream, &header, sizeof header);
2494 lto_write_stream (header_stream);
2495 free (header_stream);
2496
2497 /* Write the main out-decl state, followed by out-decl states of
2498 functions. */
2499 decl_state_stream = ((struct lto_output_stream *)
2500 xcalloc (1, sizeof (struct lto_output_stream)));
2501 num_decl_states = num_fns + 1;
2502 lto_output_data_stream (decl_state_stream, &num_decl_states,
2503 sizeof (num_decl_states));
2504 lto_output_decl_state_refs (ob, decl_state_stream, out_state);
2505 for (idx = 0; idx < num_fns; idx++)
2506 {
2507 fn_out_state =
2508 VEC_index (lto_out_decl_state_ptr, lto_function_decl_states, idx);
2509 lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
2510 }
2511 lto_write_stream (decl_state_stream);
2512 free(decl_state_stream);
2513
2514 lto_write_stream (ob->main_stream);
2515 lto_write_stream (ob->string_stream);
2516
2517 lto_end_section ();
2518
2519 /* Write the symbol table. */
2520 produce_symtab (ob->writer_cache);
2521
2522 /* Write command line opts. */
2523 lto_write_options ();
2524
2525 /* Deallocate memory and clean up. */
2526 lto_cgraph_encoder_delete (ob->decl_state->cgraph_node_encoder);
2527 VEC_free (lto_out_decl_state_ptr, heap, lto_function_decl_states);
2528 lto_function_decl_states = NULL;
2529 destroy_output_block (ob);
2530 }
2531
2532
2533 struct ipa_opt_pass_d pass_ipa_lto_finish_out =
2534 {
2535 {
2536 IPA_PASS,
2537 "lto_decls_out", /* name */
2538 gate_lto_out, /* gate */
2539 NULL, /* execute */
2540 NULL, /* sub */
2541 NULL, /* next */
2542 0, /* static_pass_number */
2543 TV_IPA_LTO_DECL_IO, /* tv_id */
2544 0, /* properties_required */
2545 0, /* properties_provided */
2546 0, /* properties_destroyed */
2547 0, /* todo_flags_start */
2548 0 /* todo_flags_finish */
2549 },
2550 NULL, /* generate_summary */
2551 produce_asm_for_decls, /* write_summary */
2552 NULL, /* read_summary */
2553 NULL, /* function_read_summary */
2554 NULL, /* stmt_fixup */
2555 0, /* TODOs */
2556 NULL, /* function_transform */
2557 NULL /* variable_transform */
2558 };