]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/lto-streamer-in.c
re PR middle-end/64065 (CP2K miscompilation at -O3 -flto)
[thirdparty/gcc.git] / gcc / lto-streamer-in.c
1 /* Read the GIMPLE representation from a file stream.
2
3 Copyright (C) 2009-2014 Free Software Foundation, Inc.
4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5 Re-implemented by Diego Novillo <dnovillo@google.com>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "toplev.h"
28 #include "tree.h"
29 #include "stringpool.h"
30 #include "expr.h"
31 #include "flags.h"
32 #include "params.h"
33 #include "input.h"
34 #include "hashtab.h"
35 #include "predict.h"
36 #include "vec.h"
37 #include "hash-set.h"
38 #include "machmode.h"
39 #include "hard-reg-set.h"
40 #include "function.h"
41 #include "dominance.h"
42 #include "cfg.h"
43 #include "basic-block.h"
44 #include "tree-ssa-alias.h"
45 #include "internal-fn.h"
46 #include "gimple-expr.h"
47 #include "is-a.h"
48 #include "gimple.h"
49 #include "gimple-iterator.h"
50 #include "gimple-ssa.h"
51 #include "tree-cfg.h"
52 #include "tree-ssanames.h"
53 #include "tree-into-ssa.h"
54 #include "tree-dfa.h"
55 #include "tree-ssa.h"
56 #include "tree-pass.h"
57 #include "diagnostic.h"
58 #include "except.h"
59 #include "debug.h"
60 #include "hash-map.h"
61 #include "plugin-api.h"
62 #include "ipa-ref.h"
63 #include "cgraph.h"
64 #include "ipa-utils.h"
65 #include "data-streamer.h"
66 #include "gimple-streamer.h"
67 #include "lto-streamer.h"
68 #include "tree-streamer.h"
69 #include "tree-pass.h"
70 #include "streamer-hooks.h"
71 #include "cfgloop.h"
72
73
74 struct freeing_string_slot_hasher : string_slot_hasher
75 {
76 static inline void remove (value_type *);
77 };
78
79 inline void
80 freeing_string_slot_hasher::remove (value_type *v)
81 {
82 free (v);
83 }
84
85 /* The table to hold the file names. */
86 static hash_table<freeing_string_slot_hasher> *file_name_hash_table;
87
88
89 /* Check that tag ACTUAL has one of the given values. NUM_TAGS is the
90 number of valid tag values to check. */
91
92 void
93 lto_tag_check_set (enum LTO_tags actual, int ntags, ...)
94 {
95 va_list ap;
96 int i;
97
98 va_start (ap, ntags);
99 for (i = 0; i < ntags; i++)
100 if ((unsigned) actual == va_arg (ap, unsigned))
101 {
102 va_end (ap);
103 return;
104 }
105
106 va_end (ap);
107 internal_error ("bytecode stream: unexpected tag %s", lto_tag_name (actual));
108 }
109
110
111 /* Read LENGTH bytes from STREAM to ADDR. */
112
113 void
114 lto_input_data_block (struct lto_input_block *ib, void *addr, size_t length)
115 {
116 size_t i;
117 unsigned char *const buffer = (unsigned char *const) addr;
118
119 for (i = 0; i < length; i++)
120 buffer[i] = streamer_read_uchar (ib);
121 }
122
123
124 /* Lookup STRING in file_name_hash_table. If found, return the existing
125 string, otherwise insert STRING as the canonical version. */
126
127 static const char *
128 canon_file_name (const char *string)
129 {
130 string_slot **slot;
131 struct string_slot s_slot;
132 size_t len = strlen (string);
133
134 s_slot.s = string;
135 s_slot.len = len;
136
137 slot = file_name_hash_table->find_slot (&s_slot, INSERT);
138 if (*slot == NULL)
139 {
140 char *saved_string;
141 struct string_slot *new_slot;
142
143 saved_string = (char *) xmalloc (len + 1);
144 new_slot = XCNEW (struct string_slot);
145 memcpy (saved_string, string, len + 1);
146 new_slot->s = saved_string;
147 new_slot->len = len;
148 *slot = new_slot;
149 return saved_string;
150 }
151 else
152 {
153 struct string_slot *old_slot = *slot;
154 return old_slot->s;
155 }
156 }
157
158
159 /* Read a location bitpack from input block IB. */
160
161 location_t
162 lto_input_location (struct bitpack_d *bp, struct data_in *data_in)
163 {
164 static const char *current_file;
165 static int current_line;
166 static int current_col;
167 bool file_change, line_change, column_change;
168 bool prev_file = current_file != NULL;
169
170 if (bp_unpack_value (bp, 1))
171 return UNKNOWN_LOCATION;
172
173 file_change = bp_unpack_value (bp, 1);
174 line_change = bp_unpack_value (bp, 1);
175 column_change = bp_unpack_value (bp, 1);
176
177 if (file_change)
178 current_file = canon_file_name (bp_unpack_string (data_in, bp));
179
180 if (line_change)
181 current_line = bp_unpack_var_len_unsigned (bp);
182
183 if (column_change)
184 current_col = bp_unpack_var_len_unsigned (bp);
185
186 if (file_change)
187 {
188 if (prev_file)
189 linemap_add (line_table, LC_LEAVE, false, NULL, 0);
190
191 linemap_add (line_table, LC_ENTER, false, current_file, current_line);
192 }
193 else if (line_change)
194 linemap_line_start (line_table, current_line, current_col);
195
196 return linemap_position_for_column (line_table, current_col);
197 }
198
199
200 /* Read a reference to a tree node from DATA_IN using input block IB.
201 TAG is the expected node that should be found in IB, if TAG belongs
202 to one of the indexable trees, expect to read a reference index to
203 be looked up in one of the symbol tables, otherwise read the pysical
204 representation of the tree using stream_read_tree. FN is the
205 function scope for the read tree. */
206
207 tree
208 lto_input_tree_ref (struct lto_input_block *ib, struct data_in *data_in,
209 struct function *fn, enum LTO_tags tag)
210 {
211 unsigned HOST_WIDE_INT ix_u;
212 tree result = NULL_TREE;
213
214 lto_tag_check_range (tag, LTO_field_decl_ref, LTO_namelist_decl_ref);
215
216 switch (tag)
217 {
218 case LTO_type_ref:
219 ix_u = streamer_read_uhwi (ib);
220 result = lto_file_decl_data_get_type (data_in->file_data, ix_u);
221 break;
222
223 case LTO_ssa_name_ref:
224 ix_u = streamer_read_uhwi (ib);
225 result = (*SSANAMES (fn))[ix_u];
226 break;
227
228 case LTO_field_decl_ref:
229 ix_u = streamer_read_uhwi (ib);
230 result = lto_file_decl_data_get_field_decl (data_in->file_data, ix_u);
231 break;
232
233 case LTO_function_decl_ref:
234 ix_u = streamer_read_uhwi (ib);
235 result = lto_file_decl_data_get_fn_decl (data_in->file_data, ix_u);
236 break;
237
238 case LTO_type_decl_ref:
239 ix_u = streamer_read_uhwi (ib);
240 result = lto_file_decl_data_get_type_decl (data_in->file_data, ix_u);
241 break;
242
243 case LTO_namespace_decl_ref:
244 ix_u = streamer_read_uhwi (ib);
245 result = lto_file_decl_data_get_namespace_decl (data_in->file_data, ix_u);
246 break;
247
248 case LTO_global_decl_ref:
249 case LTO_result_decl_ref:
250 case LTO_const_decl_ref:
251 case LTO_imported_decl_ref:
252 case LTO_label_decl_ref:
253 case LTO_translation_unit_decl_ref:
254 case LTO_namelist_decl_ref:
255 ix_u = streamer_read_uhwi (ib);
256 result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
257 break;
258
259 default:
260 gcc_unreachable ();
261 }
262
263 gcc_assert (result);
264
265 return result;
266 }
267
268
269 /* Read and return a double-linked list of catch handlers from input
270 block IB, using descriptors in DATA_IN. */
271
272 static struct eh_catch_d *
273 lto_input_eh_catch_list (struct lto_input_block *ib, struct data_in *data_in,
274 eh_catch *last_p)
275 {
276 eh_catch first;
277 enum LTO_tags tag;
278
279 *last_p = first = NULL;
280 tag = streamer_read_record_start (ib);
281 while (tag)
282 {
283 tree list;
284 eh_catch n;
285
286 lto_tag_check_range (tag, LTO_eh_catch, LTO_eh_catch);
287
288 /* Read the catch node. */
289 n = ggc_cleared_alloc<eh_catch_d> ();
290 n->type_list = stream_read_tree (ib, data_in);
291 n->filter_list = stream_read_tree (ib, data_in);
292 n->label = stream_read_tree (ib, data_in);
293
294 /* Register all the types in N->FILTER_LIST. */
295 for (list = n->filter_list; list; list = TREE_CHAIN (list))
296 add_type_for_runtime (TREE_VALUE (list));
297
298 /* Chain N to the end of the list. */
299 if (*last_p)
300 (*last_p)->next_catch = n;
301 n->prev_catch = *last_p;
302 *last_p = n;
303
304 /* Set the head of the list the first time through the loop. */
305 if (first == NULL)
306 first = n;
307
308 tag = streamer_read_record_start (ib);
309 }
310
311 return first;
312 }
313
314
315 /* Read and return EH region IX from input block IB, using descriptors
316 in DATA_IN. */
317
318 static eh_region
319 input_eh_region (struct lto_input_block *ib, struct data_in *data_in, int ix)
320 {
321 enum LTO_tags tag;
322 eh_region r;
323
324 /* Read the region header. */
325 tag = streamer_read_record_start (ib);
326 if (tag == LTO_null)
327 return NULL;
328
329 r = ggc_cleared_alloc<eh_region_d> ();
330 r->index = streamer_read_hwi (ib);
331
332 gcc_assert (r->index == ix);
333
334 /* Read all the region pointers as region numbers. We'll fix up
335 the pointers once the whole array has been read. */
336 r->outer = (eh_region) (intptr_t) streamer_read_hwi (ib);
337 r->inner = (eh_region) (intptr_t) streamer_read_hwi (ib);
338 r->next_peer = (eh_region) (intptr_t) streamer_read_hwi (ib);
339
340 switch (tag)
341 {
342 case LTO_ert_cleanup:
343 r->type = ERT_CLEANUP;
344 break;
345
346 case LTO_ert_try:
347 {
348 struct eh_catch_d *last_catch;
349 r->type = ERT_TRY;
350 r->u.eh_try.first_catch = lto_input_eh_catch_list (ib, data_in,
351 &last_catch);
352 r->u.eh_try.last_catch = last_catch;
353 break;
354 }
355
356 case LTO_ert_allowed_exceptions:
357 {
358 tree l;
359
360 r->type = ERT_ALLOWED_EXCEPTIONS;
361 r->u.allowed.type_list = stream_read_tree (ib, data_in);
362 r->u.allowed.label = stream_read_tree (ib, data_in);
363 r->u.allowed.filter = streamer_read_uhwi (ib);
364
365 for (l = r->u.allowed.type_list; l ; l = TREE_CHAIN (l))
366 add_type_for_runtime (TREE_VALUE (l));
367 }
368 break;
369
370 case LTO_ert_must_not_throw:
371 {
372 r->type = ERT_MUST_NOT_THROW;
373 r->u.must_not_throw.failure_decl = stream_read_tree (ib, data_in);
374 bitpack_d bp = streamer_read_bitpack (ib);
375 r->u.must_not_throw.failure_loc
376 = stream_input_location (&bp, data_in);
377 }
378 break;
379
380 default:
381 gcc_unreachable ();
382 }
383
384 r->landing_pads = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
385
386 return r;
387 }
388
389
390 /* Read and return EH landing pad IX from input block IB, using descriptors
391 in DATA_IN. */
392
393 static eh_landing_pad
394 input_eh_lp (struct lto_input_block *ib, struct data_in *data_in, int ix)
395 {
396 enum LTO_tags tag;
397 eh_landing_pad lp;
398
399 /* Read the landing pad header. */
400 tag = streamer_read_record_start (ib);
401 if (tag == LTO_null)
402 return NULL;
403
404 lto_tag_check_range (tag, LTO_eh_landing_pad, LTO_eh_landing_pad);
405
406 lp = ggc_cleared_alloc<eh_landing_pad_d> ();
407 lp->index = streamer_read_hwi (ib);
408 gcc_assert (lp->index == ix);
409 lp->next_lp = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
410 lp->region = (eh_region) (intptr_t) streamer_read_hwi (ib);
411 lp->post_landing_pad = stream_read_tree (ib, data_in);
412
413 return lp;
414 }
415
416
417 /* After reading the EH regions, pointers to peer and children regions
418 are region numbers. This converts all these region numbers into
419 real pointers into the rematerialized regions for FN. ROOT_REGION
420 is the region number for the root EH region in FN. */
421
422 static void
423 fixup_eh_region_pointers (struct function *fn, HOST_WIDE_INT root_region)
424 {
425 unsigned i;
426 vec<eh_region, va_gc> *eh_array = fn->eh->region_array;
427 vec<eh_landing_pad, va_gc> *lp_array = fn->eh->lp_array;
428 eh_region r;
429 eh_landing_pad lp;
430
431 gcc_assert (eh_array && lp_array);
432
433 gcc_assert (root_region >= 0);
434 fn->eh->region_tree = (*eh_array)[root_region];
435
436 #define FIXUP_EH_REGION(r) (r) = (*eh_array)[(HOST_WIDE_INT) (intptr_t) (r)]
437 #define FIXUP_EH_LP(p) (p) = (*lp_array)[(HOST_WIDE_INT) (intptr_t) (p)]
438
439 /* Convert all the index numbers stored in pointer fields into
440 pointers to the corresponding slots in the EH region array. */
441 FOR_EACH_VEC_ELT (*eh_array, i, r)
442 {
443 /* The array may contain NULL regions. */
444 if (r == NULL)
445 continue;
446
447 gcc_assert (i == (unsigned) r->index);
448 FIXUP_EH_REGION (r->outer);
449 FIXUP_EH_REGION (r->inner);
450 FIXUP_EH_REGION (r->next_peer);
451 FIXUP_EH_LP (r->landing_pads);
452 }
453
454 /* Convert all the index numbers stored in pointer fields into
455 pointers to the corresponding slots in the EH landing pad array. */
456 FOR_EACH_VEC_ELT (*lp_array, i, lp)
457 {
458 /* The array may contain NULL landing pads. */
459 if (lp == NULL)
460 continue;
461
462 gcc_assert (i == (unsigned) lp->index);
463 FIXUP_EH_LP (lp->next_lp);
464 FIXUP_EH_REGION (lp->region);
465 }
466
467 #undef FIXUP_EH_REGION
468 #undef FIXUP_EH_LP
469 }
470
471
472 /* Initialize EH support. */
473
474 void
475 lto_init_eh (void)
476 {
477 static bool eh_initialized_p = false;
478
479 if (eh_initialized_p)
480 return;
481
482 /* Contrary to most other FEs, we only initialize EH support when at
483 least one of the files in the set contains exception regions in
484 it. Since this happens much later than the call to init_eh in
485 lang_dependent_init, we have to set flag_exceptions and call
486 init_eh again to initialize the EH tables. */
487 flag_exceptions = 1;
488 init_eh ();
489
490 eh_initialized_p = true;
491 }
492
493
494 /* Read the exception table for FN from IB using the data descriptors
495 in DATA_IN. */
496
497 static void
498 input_eh_regions (struct lto_input_block *ib, struct data_in *data_in,
499 struct function *fn)
500 {
501 HOST_WIDE_INT i, root_region, len;
502 enum LTO_tags tag;
503
504 tag = streamer_read_record_start (ib);
505 if (tag == LTO_null)
506 return;
507
508 lto_tag_check_range (tag, LTO_eh_table, LTO_eh_table);
509
510 /* If the file contains EH regions, then it was compiled with
511 -fexceptions. In that case, initialize the backend EH
512 machinery. */
513 lto_init_eh ();
514
515 gcc_assert (fn->eh);
516
517 root_region = streamer_read_hwi (ib);
518 gcc_assert (root_region == (int) root_region);
519
520 /* Read the EH region array. */
521 len = streamer_read_hwi (ib);
522 gcc_assert (len == (int) len);
523 if (len > 0)
524 {
525 vec_safe_grow_cleared (fn->eh->region_array, len);
526 for (i = 0; i < len; i++)
527 {
528 eh_region r = input_eh_region (ib, data_in, i);
529 (*fn->eh->region_array)[i] = r;
530 }
531 }
532
533 /* Read the landing pads. */
534 len = streamer_read_hwi (ib);
535 gcc_assert (len == (int) len);
536 if (len > 0)
537 {
538 vec_safe_grow_cleared (fn->eh->lp_array, len);
539 for (i = 0; i < len; i++)
540 {
541 eh_landing_pad lp = input_eh_lp (ib, data_in, i);
542 (*fn->eh->lp_array)[i] = lp;
543 }
544 }
545
546 /* Read the runtime type data. */
547 len = streamer_read_hwi (ib);
548 gcc_assert (len == (int) len);
549 if (len > 0)
550 {
551 vec_safe_grow_cleared (fn->eh->ttype_data, len);
552 for (i = 0; i < len; i++)
553 {
554 tree ttype = stream_read_tree (ib, data_in);
555 (*fn->eh->ttype_data)[i] = ttype;
556 }
557 }
558
559 /* Read the table of action chains. */
560 len = streamer_read_hwi (ib);
561 gcc_assert (len == (int) len);
562 if (len > 0)
563 {
564 if (targetm.arm_eabi_unwinder)
565 {
566 vec_safe_grow_cleared (fn->eh->ehspec_data.arm_eabi, len);
567 for (i = 0; i < len; i++)
568 {
569 tree t = stream_read_tree (ib, data_in);
570 (*fn->eh->ehspec_data.arm_eabi)[i] = t;
571 }
572 }
573 else
574 {
575 vec_safe_grow_cleared (fn->eh->ehspec_data.other, len);
576 for (i = 0; i < len; i++)
577 {
578 uchar c = streamer_read_uchar (ib);
579 (*fn->eh->ehspec_data.other)[i] = c;
580 }
581 }
582 }
583
584 /* Reconstruct the EH region tree by fixing up the peer/children
585 pointers. */
586 fixup_eh_region_pointers (fn, root_region);
587
588 tag = streamer_read_record_start (ib);
589 lto_tag_check_range (tag, LTO_null, LTO_null);
590 }
591
592
593 /* Make a new basic block with index INDEX in function FN. */
594
595 static basic_block
596 make_new_block (struct function *fn, unsigned int index)
597 {
598 basic_block bb = alloc_block ();
599 bb->index = index;
600 SET_BASIC_BLOCK_FOR_FN (fn, index, bb);
601 n_basic_blocks_for_fn (fn)++;
602 return bb;
603 }
604
605
606 /* Read a wide-int. */
607
608 static widest_int
609 streamer_read_wi (struct lto_input_block *ib)
610 {
611 HOST_WIDE_INT a[WIDE_INT_MAX_ELTS];
612 int i;
613 int prec ATTRIBUTE_UNUSED = streamer_read_uhwi (ib);
614 int len = streamer_read_uhwi (ib);
615 for (i = 0; i < len; i++)
616 a[i] = streamer_read_hwi (ib);
617 return widest_int::from_array (a, len);
618 }
619
620
621 /* Read the CFG for function FN from input block IB. */
622
623 static void
624 input_cfg (struct lto_input_block *ib, struct data_in *data_in,
625 struct function *fn,
626 int count_materialization_scale)
627 {
628 unsigned int bb_count;
629 basic_block p_bb;
630 unsigned int i;
631 int index;
632
633 init_empty_tree_cfg_for_function (fn);
634 init_ssa_operands (fn);
635
636 profile_status_for_fn (fn) = streamer_read_enum (ib, profile_status_d,
637 PROFILE_LAST);
638
639 bb_count = streamer_read_uhwi (ib);
640
641 last_basic_block_for_fn (fn) = bb_count;
642 if (bb_count > basic_block_info_for_fn (fn)->length ())
643 vec_safe_grow_cleared (basic_block_info_for_fn (fn), bb_count);
644
645 if (bb_count > label_to_block_map_for_fn (fn)->length ())
646 vec_safe_grow_cleared (label_to_block_map_for_fn (fn), bb_count);
647
648 index = streamer_read_hwi (ib);
649 while (index != -1)
650 {
651 basic_block bb = BASIC_BLOCK_FOR_FN (fn, index);
652 unsigned int edge_count;
653
654 if (bb == NULL)
655 bb = make_new_block (fn, index);
656
657 edge_count = streamer_read_uhwi (ib);
658
659 /* Connect up the CFG. */
660 for (i = 0; i < edge_count; i++)
661 {
662 unsigned int dest_index;
663 unsigned int edge_flags;
664 basic_block dest;
665 int probability;
666 gcov_type count;
667 edge e;
668
669 dest_index = streamer_read_uhwi (ib);
670 probability = (int) streamer_read_hwi (ib);
671 count = apply_scale ((gcov_type) streamer_read_gcov_count (ib),
672 count_materialization_scale);
673 edge_flags = streamer_read_uhwi (ib);
674
675 dest = BASIC_BLOCK_FOR_FN (fn, dest_index);
676
677 if (dest == NULL)
678 dest = make_new_block (fn, dest_index);
679
680 e = make_edge (bb, dest, edge_flags);
681 e->probability = probability;
682 e->count = count;
683 }
684
685 index = streamer_read_hwi (ib);
686 }
687
688 p_bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
689 index = streamer_read_hwi (ib);
690 while (index != -1)
691 {
692 basic_block bb = BASIC_BLOCK_FOR_FN (fn, index);
693 bb->prev_bb = p_bb;
694 p_bb->next_bb = bb;
695 p_bb = bb;
696 index = streamer_read_hwi (ib);
697 }
698
699 /* ??? The cfgloop interface is tied to cfun. */
700 gcc_assert (cfun == fn);
701
702 /* Input the loop tree. */
703 unsigned n_loops = streamer_read_uhwi (ib);
704 if (n_loops == 0)
705 return;
706
707 struct loops *loops = ggc_cleared_alloc<struct loops> ();
708 init_loops_structure (fn, loops, n_loops);
709 set_loops_for_fn (fn, loops);
710
711 /* Input each loop and associate it with its loop header so
712 flow_loops_find can rebuild the loop tree. */
713 for (unsigned i = 1; i < n_loops; ++i)
714 {
715 int header_index = streamer_read_hwi (ib);
716 if (header_index == -1)
717 {
718 loops->larray->quick_push (NULL);
719 continue;
720 }
721
722 struct loop *loop = alloc_loop ();
723 loop->header = BASIC_BLOCK_FOR_FN (fn, header_index);
724 loop->header->loop_father = loop;
725
726 /* Read everything copy_loop_info copies. */
727 loop->estimate_state = streamer_read_enum (ib, loop_estimation, EST_LAST);
728 loop->any_upper_bound = streamer_read_hwi (ib);
729 if (loop->any_upper_bound)
730 loop->nb_iterations_upper_bound = streamer_read_wi (ib);
731 loop->any_estimate = streamer_read_hwi (ib);
732 if (loop->any_estimate)
733 loop->nb_iterations_estimate = streamer_read_wi (ib);
734
735 /* Read OMP SIMD related info. */
736 loop->safelen = streamer_read_hwi (ib);
737 loop->dont_vectorize = streamer_read_hwi (ib);
738 loop->force_vectorize = streamer_read_hwi (ib);
739 loop->simduid = stream_read_tree (ib, data_in);
740
741 place_new_loop (fn, loop);
742
743 /* flow_loops_find doesn't like loops not in the tree, hook them
744 all as siblings of the tree root temporarily. */
745 flow_loop_tree_node_add (loops->tree_root, loop);
746 }
747
748 /* Rebuild the loop tree. */
749 flow_loops_find (loops);
750 }
751
752
753 /* Read the SSA names array for function FN from DATA_IN using input
754 block IB. */
755
756 static void
757 input_ssa_names (struct lto_input_block *ib, struct data_in *data_in,
758 struct function *fn)
759 {
760 unsigned int i, size;
761
762 size = streamer_read_uhwi (ib);
763 init_ssanames (fn, size);
764
765 i = streamer_read_uhwi (ib);
766 while (i)
767 {
768 tree ssa_name, name;
769 bool is_default_def;
770
771 /* Skip over the elements that had been freed. */
772 while (SSANAMES (fn)->length () < i)
773 SSANAMES (fn)->quick_push (NULL_TREE);
774
775 is_default_def = (streamer_read_uchar (ib) != 0);
776 name = stream_read_tree (ib, data_in);
777 ssa_name = make_ssa_name_fn (fn, name, gimple_build_nop ());
778
779 if (is_default_def)
780 set_ssa_default_def (cfun, SSA_NAME_VAR (ssa_name), ssa_name);
781
782 i = streamer_read_uhwi (ib);
783 }
784 }
785
786
787 /* Go through all NODE edges and fixup call_stmt pointers
788 so they point to STMTS. */
789
790 static void
791 fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple *stmts,
792 struct function *fn)
793 {
794 struct cgraph_edge *cedge;
795 struct ipa_ref *ref = NULL;
796 unsigned int i;
797
798 for (cedge = node->callees; cedge; cedge = cedge->next_callee)
799 {
800 if (gimple_stmt_max_uid (fn) < cedge->lto_stmt_uid)
801 fatal_error ("Cgraph edge statement index out of range");
802 cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
803 if (!cedge->call_stmt)
804 fatal_error ("Cgraph edge statement index not found");
805 }
806 for (cedge = node->indirect_calls; cedge; cedge = cedge->next_callee)
807 {
808 if (gimple_stmt_max_uid (fn) < cedge->lto_stmt_uid)
809 fatal_error ("Cgraph edge statement index out of range");
810 cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
811 if (!cedge->call_stmt)
812 fatal_error ("Cgraph edge statement index not found");
813 }
814 for (i = 0; node->iterate_reference (i, ref); i++)
815 if (ref->lto_stmt_uid)
816 {
817 if (gimple_stmt_max_uid (fn) < ref->lto_stmt_uid)
818 fatal_error ("Reference statement index out of range");
819 ref->stmt = stmts[ref->lto_stmt_uid - 1];
820 if (!ref->stmt)
821 fatal_error ("Reference statement index not found");
822 }
823 }
824
825
826 /* Fixup call_stmt pointers in NODE and all clones. */
827
828 static void
829 fixup_call_stmt_edges (struct cgraph_node *orig, gimple *stmts)
830 {
831 struct cgraph_node *node;
832 struct function *fn;
833
834 while (orig->clone_of)
835 orig = orig->clone_of;
836 fn = DECL_STRUCT_FUNCTION (orig->decl);
837
838 fixup_call_stmt_edges_1 (orig, stmts, fn);
839 if (orig->clones)
840 for (node = orig->clones; node != orig;)
841 {
842 fixup_call_stmt_edges_1 (node, stmts, fn);
843 if (node->clones)
844 node = node->clones;
845 else if (node->next_sibling_clone)
846 node = node->next_sibling_clone;
847 else
848 {
849 while (node != orig && !node->next_sibling_clone)
850 node = node->clone_of;
851 if (node != orig)
852 node = node->next_sibling_clone;
853 }
854 }
855 }
856
857
858 /* Input the base body of struct function FN from DATA_IN
859 using input block IB. */
860
861 static void
862 input_struct_function_base (struct function *fn, struct data_in *data_in,
863 struct lto_input_block *ib)
864 {
865 struct bitpack_d bp;
866 int len;
867
868 /* Read the static chain and non-local goto save area. */
869 fn->static_chain_decl = stream_read_tree (ib, data_in);
870 fn->nonlocal_goto_save_area = stream_read_tree (ib, data_in);
871
872 /* Read all the local symbols. */
873 len = streamer_read_hwi (ib);
874 if (len > 0)
875 {
876 int i;
877 vec_safe_grow_cleared (fn->local_decls, len);
878 for (i = 0; i < len; i++)
879 {
880 tree t = stream_read_tree (ib, data_in);
881 (*fn->local_decls)[i] = t;
882 }
883 }
884
885 /* Input the current IL state of the function. */
886 fn->curr_properties = streamer_read_uhwi (ib);
887
888 /* Read all the attributes for FN. */
889 bp = streamer_read_bitpack (ib);
890 fn->is_thunk = bp_unpack_value (&bp, 1);
891 fn->has_local_explicit_reg_vars = bp_unpack_value (&bp, 1);
892 fn->returns_pcc_struct = bp_unpack_value (&bp, 1);
893 fn->returns_struct = bp_unpack_value (&bp, 1);
894 fn->can_throw_non_call_exceptions = bp_unpack_value (&bp, 1);
895 fn->can_delete_dead_exceptions = bp_unpack_value (&bp, 1);
896 fn->always_inline_functions_inlined = bp_unpack_value (&bp, 1);
897 fn->after_inlining = bp_unpack_value (&bp, 1);
898 fn->stdarg = bp_unpack_value (&bp, 1);
899 fn->has_nonlocal_label = bp_unpack_value (&bp, 1);
900 fn->calls_alloca = bp_unpack_value (&bp, 1);
901 fn->calls_setjmp = bp_unpack_value (&bp, 1);
902 fn->has_force_vectorize_loops = bp_unpack_value (&bp, 1);
903 fn->has_simduid_loops = bp_unpack_value (&bp, 1);
904 fn->va_list_fpr_size = bp_unpack_value (&bp, 8);
905 fn->va_list_gpr_size = bp_unpack_value (&bp, 8);
906 fn->last_clique = bp_unpack_value (&bp, sizeof (short) * 8);
907
908 /* Input the function start and end loci. */
909 fn->function_start_locus = stream_input_location (&bp, data_in);
910 fn->function_end_locus = stream_input_location (&bp, data_in);
911 }
912
913
914 /* Read the body of function FN_DECL from DATA_IN using input block IB. */
915
916 static void
917 input_function (tree fn_decl, struct data_in *data_in,
918 struct lto_input_block *ib, struct lto_input_block *ib_cfg)
919 {
920 struct function *fn;
921 enum LTO_tags tag;
922 gimple *stmts;
923 basic_block bb;
924 struct cgraph_node *node;
925
926 tag = streamer_read_record_start (ib);
927 lto_tag_check (tag, LTO_function);
928
929 /* Read decls for parameters and args. */
930 DECL_RESULT (fn_decl) = stream_read_tree (ib, data_in);
931 DECL_ARGUMENTS (fn_decl) = streamer_read_chain (ib, data_in);
932
933 /* Read the tree of lexical scopes for the function. */
934 DECL_INITIAL (fn_decl) = stream_read_tree (ib, data_in);
935
936 if (!streamer_read_uhwi (ib))
937 return;
938
939 push_struct_function (fn_decl);
940 fn = DECL_STRUCT_FUNCTION (fn_decl);
941 init_tree_ssa (fn);
942 /* We input IL in SSA form. */
943 cfun->gimple_df->in_ssa_p = true;
944
945 gimple_register_cfg_hooks ();
946
947 node = cgraph_node::get (fn_decl);
948 if (!node)
949 node = cgraph_node::create (fn_decl);
950 input_struct_function_base (fn, data_in, ib);
951 input_cfg (ib_cfg, data_in, fn, node->count_materialization_scale);
952
953 /* Read all the SSA names. */
954 input_ssa_names (ib, data_in, fn);
955
956 /* Read the exception handling regions in the function. */
957 input_eh_regions (ib, data_in, fn);
958
959 gcc_assert (DECL_INITIAL (fn_decl));
960 DECL_SAVED_TREE (fn_decl) = NULL_TREE;
961
962 /* Read all the basic blocks. */
963 tag = streamer_read_record_start (ib);
964 while (tag)
965 {
966 input_bb (ib, tag, data_in, fn,
967 node->count_materialization_scale);
968 tag = streamer_read_record_start (ib);
969 }
970
971 /* Fix up the call statements that are mentioned in the callgraph
972 edges. */
973 set_gimple_stmt_max_uid (cfun, 0);
974 FOR_ALL_BB_FN (bb, cfun)
975 {
976 gimple_stmt_iterator gsi;
977 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
978 {
979 gimple stmt = gsi_stmt (gsi);
980 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
981 }
982 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
983 {
984 gimple stmt = gsi_stmt (gsi);
985 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
986 }
987 }
988 stmts = (gimple *) xcalloc (gimple_stmt_max_uid (fn), sizeof (gimple));
989 FOR_ALL_BB_FN (bb, cfun)
990 {
991 gimple_stmt_iterator bsi = gsi_start_phis (bb);
992 while (!gsi_end_p (bsi))
993 {
994 gimple stmt = gsi_stmt (bsi);
995 gsi_next (&bsi);
996 stmts[gimple_uid (stmt)] = stmt;
997 }
998 bsi = gsi_start_bb (bb);
999 while (!gsi_end_p (bsi))
1000 {
1001 gimple stmt = gsi_stmt (bsi);
1002 /* If we're recompiling LTO objects with debug stmts but
1003 we're not supposed to have debug stmts, remove them now.
1004 We can't remove them earlier because this would cause uid
1005 mismatches in fixups, but we can do it at this point, as
1006 long as debug stmts don't require fixups. */
1007 if (!MAY_HAVE_DEBUG_STMTS && !flag_wpa && is_gimple_debug (stmt))
1008 {
1009 gimple_stmt_iterator gsi = bsi;
1010 gsi_next (&bsi);
1011 gsi_remove (&gsi, true);
1012 }
1013 else
1014 {
1015 gsi_next (&bsi);
1016 stmts[gimple_uid (stmt)] = stmt;
1017 }
1018 }
1019 }
1020
1021 /* Set the gimple body to the statement sequence in the entry
1022 basic block. FIXME lto, this is fairly hacky. The existence
1023 of a gimple body is used by the cgraph routines, but we should
1024 really use the presence of the CFG. */
1025 {
1026 edge_iterator ei = ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs);
1027 gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest));
1028 }
1029
1030 fixup_call_stmt_edges (node, stmts);
1031 execute_all_ipa_stmt_fixups (node, stmts);
1032
1033 update_ssa (TODO_update_ssa_only_virtuals);
1034 free_dominance_info (CDI_DOMINATORS);
1035 free_dominance_info (CDI_POST_DOMINATORS);
1036 free (stmts);
1037 pop_cfun ();
1038 }
1039
1040 /* Read the body of function FN_DECL from DATA_IN using input block IB. */
1041
1042 static void
1043 input_constructor (tree var, struct data_in *data_in,
1044 struct lto_input_block *ib)
1045 {
1046 DECL_INITIAL (var) = stream_read_tree (ib, data_in);
1047 }
1048
1049
1050 /* Read the body from DATA for function NODE and fill it in.
1051 FILE_DATA are the global decls and types. SECTION_TYPE is either
1052 LTO_section_function_body or LTO_section_static_initializer. If
1053 section type is LTO_section_function_body, FN must be the decl for
1054 that function. */
1055
1056 static void
1057 lto_read_body_or_constructor (struct lto_file_decl_data *file_data, struct symtab_node *node,
1058 const char *data, enum lto_section_type section_type)
1059 {
1060 const struct lto_function_header *header;
1061 struct data_in *data_in;
1062 int cfg_offset;
1063 int main_offset;
1064 int string_offset;
1065 tree fn_decl = node->decl;
1066
1067 header = (const struct lto_function_header *) data;
1068 if (TREE_CODE (node->decl) == FUNCTION_DECL)
1069 {
1070 cfg_offset = sizeof (struct lto_function_header);
1071 main_offset = cfg_offset + header->cfg_size;
1072 string_offset = main_offset + header->main_size;
1073 }
1074 else
1075 {
1076 main_offset = sizeof (struct lto_function_header);
1077 string_offset = main_offset + header->main_size;
1078 }
1079
1080 data_in = lto_data_in_create (file_data, data + string_offset,
1081 header->string_size, vNULL);
1082
1083 if (section_type == LTO_section_function_body)
1084 {
1085 struct lto_in_decl_state *decl_state;
1086 unsigned from;
1087
1088 gcc_checking_assert (node);
1089
1090 /* Use the function's decl state. */
1091 decl_state = lto_get_function_in_decl_state (file_data, fn_decl);
1092 gcc_assert (decl_state);
1093 file_data->current_decl_state = decl_state;
1094
1095
1096 /* Set up the struct function. */
1097 from = data_in->reader_cache->nodes.length ();
1098 lto_input_block ib_main (data + main_offset, header->main_size);
1099 if (TREE_CODE (node->decl) == FUNCTION_DECL)
1100 {
1101 lto_input_block ib_cfg (data + cfg_offset, header->cfg_size);
1102 input_function (fn_decl, data_in, &ib_main, &ib_cfg);
1103 }
1104 else
1105 input_constructor (fn_decl, data_in, &ib_main);
1106 /* And fixup types we streamed locally. */
1107 {
1108 struct streamer_tree_cache_d *cache = data_in->reader_cache;
1109 unsigned len = cache->nodes.length ();
1110 unsigned i;
1111 for (i = len; i-- > from;)
1112 {
1113 tree t = streamer_tree_cache_get_tree (cache, i);
1114 if (t == NULL_TREE)
1115 continue;
1116
1117 if (TYPE_P (t))
1118 {
1119 gcc_assert (TYPE_CANONICAL (t) == NULL_TREE);
1120 TYPE_CANONICAL (t) = TYPE_MAIN_VARIANT (t);
1121 if (TYPE_MAIN_VARIANT (t) != t)
1122 {
1123 gcc_assert (TYPE_NEXT_VARIANT (t) == NULL_TREE);
1124 TYPE_NEXT_VARIANT (t)
1125 = TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t));
1126 TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t)) = t;
1127 }
1128 }
1129 }
1130 }
1131
1132 /* Restore decl state */
1133 file_data->current_decl_state = file_data->global_decl_state;
1134 }
1135
1136 lto_data_in_delete (data_in);
1137 }
1138
1139
1140 /* Read the body of NODE using DATA. FILE_DATA holds the global
1141 decls and types. */
1142
1143 void
1144 lto_input_function_body (struct lto_file_decl_data *file_data,
1145 struct cgraph_node *node, const char *data)
1146 {
1147 lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body);
1148 }
1149
1150 /* Read the body of NODE using DATA. FILE_DATA holds the global
1151 decls and types. */
1152
1153 void
1154 lto_input_variable_constructor (struct lto_file_decl_data *file_data,
1155 struct varpool_node *node, const char *data)
1156 {
1157 lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body);
1158 }
1159
1160
1161 /* Read the physical representation of a tree node EXPR from
1162 input block IB using the per-file context in DATA_IN. */
1163
1164 static void
1165 lto_read_tree_1 (struct lto_input_block *ib, struct data_in *data_in, tree expr)
1166 {
1167 /* Read all the bitfield values in EXPR. Note that for LTO, we
1168 only write language-independent bitfields, so no more unpacking is
1169 needed. */
1170 streamer_read_tree_bitfields (ib, data_in, expr);
1171
1172 /* Read all the pointer fields in EXPR. */
1173 streamer_read_tree_body (ib, data_in, expr);
1174
1175 /* Read any LTO-specific data not read by the tree streamer. */
1176 if (DECL_P (expr)
1177 && TREE_CODE (expr) != FUNCTION_DECL
1178 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1179 DECL_INITIAL (expr) = stream_read_tree (ib, data_in);
1180
1181 /* We should never try to instantiate an MD or NORMAL builtin here. */
1182 if (TREE_CODE (expr) == FUNCTION_DECL)
1183 gcc_assert (!streamer_handle_as_builtin_p (expr));
1184
1185 #ifdef LTO_STREAMER_DEBUG
1186 /* Remove the mapping to RESULT's original address set by
1187 streamer_alloc_tree. */
1188 lto_orig_address_remove (expr);
1189 #endif
1190 }
1191
1192 /* Read the physical representation of a tree node with tag TAG from
1193 input block IB using the per-file context in DATA_IN. */
1194
1195 static tree
1196 lto_read_tree (struct lto_input_block *ib, struct data_in *data_in,
1197 enum LTO_tags tag, hashval_t hash)
1198 {
1199 /* Instantiate a new tree node. */
1200 tree result = streamer_alloc_tree (ib, data_in, tag);
1201
1202 /* Enter RESULT in the reader cache. This will make RESULT
1203 available so that circular references in the rest of the tree
1204 structure can be resolved in subsequent calls to stream_read_tree. */
1205 streamer_tree_cache_append (data_in->reader_cache, result, hash);
1206
1207 lto_read_tree_1 (ib, data_in, result);
1208
1209 /* end_marker = */ streamer_read_uchar (ib);
1210
1211 return result;
1212 }
1213
1214
1215 /* Populate the reader cache with trees materialized from the SCC
1216 following in the IB, DATA_IN stream. */
1217
1218 hashval_t
1219 lto_input_scc (struct lto_input_block *ib, struct data_in *data_in,
1220 unsigned *len, unsigned *entry_len)
1221 {
1222 /* A blob of unnamed tree nodes, fill the cache from it and
1223 recurse. */
1224 unsigned size = streamer_read_uhwi (ib);
1225 hashval_t scc_hash = streamer_read_uhwi (ib);
1226 unsigned scc_entry_len = 1;
1227
1228 if (size == 1)
1229 {
1230 enum LTO_tags tag = streamer_read_record_start (ib);
1231 lto_input_tree_1 (ib, data_in, tag, scc_hash);
1232 }
1233 else
1234 {
1235 unsigned int first = data_in->reader_cache->nodes.length ();
1236 tree result;
1237
1238 scc_entry_len = streamer_read_uhwi (ib);
1239
1240 /* Materialize size trees by reading their headers. */
1241 for (unsigned i = 0; i < size; ++i)
1242 {
1243 enum LTO_tags tag = streamer_read_record_start (ib);
1244 if (tag == LTO_null
1245 || (tag >= LTO_field_decl_ref && tag <= LTO_global_decl_ref)
1246 || tag == LTO_tree_pickle_reference
1247 || tag == LTO_builtin_decl
1248 || tag == LTO_integer_cst
1249 || tag == LTO_tree_scc)
1250 gcc_unreachable ();
1251
1252 result = streamer_alloc_tree (ib, data_in, tag);
1253 streamer_tree_cache_append (data_in->reader_cache, result, 0);
1254 }
1255
1256 /* Read the tree bitpacks and references. */
1257 for (unsigned i = 0; i < size; ++i)
1258 {
1259 result = streamer_tree_cache_get_tree (data_in->reader_cache,
1260 first + i);
1261 lto_read_tree_1 (ib, data_in, result);
1262 /* end_marker = */ streamer_read_uchar (ib);
1263 }
1264 }
1265
1266 *len = size;
1267 *entry_len = scc_entry_len;
1268 return scc_hash;
1269 }
1270
1271
1272 /* Read a tree from input block IB using the per-file context in
1273 DATA_IN. This context is used, for example, to resolve references
1274 to previously read nodes. */
1275
1276 tree
1277 lto_input_tree_1 (struct lto_input_block *ib, struct data_in *data_in,
1278 enum LTO_tags tag, hashval_t hash)
1279 {
1280 tree result;
1281
1282 gcc_assert ((unsigned) tag < (unsigned) LTO_NUM_TAGS);
1283
1284 if (tag == LTO_null)
1285 result = NULL_TREE;
1286 else if (tag >= LTO_field_decl_ref && tag <= LTO_namelist_decl_ref)
1287 {
1288 /* If TAG is a reference to an indexable tree, the next value
1289 in IB is the index into the table where we expect to find
1290 that tree. */
1291 result = lto_input_tree_ref (ib, data_in, cfun, tag);
1292 }
1293 else if (tag == LTO_tree_pickle_reference)
1294 {
1295 /* If TAG is a reference to a previously read tree, look it up in
1296 the reader cache. */
1297 result = streamer_get_pickled_tree (ib, data_in);
1298 }
1299 else if (tag == LTO_builtin_decl)
1300 {
1301 /* If we are going to read a built-in function, all we need is
1302 the code and class. */
1303 result = streamer_get_builtin_tree (ib, data_in);
1304 }
1305 else if (tag == LTO_integer_cst)
1306 {
1307 /* For shared integer constants in singletons we can use the
1308 existing tree integer constant merging code. */
1309 tree type = stream_read_tree (ib, data_in);
1310 unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
1311 unsigned HOST_WIDE_INT i;
1312 HOST_WIDE_INT a[WIDE_INT_MAX_ELTS];
1313
1314 for (i = 0; i < len; i++)
1315 a[i] = streamer_read_hwi (ib);
1316 gcc_assert (TYPE_PRECISION (type) <= MAX_BITSIZE_MODE_ANY_INT);
1317 result = wide_int_to_tree (type, wide_int::from_array
1318 (a, len, TYPE_PRECISION (type)));
1319 streamer_tree_cache_append (data_in->reader_cache, result, hash);
1320 }
1321 else if (tag == LTO_tree_scc)
1322 gcc_unreachable ();
1323 else
1324 {
1325 /* Otherwise, materialize a new node from IB. */
1326 result = lto_read_tree (ib, data_in, tag, hash);
1327 }
1328
1329 return result;
1330 }
1331
1332 tree
1333 lto_input_tree (struct lto_input_block *ib, struct data_in *data_in)
1334 {
1335 enum LTO_tags tag;
1336
1337 /* Input and skip SCCs. */
1338 while ((tag = streamer_read_record_start (ib)) == LTO_tree_scc)
1339 {
1340 unsigned len, entry_len;
1341 lto_input_scc (ib, data_in, &len, &entry_len);
1342 }
1343 return lto_input_tree_1 (ib, data_in, tag, 0);
1344 }
1345
1346
1347 /* Input toplevel asms. */
1348
1349 void
1350 lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base)
1351 {
1352 size_t len;
1353 const char *data = lto_get_section_data (file_data, LTO_section_asm,
1354 NULL, &len);
1355 const struct lto_simple_header_with_strings *header
1356 = (const struct lto_simple_header_with_strings *) data;
1357 int string_offset;
1358 struct data_in *data_in;
1359 tree str;
1360
1361 if (! data)
1362 return;
1363
1364 string_offset = sizeof (*header) + header->main_size;
1365
1366 lto_input_block ib (data + sizeof (*header), header->main_size);
1367
1368 data_in = lto_data_in_create (file_data, data + string_offset,
1369 header->string_size, vNULL);
1370
1371 while ((str = streamer_read_string_cst (data_in, &ib)))
1372 {
1373 asm_node *node = symtab->finalize_toplevel_asm (str);
1374 node->order = streamer_read_hwi (&ib) + order_base;
1375 if (node->order >= symtab->order)
1376 symtab->order = node->order + 1;
1377 }
1378
1379 lto_data_in_delete (data_in);
1380
1381 lto_free_section_data (file_data, LTO_section_asm, NULL, data, len);
1382 }
1383
1384
1385 /* Initialization for the LTO reader. */
1386
1387 void
1388 lto_reader_init (void)
1389 {
1390 lto_streamer_init ();
1391 file_name_hash_table
1392 = new hash_table<freeing_string_slot_hasher> (37);
1393 }
1394
1395
1396 /* Create a new data_in object for FILE_DATA. STRINGS is the string
1397 table to use with LEN strings. RESOLUTIONS is the vector of linker
1398 resolutions (NULL if not using a linker plugin). */
1399
1400 struct data_in *
1401 lto_data_in_create (struct lto_file_decl_data *file_data, const char *strings,
1402 unsigned len,
1403 vec<ld_plugin_symbol_resolution_t> resolutions)
1404 {
1405 struct data_in *data_in = XCNEW (struct data_in);
1406 data_in->file_data = file_data;
1407 data_in->strings = strings;
1408 data_in->strings_len = len;
1409 data_in->globals_resolution = resolutions;
1410 data_in->reader_cache = streamer_tree_cache_create (false, false, true);
1411 return data_in;
1412 }
1413
1414
1415 /* Remove DATA_IN. */
1416
1417 void
1418 lto_data_in_delete (struct data_in *data_in)
1419 {
1420 data_in->globals_resolution.release ();
1421 streamer_tree_cache_delete (data_in->reader_cache);
1422 free (data_in);
1423 }