]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/lto-streamer-in.c
trans.c (check_inlining_for_nested_subprog): Quote reserved names.
[thirdparty/gcc.git] / gcc / lto-streamer-in.c
CommitLineData
d7f09764
DN
1/* Read the GIMPLE representation from a file stream.
2
a5544970 3 Copyright (C) 2009-2019 Free Software Foundation, Inc.
d7f09764
DN
4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5 Re-implemented by Diego Novillo <dnovillo@google.com>
6
7This file is part of GCC.
8
9GCC is free software; you can redistribute it and/or modify it under
10the terms of the GNU General Public License as published by the Free
11Software Foundation; either version 3, or (at your option) any later
12version.
13
14GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15WARRANTY; without even the implied warranty of MERCHANTABILITY or
16FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17for more details.
18
19You should have received a copy of the GNU General Public License
20along 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"
c7131fb2 26#include "backend.h"
957060b5
AM
27#include "target.h"
28#include "rtl.h"
c7131fb2
AM
29#include "tree.h"
30#include "gimple.h"
957060b5
AM
31#include "cfghooks.h"
32#include "tree-pass.h"
c7131fb2 33#include "ssa.h"
957060b5 34#include "gimple-streamer.h"
d7f09764 35#include "toplev.h"
5be5c238 36#include "gimple-iterator.h"
442b4905 37#include "tree-cfg.h"
442b4905
AM
38#include "tree-into-ssa.h"
39#include "tree-dfa.h"
7a300452 40#include "tree-ssa.h"
d7f09764 41#include "except.h"
c582198b 42#include "cgraph.h"
dd366ec3 43#include "cfgloop.h"
1ea85365 44#include "debug.h"
dd366ec3 45
d7f09764 46
4a8fb1a1
LC
47struct freeing_string_slot_hasher : string_slot_hasher
48{
49 static inline void remove (value_type *);
50};
51
52inline void
53freeing_string_slot_hasher::remove (value_type *v)
54{
55 free (v);
56}
57
d7f09764 58/* The table to hold the file names. */
c203e8a7 59static hash_table<freeing_string_slot_hasher> *file_name_hash_table;
d7f09764
DN
60
61
62/* Check that tag ACTUAL has one of the given values. NUM_TAGS is the
63 number of valid tag values to check. */
64
f0efc7aa 65void
d7f09764
DN
66lto_tag_check_set (enum LTO_tags actual, int ntags, ...)
67{
68 va_list ap;
69 int i;
70
71 va_start (ap, ntags);
72 for (i = 0; i < ntags; i++)
73 if ((unsigned) actual == va_arg (ap, unsigned))
74 {
75 va_end (ap);
76 return;
77 }
78
79 va_end (ap);
80 internal_error ("bytecode stream: unexpected tag %s", lto_tag_name (actual));
81}
82
83
a183b5c7
DN
84/* Read LENGTH bytes from STREAM to ADDR. */
85
86void
87lto_input_data_block (struct lto_input_block *ib, void *addr, size_t length)
88{
89 size_t i;
d112b94a 90 unsigned char *const buffer = (unsigned char *) addr;
a183b5c7
DN
91
92 for (i = 0; i < length; i++)
412288f1 93 buffer[i] = streamer_read_uchar (ib);
a183b5c7
DN
94}
95
96
d7f09764
DN
97/* Lookup STRING in file_name_hash_table. If found, return the existing
98 string, otherwise insert STRING as the canonical version. */
99
100static const char *
101canon_file_name (const char *string)
102{
4a8fb1a1 103 string_slot **slot;
d7f09764 104 struct string_slot s_slot;
0b11d702
MM
105 size_t len = strlen (string);
106
d7f09764 107 s_slot.s = string;
0b11d702 108 s_slot.len = len;
d7f09764 109
c203e8a7 110 slot = file_name_hash_table->find_slot (&s_slot, INSERT);
d7f09764
DN
111 if (*slot == NULL)
112 {
d7f09764
DN
113 char *saved_string;
114 struct string_slot *new_slot;
115
d7f09764
DN
116 saved_string = (char *) xmalloc (len + 1);
117 new_slot = XCNEW (struct string_slot);
0b11d702 118 memcpy (saved_string, string, len + 1);
d7f09764 119 new_slot->s = saved_string;
0b11d702 120 new_slot->len = len;
d7f09764
DN
121 *slot = new_slot;
122 return saved_string;
123 }
124 else
125 {
4a8fb1a1 126 struct string_slot *old_slot = *slot;
d7f09764
DN
127 return old_slot->s;
128 }
129}
130
eaeec5ec 131/* Pointer to currently alive instance of lto_location_cache. */
d7f09764 132
eaeec5ec 133lto_location_cache *lto_location_cache::current_cache;
d7f09764 134
eaeec5ec
JH
135/* Sort locations in source order. Start with file from last application. */
136
137int
138lto_location_cache::cmp_loc (const void *pa, const void *pb)
139{
140 const cached_location *a = ((const cached_location *)pa);
141 const cached_location *b = ((const cached_location *)pb);
142 const char *current_file = current_cache->current_file;
143 int current_line = current_cache->current_line;
144
145 if (a->file == current_file && b->file != current_file)
146 return -1;
147 if (a->file != current_file && b->file == current_file)
148 return 1;
149 if (a->file == current_file && b->file == current_file)
150 {
151 if (a->line == current_line && b->line != current_line)
152 return -1;
153 if (a->line != current_line && b->line == current_line)
154 return 1;
155 }
156 if (a->file != b->file)
157 return strcmp (a->file, b->file);
6c1bc27c
RB
158 if (a->sysp != b->sysp)
159 return a->sysp ? 1 : -1;
eaeec5ec
JH
160 if (a->line != b->line)
161 return a->line - b->line;
162 return a->col - b->col;
163}
164
165/* Apply all changes in location cache. Add locations into linemap and patch
166 trees. */
167
168bool
169lto_location_cache::apply_location_cache ()
170{
171 static const char *prev_file;
172 if (!loc_cache.length ())
173 return false;
174 if (loc_cache.length () > 1)
175 loc_cache.qsort (cmp_loc);
176
177 for (unsigned int i = 0; i < loc_cache.length (); i++)
178 {
179 struct cached_location loc = loc_cache[i];
180
181 if (current_file != loc.file)
182 linemap_add (line_table, prev_file ? LC_RENAME : LC_ENTER,
6c1bc27c 183 loc.sysp, loc.file, loc.line);
eaeec5ec
JH
184 else if (current_line != loc.line)
185 {
186 int max = loc.col;
187
188 for (unsigned int j = i + 1; j < loc_cache.length (); j++)
189 if (loc.file != loc_cache[j].file
190 || loc.line != loc_cache[j].line)
191 break;
192 else if (max < loc_cache[j].col)
193 max = loc_cache[j].col;
194 linemap_line_start (line_table, loc.line, max + 1);
195 }
196 gcc_assert (*loc.loc == BUILTINS_LOCATION + 1);
197 if (current_file == loc.file && current_line == loc.line
198 && current_col == loc.col)
199 *loc.loc = current_loc;
200 else
201 current_loc = *loc.loc = linemap_position_for_column (line_table,
202 loc.col);
203 current_line = loc.line;
204 prev_file = current_file = loc.file;
205 current_col = loc.col;
206 }
207 loc_cache.truncate (0);
208 accepted_length = 0;
209 return true;
210}
211
212/* Tree merging did not suceed; mark all changes in the cache as accepted. */
213
214void
215lto_location_cache::accept_location_cache ()
216{
217 gcc_assert (current_cache == this);
218 accepted_length = loc_cache.length ();
219}
220
221/* Tree merging did suceed; throw away recent changes. */
222
223void
224lto_location_cache::revert_location_cache ()
225{
226 loc_cache.truncate (accepted_length);
227}
228
229/* Read a location bitpack from input block IB and either update *LOC directly
230 or add it to the location cache.
231 It is neccesary to call apply_location_cache to get *LOC updated. */
232
233void
234lto_location_cache::input_location (location_t *loc, struct bitpack_d *bp,
235 struct data_in *data_in)
d7f09764 236{
eaeec5ec
JH
237 static const char *stream_file;
238 static int stream_line;
239 static int stream_col;
6c1bc27c 240 static bool stream_sysp;
51a9ed47 241 bool file_change, line_change, column_change;
eaeec5ec
JH
242
243 gcc_assert (current_cache == this);
d7f09764 244
44433db0
JH
245 *loc = bp_unpack_int_in_range (bp, "location", 0, RESERVED_LOCATION_COUNT);
246
247 if (*loc < RESERVED_LOCATION_COUNT)
248 return;
249
250 /* Keep value RESERVED_LOCATION_COUNT in *loc as linemap lookups will
251 ICE on it. */
d7f09764 252
51a9ed47 253 file_change = bp_unpack_value (bp, 1);
e45cde98
RB
254 line_change = bp_unpack_value (bp, 1);
255 column_change = bp_unpack_value (bp, 1);
256
51a9ed47 257 if (file_change)
6c1bc27c
RB
258 {
259 stream_file = canon_file_name (bp_unpack_string (data_in, bp));
260 stream_sysp = bp_unpack_value (bp, 1);
261 }
51a9ed47 262
51a9ed47 263 if (line_change)
eaeec5ec 264 stream_line = bp_unpack_var_len_unsigned (bp);
d7f09764 265
51a9ed47 266 if (column_change)
eaeec5ec 267 stream_col = bp_unpack_var_len_unsigned (bp);
51a9ed47 268
eaeec5ec
JH
269 /* This optimization saves location cache operations druing gimple
270 streaming. */
271
272 if (current_file == stream_file && current_line == stream_line
6c1bc27c 273 && current_col == stream_col && current_sysp == stream_sysp)
b7dae211 274 {
eaeec5ec
JH
275 *loc = current_loc;
276 return;
b7dae211 277 }
51a9ed47 278
6c1bc27c
RB
279 struct cached_location entry
280 = {stream_file, loc, stream_line, stream_col, stream_sysp};
eaeec5ec
JH
281 loc_cache.safe_push (entry);
282}
283
284/* Read a location bitpack from input block IB and either update *LOC directly
285 or add it to the location cache.
286 It is neccesary to call apply_location_cache to get *LOC updated. */
287
288void
289lto_input_location (location_t *loc, struct bitpack_d *bp,
290 struct data_in *data_in)
291{
292 data_in->location_cache.input_location (loc, bp, data_in);
51a9ed47
JH
293}
294
eaeec5ec
JH
295/* Read location and return it instead of going through location caching.
296 This should be used only when the resulting location is not going to be
297 discarded. */
298
299location_t
300stream_input_location_now (struct bitpack_d *bp, struct data_in *data_in)
301{
302 location_t loc;
303 stream_input_location (&loc, bp, data_in);
304 data_in->location_cache.apply_location_cache ();
305 return loc;
306}
b7dae211 307
d7f09764
DN
308/* Read a reference to a tree node from DATA_IN using input block IB.
309 TAG is the expected node that should be found in IB, if TAG belongs
310 to one of the indexable trees, expect to read a reference index to
311 be looked up in one of the symbol tables, otherwise read the pysical
b9393656 312 representation of the tree using stream_read_tree. FN is the
d7f09764
DN
313 function scope for the read tree. */
314
f0efc7aa 315tree
b8698a0f 316lto_input_tree_ref (struct lto_input_block *ib, struct data_in *data_in,
d7f09764
DN
317 struct function *fn, enum LTO_tags tag)
318{
319 unsigned HOST_WIDE_INT ix_u;
320 tree result = NULL_TREE;
321
5f673c6a 322 lto_tag_check_range (tag, LTO_field_decl_ref, LTO_namelist_decl_ref);
d7f09764
DN
323
324 switch (tag)
325 {
326 case LTO_type_ref:
412288f1 327 ix_u = streamer_read_uhwi (ib);
d7f09764
DN
328 result = lto_file_decl_data_get_type (data_in->file_data, ix_u);
329 break;
330
331 case LTO_ssa_name_ref:
412288f1 332 ix_u = streamer_read_uhwi (ib);
9771b263 333 result = (*SSANAMES (fn))[ix_u];
d7f09764
DN
334 break;
335
336 case LTO_field_decl_ref:
412288f1 337 ix_u = streamer_read_uhwi (ib);
d7f09764
DN
338 result = lto_file_decl_data_get_field_decl (data_in->file_data, ix_u);
339 break;
340
341 case LTO_function_decl_ref:
412288f1 342 ix_u = streamer_read_uhwi (ib);
d7f09764
DN
343 result = lto_file_decl_data_get_fn_decl (data_in->file_data, ix_u);
344 break;
345
346 case LTO_type_decl_ref:
412288f1 347 ix_u = streamer_read_uhwi (ib);
d7f09764
DN
348 result = lto_file_decl_data_get_type_decl (data_in->file_data, ix_u);
349 break;
350
351 case LTO_namespace_decl_ref:
412288f1 352 ix_u = streamer_read_uhwi (ib);
d7f09764
DN
353 result = lto_file_decl_data_get_namespace_decl (data_in->file_data, ix_u);
354 break;
355
356 case LTO_global_decl_ref:
357 case LTO_result_decl_ref:
358 case LTO_const_decl_ref:
359 case LTO_imported_decl_ref:
360 case LTO_label_decl_ref:
6be14c0e 361 case LTO_translation_unit_decl_ref:
c39276b8 362 case LTO_namelist_decl_ref:
412288f1 363 ix_u = streamer_read_uhwi (ib);
d7f09764 364 result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
d7f09764
DN
365 break;
366
367 default:
368 gcc_unreachable ();
369 }
370
371 gcc_assert (result);
372
373 return result;
374}
375
376
377/* Read and return a double-linked list of catch handlers from input
378 block IB, using descriptors in DATA_IN. */
379
380static struct eh_catch_d *
381lto_input_eh_catch_list (struct lto_input_block *ib, struct data_in *data_in,
382 eh_catch *last_p)
383{
384 eh_catch first;
385 enum LTO_tags tag;
386
387 *last_p = first = NULL;
412288f1 388 tag = streamer_read_record_start (ib);
d7f09764
DN
389 while (tag)
390 {
391 tree list;
392 eh_catch n;
393
394 lto_tag_check_range (tag, LTO_eh_catch, LTO_eh_catch);
395
396 /* Read the catch node. */
766090c2 397 n = ggc_cleared_alloc<eh_catch_d> ();
b9393656
DN
398 n->type_list = stream_read_tree (ib, data_in);
399 n->filter_list = stream_read_tree (ib, data_in);
400 n->label = stream_read_tree (ib, data_in);
d7f09764
DN
401
402 /* Register all the types in N->FILTER_LIST. */
403 for (list = n->filter_list; list; list = TREE_CHAIN (list))
404 add_type_for_runtime (TREE_VALUE (list));
405
406 /* Chain N to the end of the list. */
407 if (*last_p)
408 (*last_p)->next_catch = n;
409 n->prev_catch = *last_p;
410 *last_p = n;
411
412 /* Set the head of the list the first time through the loop. */
413 if (first == NULL)
414 first = n;
415
412288f1 416 tag = streamer_read_record_start (ib);
d7f09764
DN
417 }
418
419 return first;
420}
421
422
423/* Read and return EH region IX from input block IB, using descriptors
424 in DATA_IN. */
425
426static eh_region
427input_eh_region (struct lto_input_block *ib, struct data_in *data_in, int ix)
428{
429 enum LTO_tags tag;
430 eh_region r;
431
432 /* Read the region header. */
412288f1 433 tag = streamer_read_record_start (ib);
d7f09764
DN
434 if (tag == LTO_null)
435 return NULL;
436
766090c2 437 r = ggc_cleared_alloc<eh_region_d> ();
412288f1 438 r->index = streamer_read_hwi (ib);
d7f09764
DN
439
440 gcc_assert (r->index == ix);
441
442 /* Read all the region pointers as region numbers. We'll fix up
443 the pointers once the whole array has been read. */
412288f1
DN
444 r->outer = (eh_region) (intptr_t) streamer_read_hwi (ib);
445 r->inner = (eh_region) (intptr_t) streamer_read_hwi (ib);
446 r->next_peer = (eh_region) (intptr_t) streamer_read_hwi (ib);
d7f09764
DN
447
448 switch (tag)
449 {
450 case LTO_ert_cleanup:
451 r->type = ERT_CLEANUP;
452 break;
453
454 case LTO_ert_try:
455 {
456 struct eh_catch_d *last_catch;
457 r->type = ERT_TRY;
458 r->u.eh_try.first_catch = lto_input_eh_catch_list (ib, data_in,
459 &last_catch);
460 r->u.eh_try.last_catch = last_catch;
461 break;
462 }
463
464 case LTO_ert_allowed_exceptions:
465 {
466 tree l;
467
468 r->type = ERT_ALLOWED_EXCEPTIONS;
b9393656
DN
469 r->u.allowed.type_list = stream_read_tree (ib, data_in);
470 r->u.allowed.label = stream_read_tree (ib, data_in);
412288f1 471 r->u.allowed.filter = streamer_read_uhwi (ib);
d7f09764
DN
472
473 for (l = r->u.allowed.type_list; l ; l = TREE_CHAIN (l))
474 add_type_for_runtime (TREE_VALUE (l));
475 }
476 break;
477
478 case LTO_ert_must_not_throw:
7cb7d208
RB
479 {
480 r->type = ERT_MUST_NOT_THROW;
481 r->u.must_not_throw.failure_decl = stream_read_tree (ib, data_in);
482 bitpack_d bp = streamer_read_bitpack (ib);
483 r->u.must_not_throw.failure_loc
eaeec5ec 484 = stream_input_location_now (&bp, data_in);
7cb7d208 485 }
d7f09764
DN
486 break;
487
488 default:
489 gcc_unreachable ();
490 }
491
412288f1 492 r->landing_pads = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
d7f09764
DN
493
494 return r;
495}
496
497
498/* Read and return EH landing pad IX from input block IB, using descriptors
499 in DATA_IN. */
500
501static eh_landing_pad
502input_eh_lp (struct lto_input_block *ib, struct data_in *data_in, int ix)
503{
504 enum LTO_tags tag;
505 eh_landing_pad lp;
506
507 /* Read the landing pad header. */
412288f1 508 tag = streamer_read_record_start (ib);
d7f09764
DN
509 if (tag == LTO_null)
510 return NULL;
511
512 lto_tag_check_range (tag, LTO_eh_landing_pad, LTO_eh_landing_pad);
513
766090c2 514 lp = ggc_cleared_alloc<eh_landing_pad_d> ();
412288f1 515 lp->index = streamer_read_hwi (ib);
d7f09764 516 gcc_assert (lp->index == ix);
412288f1
DN
517 lp->next_lp = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
518 lp->region = (eh_region) (intptr_t) streamer_read_hwi (ib);
b9393656 519 lp->post_landing_pad = stream_read_tree (ib, data_in);
d7f09764
DN
520
521 return lp;
522}
523
524
525/* After reading the EH regions, pointers to peer and children regions
526 are region numbers. This converts all these region numbers into
527 real pointers into the rematerialized regions for FN. ROOT_REGION
528 is the region number for the root EH region in FN. */
529
530static void
531fixup_eh_region_pointers (struct function *fn, HOST_WIDE_INT root_region)
532{
533 unsigned i;
9771b263
DN
534 vec<eh_region, va_gc> *eh_array = fn->eh->region_array;
535 vec<eh_landing_pad, va_gc> *lp_array = fn->eh->lp_array;
d7f09764
DN
536 eh_region r;
537 eh_landing_pad lp;
538
539 gcc_assert (eh_array && lp_array);
540
541 gcc_assert (root_region >= 0);
9771b263 542 fn->eh->region_tree = (*eh_array)[root_region];
d7f09764 543
9771b263
DN
544#define FIXUP_EH_REGION(r) (r) = (*eh_array)[(HOST_WIDE_INT) (intptr_t) (r)]
545#define FIXUP_EH_LP(p) (p) = (*lp_array)[(HOST_WIDE_INT) (intptr_t) (p)]
d7f09764
DN
546
547 /* Convert all the index numbers stored in pointer fields into
548 pointers to the corresponding slots in the EH region array. */
9771b263 549 FOR_EACH_VEC_ELT (*eh_array, i, r)
d7f09764
DN
550 {
551 /* The array may contain NULL regions. */
552 if (r == NULL)
553 continue;
554
555 gcc_assert (i == (unsigned) r->index);
556 FIXUP_EH_REGION (r->outer);
557 FIXUP_EH_REGION (r->inner);
558 FIXUP_EH_REGION (r->next_peer);
559 FIXUP_EH_LP (r->landing_pads);
560 }
561
562 /* Convert all the index numbers stored in pointer fields into
563 pointers to the corresponding slots in the EH landing pad array. */
9771b263 564 FOR_EACH_VEC_ELT (*lp_array, i, lp)
d7f09764
DN
565 {
566 /* The array may contain NULL landing pads. */
567 if (lp == NULL)
568 continue;
569
570 gcc_assert (i == (unsigned) lp->index);
571 FIXUP_EH_LP (lp->next_lp);
572 FIXUP_EH_REGION (lp->region);
573 }
574
575#undef FIXUP_EH_REGION
576#undef FIXUP_EH_LP
577}
578
579
580/* Initialize EH support. */
581
f0efc7aa 582void
d7f09764
DN
583lto_init_eh (void)
584{
dad02715
RG
585 static bool eh_initialized_p = false;
586
587 if (eh_initialized_p)
588 return;
589
d7f09764
DN
590 /* Contrary to most other FEs, we only initialize EH support when at
591 least one of the files in the set contains exception regions in
592 it. Since this happens much later than the call to init_eh in
593 lang_dependent_init, we have to set flag_exceptions and call
594 init_eh again to initialize the EH tables. */
595 flag_exceptions = 1;
596 init_eh ();
597
dad02715 598 eh_initialized_p = true;
d7f09764
DN
599}
600
601
602/* Read the exception table for FN from IB using the data descriptors
603 in DATA_IN. */
604
605static void
606input_eh_regions (struct lto_input_block *ib, struct data_in *data_in,
607 struct function *fn)
608{
609 HOST_WIDE_INT i, root_region, len;
610 enum LTO_tags tag;
b8698a0f 611
412288f1 612 tag = streamer_read_record_start (ib);
d7f09764
DN
613 if (tag == LTO_null)
614 return;
615
616 lto_tag_check_range (tag, LTO_eh_table, LTO_eh_table);
617
618 /* If the file contains EH regions, then it was compiled with
619 -fexceptions. In that case, initialize the backend EH
620 machinery. */
dad02715 621 lto_init_eh ();
d7f09764
DN
622
623 gcc_assert (fn->eh);
624
412288f1 625 root_region = streamer_read_hwi (ib);
d7f09764
DN
626 gcc_assert (root_region == (int) root_region);
627
628 /* Read the EH region array. */
412288f1 629 len = streamer_read_hwi (ib);
d7f09764
DN
630 gcc_assert (len == (int) len);
631 if (len > 0)
632 {
9771b263 633 vec_safe_grow_cleared (fn->eh->region_array, len);
d7f09764
DN
634 for (i = 0; i < len; i++)
635 {
636 eh_region r = input_eh_region (ib, data_in, i);
9771b263 637 (*fn->eh->region_array)[i] = r;
d7f09764
DN
638 }
639 }
640
641 /* Read the landing pads. */
412288f1 642 len = streamer_read_hwi (ib);
d7f09764
DN
643 gcc_assert (len == (int) len);
644 if (len > 0)
645 {
9771b263 646 vec_safe_grow_cleared (fn->eh->lp_array, len);
d7f09764
DN
647 for (i = 0; i < len; i++)
648 {
649 eh_landing_pad lp = input_eh_lp (ib, data_in, i);
9771b263 650 (*fn->eh->lp_array)[i] = lp;
d7f09764
DN
651 }
652 }
653
654 /* Read the runtime type data. */
412288f1 655 len = streamer_read_hwi (ib);
d7f09764
DN
656 gcc_assert (len == (int) len);
657 if (len > 0)
658 {
9771b263 659 vec_safe_grow_cleared (fn->eh->ttype_data, len);
d7f09764
DN
660 for (i = 0; i < len; i++)
661 {
b9393656 662 tree ttype = stream_read_tree (ib, data_in);
9771b263 663 (*fn->eh->ttype_data)[i] = ttype;
d7f09764
DN
664 }
665 }
666
667 /* Read the table of action chains. */
412288f1 668 len = streamer_read_hwi (ib);
d7f09764
DN
669 gcc_assert (len == (int) len);
670 if (len > 0)
671 {
672 if (targetm.arm_eabi_unwinder)
673 {
9771b263 674 vec_safe_grow_cleared (fn->eh->ehspec_data.arm_eabi, len);
d7f09764
DN
675 for (i = 0; i < len; i++)
676 {
b9393656 677 tree t = stream_read_tree (ib, data_in);
9771b263 678 (*fn->eh->ehspec_data.arm_eabi)[i] = t;
d7f09764
DN
679 }
680 }
681 else
682 {
9771b263 683 vec_safe_grow_cleared (fn->eh->ehspec_data.other, len);
d7f09764
DN
684 for (i = 0; i < len; i++)
685 {
412288f1 686 uchar c = streamer_read_uchar (ib);
9771b263 687 (*fn->eh->ehspec_data.other)[i] = c;
d7f09764
DN
688 }
689 }
690 }
691
692 /* Reconstruct the EH region tree by fixing up the peer/children
693 pointers. */
694 fixup_eh_region_pointers (fn, root_region);
695
412288f1 696 tag = streamer_read_record_start (ib);
d7f09764
DN
697 lto_tag_check_range (tag, LTO_null, LTO_null);
698}
699
700
701/* Make a new basic block with index INDEX in function FN. */
702
703static basic_block
704make_new_block (struct function *fn, unsigned int index)
705{
706 basic_block bb = alloc_block ();
707 bb->index = index;
bbd79259 708 SET_BASIC_BLOCK_FOR_FN (fn, index, bb);
0cae8d31 709 n_basic_blocks_for_fn (fn)++;
d7f09764
DN
710 return bb;
711}
712
713
714/* Read the CFG for function FN from input block IB. */
715
b8698a0f 716static void
e9287a41 717input_cfg (struct lto_input_block *ib, struct data_in *data_in,
ef30ab83 718 struct function *fn)
d7f09764
DN
719{
720 unsigned int bb_count;
721 basic_block p_bb;
722 unsigned int i;
723 int index;
724
725 init_empty_tree_cfg_for_function (fn);
3828719a 726 init_ssa_operands (fn);
d7f09764 727
ea19eb9f
DM
728 profile_status_for_fn (fn) = streamer_read_enum (ib, profile_status_d,
729 PROFILE_LAST);
d7f09764 730
412288f1 731 bb_count = streamer_read_uhwi (ib);
d7f09764 732
3986e690 733 last_basic_block_for_fn (fn) = bb_count;
bbd79259
DM
734 if (bb_count > basic_block_info_for_fn (fn)->length ())
735 vec_safe_grow_cleared (basic_block_info_for_fn (fn), bb_count);
d7f09764 736
3e248e06
DM
737 if (bb_count > label_to_block_map_for_fn (fn)->length ())
738 vec_safe_grow_cleared (label_to_block_map_for_fn (fn), bb_count);
d7f09764 739
412288f1 740 index = streamer_read_hwi (ib);
d7f09764
DN
741 while (index != -1)
742 {
bbd79259 743 basic_block bb = BASIC_BLOCK_FOR_FN (fn, index);
d7f09764
DN
744 unsigned int edge_count;
745
746 if (bb == NULL)
747 bb = make_new_block (fn, index);
748
412288f1 749 edge_count = streamer_read_uhwi (ib);
d7f09764
DN
750
751 /* Connect up the CFG. */
752 for (i = 0; i < edge_count; i++)
753 {
754 unsigned int dest_index;
755 unsigned int edge_flags;
756 basic_block dest;
357067f2 757 profile_probability probability;
d7f09764
DN
758 edge e;
759
412288f1 760 dest_index = streamer_read_uhwi (ib);
357067f2 761 probability = profile_probability::stream_in (ib);
412288f1 762 edge_flags = streamer_read_uhwi (ib);
d7f09764 763
bbd79259 764 dest = BASIC_BLOCK_FOR_FN (fn, dest_index);
d7f09764 765
b8698a0f 766 if (dest == NULL)
d7f09764
DN
767 dest = make_new_block (fn, dest_index);
768
769 e = make_edge (bb, dest, edge_flags);
770 e->probability = probability;
d7f09764
DN
771 }
772
412288f1 773 index = streamer_read_hwi (ib);
d7f09764
DN
774 }
775
fefa31b5 776 p_bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
412288f1 777 index = streamer_read_hwi (ib);
d7f09764
DN
778 while (index != -1)
779 {
bbd79259 780 basic_block bb = BASIC_BLOCK_FOR_FN (fn, index);
d7f09764
DN
781 bb->prev_bb = p_bb;
782 p_bb->next_bb = bb;
783 p_bb = bb;
412288f1 784 index = streamer_read_hwi (ib);
d7f09764 785 }
dd366ec3
RB
786
787 /* ??? The cfgloop interface is tied to cfun. */
788 gcc_assert (cfun == fn);
789
790 /* Input the loop tree. */
791 unsigned n_loops = streamer_read_uhwi (ib);
792 if (n_loops == 0)
793 return;
794
766090c2 795 struct loops *loops = ggc_cleared_alloc<struct loops> ();
dd366ec3 796 init_loops_structure (fn, loops, n_loops);
0fc822d0 797 set_loops_for_fn (fn, loops);
dd366ec3
RB
798
799 /* Input each loop and associate it with its loop header so
800 flow_loops_find can rebuild the loop tree. */
801 for (unsigned i = 1; i < n_loops; ++i)
802 {
803 int header_index = streamer_read_hwi (ib);
804 if (header_index == -1)
805 {
806 loops->larray->quick_push (NULL);
807 continue;
808 }
809
810 struct loop *loop = alloc_loop ();
bbd79259 811 loop->header = BASIC_BLOCK_FOR_FN (fn, header_index);
dd366ec3
RB
812 loop->header->loop_father = loop;
813
814 /* Read everything copy_loop_info copies. */
815 loop->estimate_state = streamer_read_enum (ib, loop_estimation, EST_LAST);
816 loop->any_upper_bound = streamer_read_hwi (ib);
817 if (loop->any_upper_bound)
a73f34c2 818 loop->nb_iterations_upper_bound = streamer_read_widest_int (ib);
105e29c5
JH
819 loop->any_likely_upper_bound = streamer_read_hwi (ib);
820 if (loop->any_likely_upper_bound)
a73f34c2 821 loop->nb_iterations_likely_upper_bound = streamer_read_widest_int (ib);
dd366ec3
RB
822 loop->any_estimate = streamer_read_hwi (ib);
823 if (loop->any_estimate)
a73f34c2 824 loop->nb_iterations_estimate = streamer_read_widest_int (ib);
dd366ec3 825
e9287a41
RB
826 /* Read OMP SIMD related info. */
827 loop->safelen = streamer_read_hwi (ib);
ac9effed 828 loop->unroll = streamer_read_hwi (ib);
94ec37a9 829 loop->owned_clique = streamer_read_hwi (ib);
718c4601 830 loop->dont_vectorize = streamer_read_hwi (ib);
b15b5979 831 loop->force_vectorize = streamer_read_hwi (ib);
e9287a41
RB
832 loop->simduid = stream_read_tree (ib, data_in);
833
0fc822d0 834 place_new_loop (fn, loop);
dd366ec3
RB
835
836 /* flow_loops_find doesn't like loops not in the tree, hook them
837 all as siblings of the tree root temporarily. */
838 flow_loop_tree_node_add (loops->tree_root, loop);
839 }
840
841 /* Rebuild the loop tree. */
0fc822d0 842 flow_loops_find (loops);
d7f09764
DN
843}
844
845
d7f09764
DN
846/* Read the SSA names array for function FN from DATA_IN using input
847 block IB. */
848
849static void
850input_ssa_names (struct lto_input_block *ib, struct data_in *data_in,
851 struct function *fn)
852{
853 unsigned int i, size;
854
412288f1 855 size = streamer_read_uhwi (ib);
d7f09764
DN
856 init_ssanames (fn, size);
857
412288f1 858 i = streamer_read_uhwi (ib);
d7f09764
DN
859 while (i)
860 {
861 tree ssa_name, name;
862 bool is_default_def;
863
864 /* Skip over the elements that had been freed. */
9771b263
DN
865 while (SSANAMES (fn)->length () < i)
866 SSANAMES (fn)->quick_push (NULL_TREE);
d7f09764 867
412288f1 868 is_default_def = (streamer_read_uchar (ib) != 0);
b9393656 869 name = stream_read_tree (ib, data_in);
9a13d066 870 ssa_name = make_ssa_name_fn (fn, name, NULL);
d7f09764
DN
871
872 if (is_default_def)
9a13d066
RB
873 {
874 set_ssa_default_def (cfun, SSA_NAME_VAR (ssa_name), ssa_name);
875 SSA_NAME_DEF_STMT (ssa_name) = gimple_build_nop ();
876 }
d7f09764 877
412288f1 878 i = streamer_read_uhwi (ib);
b8698a0f 879 }
d7f09764
DN
880}
881
d7f09764
DN
882
883/* Go through all NODE edges and fixup call_stmt pointers
884 so they point to STMTS. */
885
886static void
355fe088 887fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple **stmts,
042ae7d2 888 struct function *fn)
d7f09764 889{
3e23d1bc
ML
890#define STMT_UID_NOT_IN_RANGE(uid) \
891 (gimple_stmt_max_uid (fn) < uid || uid == 0)
892
d7f09764 893 struct cgraph_edge *cedge;
d122681a 894 struct ipa_ref *ref = NULL;
042ae7d2
JH
895 unsigned int i;
896
d7f09764 897 for (cedge = node->callees; cedge; cedge = cedge->next_callee)
042ae7d2 898 {
3e23d1bc 899 if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid))
40fecdd6
JM
900 fatal_error (input_location,
901 "Cgraph edge statement index out of range");
538dd0b7 902 cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
042ae7d2 903 if (!cedge->call_stmt)
40fecdd6
JM
904 fatal_error (input_location,
905 "Cgraph edge statement index not found");
042ae7d2 906 }
e33c6cd6 907 for (cedge = node->indirect_calls; cedge; cedge = cedge->next_callee)
042ae7d2 908 {
3e23d1bc 909 if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid))
40fecdd6
JM
910 fatal_error (input_location,
911 "Cgraph edge statement index out of range");
538dd0b7 912 cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
042ae7d2 913 if (!cedge->call_stmt)
40fecdd6 914 fatal_error (input_location, "Cgraph edge statement index not found");
042ae7d2 915 }
d122681a 916 for (i = 0; node->iterate_reference (i, ref); i++)
042ae7d2
JH
917 if (ref->lto_stmt_uid)
918 {
3e23d1bc 919 if (STMT_UID_NOT_IN_RANGE (ref->lto_stmt_uid))
40fecdd6
JM
920 fatal_error (input_location,
921 "Reference statement index out of range");
042ae7d2
JH
922 ref->stmt = stmts[ref->lto_stmt_uid - 1];
923 if (!ref->stmt)
40fecdd6 924 fatal_error (input_location, "Reference statement index not found");
042ae7d2 925 }
d7f09764
DN
926}
927
042ae7d2 928
d7f09764
DN
929/* Fixup call_stmt pointers in NODE and all clones. */
930
931static void
355fe088 932fixup_call_stmt_edges (struct cgraph_node *orig, gimple **stmts)
d7f09764
DN
933{
934 struct cgraph_node *node;
042ae7d2 935 struct function *fn;
d7f09764
DN
936
937 while (orig->clone_of)
938 orig = orig->clone_of;
67348ccc 939 fn = DECL_STRUCT_FUNCTION (orig->decl);
d7f09764 940
3e23d1bc
ML
941 if (!orig->thunk.thunk_p)
942 fixup_call_stmt_edges_1 (orig, stmts, fn);
d7f09764
DN
943 if (orig->clones)
944 for (node = orig->clones; node != orig;)
945 {
ec6a1e35
JH
946 if (!node->thunk.thunk_p)
947 fixup_call_stmt_edges_1 (node, stmts, fn);
d7f09764
DN
948 if (node->clones)
949 node = node->clones;
950 else if (node->next_sibling_clone)
951 node = node->next_sibling_clone;
952 else
953 {
954 while (node != orig && !node->next_sibling_clone)
955 node = node->clone_of;
956 if (node != orig)
957 node = node->next_sibling_clone;
958 }
959 }
960}
961
35f5b1c1
LC
962
963/* Input the base body of struct function FN from DATA_IN
964 using input block IB. */
d7f09764
DN
965
966static void
35f5b1c1
LC
967input_struct_function_base (struct function *fn, struct data_in *data_in,
968 struct lto_input_block *ib)
d7f09764 969{
2465dcc2 970 struct bitpack_d bp;
c021f10b 971 int len;
d7f09764 972
35f5b1c1
LC
973 /* Read the static chain and non-local goto save area. */
974 fn->static_chain_decl = stream_read_tree (ib, data_in);
975 fn->nonlocal_goto_save_area = stream_read_tree (ib, data_in);
d7f09764 976
35f5b1c1
LC
977 /* Read all the local symbols. */
978 len = streamer_read_hwi (ib);
979 if (len > 0)
980 {
981 int i;
9771b263 982 vec_safe_grow_cleared (fn->local_decls, len);
35f5b1c1
LC
983 for (i = 0; i < len; i++)
984 {
985 tree t = stream_read_tree (ib, data_in);
9771b263 986 (*fn->local_decls)[i] = t;
35f5b1c1
LC
987 }
988 }
989
35f5b1c1
LC
990 /* Input the current IL state of the function. */
991 fn->curr_properties = streamer_read_uhwi (ib);
d7f09764
DN
992
993 /* Read all the attributes for FN. */
412288f1 994 bp = streamer_read_bitpack (ib);
2465dcc2
RG
995 fn->is_thunk = bp_unpack_value (&bp, 1);
996 fn->has_local_explicit_reg_vars = bp_unpack_value (&bp, 1);
2465dcc2
RG
997 fn->returns_pcc_struct = bp_unpack_value (&bp, 1);
998 fn->returns_struct = bp_unpack_value (&bp, 1);
999 fn->can_throw_non_call_exceptions = bp_unpack_value (&bp, 1);
2da02156 1000 fn->can_delete_dead_exceptions = bp_unpack_value (&bp, 1);
2465dcc2
RG
1001 fn->always_inline_functions_inlined = bp_unpack_value (&bp, 1);
1002 fn->after_inlining = bp_unpack_value (&bp, 1);
2465dcc2
RG
1003 fn->stdarg = bp_unpack_value (&bp, 1);
1004 fn->has_nonlocal_label = bp_unpack_value (&bp, 1);
aa43616c 1005 fn->has_forced_label_in_static = bp_unpack_value (&bp, 1);
2465dcc2
RG
1006 fn->calls_alloca = bp_unpack_value (&bp, 1);
1007 fn->calls_setjmp = bp_unpack_value (&bp, 1);
b15b5979 1008 fn->has_force_vectorize_loops = bp_unpack_value (&bp, 1);
e9287a41 1009 fn->has_simduid_loops = bp_unpack_value (&bp, 1);
2465dcc2
RG
1010 fn->va_list_fpr_size = bp_unpack_value (&bp, 8);
1011 fn->va_list_gpr_size = bp_unpack_value (&bp, 8);
743c1134 1012 fn->last_clique = bp_unpack_value (&bp, sizeof (short) * 8);
7cb7d208
RB
1013
1014 /* Input the function start and end loci. */
eaeec5ec
JH
1015 fn->function_start_locus = stream_input_location_now (&bp, data_in);
1016 fn->function_end_locus = stream_input_location_now (&bp, data_in);
b348c78a
AO
1017
1018 /* Restore the instance discriminators if present. */
1019 int instance_number = bp_unpack_value (&bp, 1);
1020 if (instance_number)
1021 {
1022 instance_number = bp_unpack_value (&bp, sizeof (int) * CHAR_BIT);
1023 maybe_create_decl_to_instance_map ()->put (fn->decl, instance_number);
1024 }
35f5b1c1 1025}
d7f09764 1026
ac364a48 1027
35f5b1c1 1028/* Read the body of function FN_DECL from DATA_IN using input block IB. */
688a482d 1029
35f5b1c1
LC
1030static void
1031input_function (tree fn_decl, struct data_in *data_in,
815effe1 1032 struct lto_input_block *ib, struct lto_input_block *ib_cfg)
35f5b1c1
LC
1033{
1034 struct function *fn;
1035 enum LTO_tags tag;
355fe088 1036 gimple **stmts;
35f5b1c1
LC
1037 basic_block bb;
1038 struct cgraph_node *node;
d7f09764 1039
35f5b1c1 1040 tag = streamer_read_record_start (ib);
815effe1
JH
1041 lto_tag_check (tag, LTO_function);
1042
1043 /* Read decls for parameters and args. */
1044 DECL_RESULT (fn_decl) = stream_read_tree (ib, data_in);
1045 DECL_ARGUMENTS (fn_decl) = streamer_read_chain (ib, data_in);
1046
1ea85365
RB
1047 /* Read debug args if available. */
1048 unsigned n_debugargs = streamer_read_uhwi (ib);
1049 if (n_debugargs)
1050 {
1051 vec<tree, va_gc> **debugargs = decl_debug_args_insert (fn_decl);
1052 vec_safe_grow (*debugargs, n_debugargs);
1053 for (unsigned i = 0; i < n_debugargs; ++i)
1054 (**debugargs)[i] = stream_read_tree (ib, data_in);
1055 }
1056
815effe1
JH
1057 /* Read the tree of lexical scopes for the function. */
1058 DECL_INITIAL (fn_decl) = stream_read_tree (ib, data_in);
ec1db2a9
RB
1059 unsigned block_leaf_count = streamer_read_uhwi (ib);
1060 while (block_leaf_count--)
1061 stream_read_tree (ib, data_in);
815effe1
JH
1062
1063 if (!streamer_read_uhwi (ib))
1064 return;
1065
1066 push_struct_function (fn_decl);
1067 fn = DECL_STRUCT_FUNCTION (fn_decl);
1068 init_tree_ssa (fn);
1069 /* We input IL in SSA form. */
1070 cfun->gimple_df->in_ssa_p = true;
35f5b1c1
LC
1071
1072 gimple_register_cfg_hooks ();
35f5b1c1 1073
d52f5295 1074 node = cgraph_node::get (fn_decl);
d1c369c2 1075 if (!node)
d52f5295 1076 node = cgraph_node::create (fn_decl);
35f5b1c1 1077 input_struct_function_base (fn, data_in, ib);
ef30ab83 1078 input_cfg (ib_cfg, data_in, fn);
d7f09764
DN
1079
1080 /* Read all the SSA names. */
1081 input_ssa_names (ib, data_in, fn);
1082
1083 /* Read the exception handling regions in the function. */
1084 input_eh_regions (ib, data_in, fn);
1085
d7f09764
DN
1086 gcc_assert (DECL_INITIAL (fn_decl));
1087 DECL_SAVED_TREE (fn_decl) = NULL_TREE;
1088
d7f09764 1089 /* Read all the basic blocks. */
412288f1 1090 tag = streamer_read_record_start (ib);
d7f09764
DN
1091 while (tag)
1092 {
db0bf14f
JH
1093 input_bb (ib, tag, data_in, fn,
1094 node->count_materialization_scale);
412288f1 1095 tag = streamer_read_record_start (ib);
d7f09764
DN
1096 }
1097
1098 /* Fix up the call statements that are mentioned in the callgraph
1099 edges. */
8f984534 1100 set_gimple_stmt_max_uid (cfun, 0);
04a90bec 1101 FOR_ALL_BB_FN (bb, cfun)
8f984534
RB
1102 {
1103 gimple_stmt_iterator gsi;
aa1e10cc
JH
1104 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1105 {
355fe088 1106 gimple *stmt = gsi_stmt (gsi);
aa1e10cc
JH
1107 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1108 }
8f984534
RB
1109 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1110 {
355fe088 1111 gimple *stmt = gsi_stmt (gsi);
8f984534
RB
1112 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1113 }
1114 }
355fe088 1115 stmts = (gimple **) xcalloc (gimple_stmt_max_uid (fn), sizeof (gimple *));
04a90bec 1116 FOR_ALL_BB_FN (bb, cfun)
d7f09764 1117 {
aa1e10cc
JH
1118 gimple_stmt_iterator bsi = gsi_start_phis (bb);
1119 while (!gsi_end_p (bsi))
1120 {
355fe088 1121 gimple *stmt = gsi_stmt (bsi);
aa1e10cc
JH
1122 gsi_next (&bsi);
1123 stmts[gimple_uid (stmt)] = stmt;
1124 }
1125 bsi = gsi_start_bb (bb);
7254364e 1126 while (!gsi_end_p (bsi))
d7f09764 1127 {
355fe088 1128 gimple *stmt = gsi_stmt (bsi);
d89ee6db 1129 bool remove = false;
7254364e
AO
1130 /* If we're recompiling LTO objects with debug stmts but
1131 we're not supposed to have debug stmts, remove them now.
1132 We can't remove them earlier because this would cause uid
1133 mismatches in fixups, but we can do it at this point, as
d89ee6db
JJ
1134 long as debug stmts don't require fixups.
1135 Similarly remove all IFN_*SAN_* internal calls */
1136 if (!flag_wpa)
1137 {
96a95ac1
AO
1138 if (is_gimple_debug (stmt)
1139 && (gimple_debug_nonbind_marker_p (stmt)
1140 ? !MAY_HAVE_DEBUG_MARKER_STMTS
1141 : !MAY_HAVE_DEBUG_BIND_STMTS))
d89ee6db
JJ
1142 remove = true;
1143 if (is_gimple_call (stmt)
1144 && gimple_call_internal_p (stmt))
1145 {
87a5e0e8 1146 bool replace = false;
d89ee6db
JJ
1147 switch (gimple_call_internal_fn (stmt))
1148 {
1149 case IFN_UBSAN_NULL:
1150 if ((flag_sanitize
1151 & (SANITIZE_NULL | SANITIZE_ALIGNMENT)) == 0)
87a5e0e8 1152 replace = true;
d89ee6db
JJ
1153 break;
1154 case IFN_UBSAN_BOUNDS:
1155 if ((flag_sanitize & SANITIZE_BOUNDS) == 0)
87a5e0e8 1156 replace = true;
d89ee6db
JJ
1157 break;
1158 case IFN_UBSAN_VPTR:
1159 if ((flag_sanitize & SANITIZE_VPTR) == 0)
87a5e0e8 1160 replace = true;
d89ee6db
JJ
1161 break;
1162 case IFN_UBSAN_OBJECT_SIZE:
1163 if ((flag_sanitize & SANITIZE_OBJECT_SIZE) == 0)
87a5e0e8 1164 replace = true;
d89ee6db 1165 break;
c9b39a49
JJ
1166 case IFN_UBSAN_PTR:
1167 if ((flag_sanitize & SANITIZE_POINTER_OVERFLOW) == 0)
87a5e0e8 1168 replace = true;
c9b39a49 1169 break;
d89ee6db
JJ
1170 case IFN_ASAN_MARK:
1171 if ((flag_sanitize & SANITIZE_ADDRESS) == 0)
87a5e0e8 1172 replace = true;
d89ee6db
JJ
1173 break;
1174 case IFN_TSAN_FUNC_EXIT:
1175 if ((flag_sanitize & SANITIZE_THREAD) == 0)
87a5e0e8 1176 replace = true;
d89ee6db
JJ
1177 break;
1178 default:
1179 break;
1180 }
87a5e0e8
RB
1181 if (replace)
1182 {
1183 gimple_call_set_internal_fn (as_a <gcall *> (stmt),
1184 IFN_NOP);
1185 update_stmt (stmt);
1186 }
d89ee6db
JJ
1187 }
1188 }
1189 if (remove)
7254364e
AO
1190 {
1191 gimple_stmt_iterator gsi = bsi;
1192 gsi_next (&bsi);
d89ee6db
JJ
1193 unlink_stmt_vdef (stmt);
1194 release_defs (stmt);
7254364e
AO
1195 gsi_remove (&gsi, true);
1196 }
1197 else
1198 {
1199 gsi_next (&bsi);
1200 stmts[gimple_uid (stmt)] = stmt;
96a95ac1
AO
1201
1202 /* Remember that the input function has begin stmt
1203 markers, so that we know to expect them when emitting
1204 debug info. */
1205 if (!cfun->debug_nonbind_markers
1206 && gimple_debug_nonbind_marker_p (stmt))
1207 cfun->debug_nonbind_markers = true;
7254364e 1208 }
d7f09764
DN
1209 }
1210 }
1211
1212 /* Set the gimple body to the statement sequence in the entry
1213 basic block. FIXME lto, this is fairly hacky. The existence
1214 of a gimple body is used by the cgraph routines, but we should
1215 really use the presence of the CFG. */
1216 {
fefa31b5 1217 edge_iterator ei = ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs);
d7f09764
DN
1218 gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest));
1219 }
1220
fc06ae0d 1221 update_max_bb_count ();
2c5721d9
MJ
1222 fixup_call_stmt_edges (node, stmts);
1223 execute_all_ipa_stmt_fixups (node, stmts);
d7f09764 1224
b8698a0f 1225 update_ssa (TODO_update_ssa_only_virtuals);
fb3f88cc
JH
1226 free_dominance_info (CDI_DOMINATORS);
1227 free_dominance_info (CDI_POST_DOMINATORS);
d7f09764 1228 free (stmts);
bcb650cb 1229 pop_cfun ();
d7f09764
DN
1230}
1231
0b83e688
JH
1232/* Read the body of function FN_DECL from DATA_IN using input block IB. */
1233
1234static void
1235input_constructor (tree var, struct data_in *data_in,
1236 struct lto_input_block *ib)
1237{
1238 DECL_INITIAL (var) = stream_read_tree (ib, data_in);
1239}
1240
d7f09764 1241
4843f032 1242/* Read the body from DATA for function NODE and fill it in.
d7f09764
DN
1243 FILE_DATA are the global decls and types. SECTION_TYPE is either
1244 LTO_section_function_body or LTO_section_static_initializer. If
1245 section type is LTO_section_function_body, FN must be the decl for
1246 that function. */
1247
b8698a0f 1248static void
0b83e688
JH
1249lto_read_body_or_constructor (struct lto_file_decl_data *file_data, struct symtab_node *node,
1250 const char *data, enum lto_section_type section_type)
d7f09764
DN
1251{
1252 const struct lto_function_header *header;
1253 struct data_in *data_in;
4ad9a9de
EB
1254 int cfg_offset;
1255 int main_offset;
1256 int string_offset;
67348ccc 1257 tree fn_decl = node->decl;
d7f09764
DN
1258
1259 header = (const struct lto_function_header *) data;
0b83e688
JH
1260 if (TREE_CODE (node->decl) == FUNCTION_DECL)
1261 {
1262 cfg_offset = sizeof (struct lto_function_header);
1263 main_offset = cfg_offset + header->cfg_size;
1264 string_offset = main_offset + header->main_size;
0b83e688
JH
1265 }
1266 else
1267 {
1268 main_offset = sizeof (struct lto_function_header);
1269 string_offset = main_offset + header->main_size;
0b83e688 1270 }
b8698a0f 1271
d7f09764 1272 data_in = lto_data_in_create (file_data, data + string_offset,
6e1aa848 1273 header->string_size, vNULL);
d7f09764 1274
d7f09764
DN
1275 if (section_type == LTO_section_function_body)
1276 {
d7f09764 1277 struct lto_in_decl_state *decl_state;
23ee14a5 1278 unsigned from;
d7f09764 1279
fe660d7b 1280 gcc_checking_assert (node);
39c58b3a 1281
d7f09764
DN
1282 /* Use the function's decl state. */
1283 decl_state = lto_get_function_in_decl_state (file_data, fn_decl);
1284 gcc_assert (decl_state);
1285 file_data->current_decl_state = decl_state;
1286
d7f09764
DN
1287
1288 /* Set up the struct function. */
9771b263 1289 from = data_in->reader_cache->nodes.length ();
db847fa8
JJ
1290 lto_input_block ib_main (data + main_offset, header->main_size,
1291 file_data->mode_table);
0b83e688 1292 if (TREE_CODE (node->decl) == FUNCTION_DECL)
207c68cd 1293 {
db847fa8
JJ
1294 lto_input_block ib_cfg (data + cfg_offset, header->cfg_size,
1295 file_data->mode_table);
207c68cd
RB
1296 input_function (fn_decl, data_in, &ib_main, &ib_cfg);
1297 }
0b83e688
JH
1298 else
1299 input_constructor (fn_decl, data_in, &ib_main);
eaeec5ec 1300 data_in->location_cache.apply_location_cache ();
23ee14a5
RG
1301 /* And fixup types we streamed locally. */
1302 {
1303 struct streamer_tree_cache_d *cache = data_in->reader_cache;
9771b263 1304 unsigned len = cache->nodes.length ();
23ee14a5
RG
1305 unsigned i;
1306 for (i = len; i-- > from;)
1307 {
ee03e71d 1308 tree t = streamer_tree_cache_get_tree (cache, i);
23ee14a5
RG
1309 if (t == NULL_TREE)
1310 continue;
1311
1312 if (TYPE_P (t))
1313 {
1314 gcc_assert (TYPE_CANONICAL (t) == NULL_TREE);
aea50b45
JH
1315 if (type_with_alias_set_p (t)
1316 && canonical_type_used_p (t))
1317 TYPE_CANONICAL (t) = TYPE_MAIN_VARIANT (t);
23ee14a5
RG
1318 if (TYPE_MAIN_VARIANT (t) != t)
1319 {
1320 gcc_assert (TYPE_NEXT_VARIANT (t) == NULL_TREE);
1321 TYPE_NEXT_VARIANT (t)
1322 = TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t));
1323 TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t)) = t;
1324 }
1325 }
1326 }
1327 }
d7f09764 1328
d7f09764
DN
1329 /* Restore decl state */
1330 file_data->current_decl_state = file_data->global_decl_state;
d7f09764 1331 }
d7f09764 1332
d7f09764
DN
1333 lto_data_in_delete (data_in);
1334}
1335
1336
4843f032 1337/* Read the body of NODE using DATA. FILE_DATA holds the global
d7f09764
DN
1338 decls and types. */
1339
b8698a0f 1340void
d7f09764 1341lto_input_function_body (struct lto_file_decl_data *file_data,
4843f032 1342 struct cgraph_node *node, const char *data)
d7f09764 1343{
0b83e688
JH
1344 lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body);
1345}
1346
1347/* Read the body of NODE using DATA. FILE_DATA holds the global
1348 decls and types. */
1349
1350void
1351lto_input_variable_constructor (struct lto_file_decl_data *file_data,
1352 struct varpool_node *node, const char *data)
1353{
1354 lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body);
d7f09764
DN
1355}
1356
1357
1ea85365
RB
1358/* Queue of acummulated decl -> DIE mappings. Similar to locations those
1359 are only applied to prevailing tree nodes during tree merging. */
1360vec<dref_entry> dref_queue;
1361
ee03e71d
RB
1362/* Read the physical representation of a tree node EXPR from
1363 input block IB using the per-file context in DATA_IN. */
1364
1365static void
1366lto_read_tree_1 (struct lto_input_block *ib, struct data_in *data_in, tree expr)
1367{
1368 /* Read all the bitfield values in EXPR. Note that for LTO, we
1369 only write language-independent bitfields, so no more unpacking is
1370 needed. */
1371 streamer_read_tree_bitfields (ib, data_in, expr);
1372
1373 /* Read all the pointer fields in EXPR. */
1374 streamer_read_tree_body (ib, data_in, expr);
1375
1376 /* Read any LTO-specific data not read by the tree streamer. */
1377 if (DECL_P (expr)
1378 && TREE_CODE (expr) != FUNCTION_DECL
1379 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1380 DECL_INITIAL (expr) = stream_read_tree (ib, data_in);
1ea85365
RB
1381
1382 /* Stream references to early generated DIEs. Keep in sync with the
1383 trees handled in dwarf2out_register_external_die. */
1384 if ((DECL_P (expr)
1385 && TREE_CODE (expr) != FIELD_DECL
1386 && TREE_CODE (expr) != DEBUG_EXPR_DECL
1387 && TREE_CODE (expr) != TYPE_DECL)
1388 || TREE_CODE (expr) == BLOCK)
1389 {
1390 const char *str = streamer_read_string (data_in, ib);
1391 if (str)
1392 {
1393 unsigned HOST_WIDE_INT off = streamer_read_uhwi (ib);
1394 dref_entry e = { expr, str, off };
1395 dref_queue.safe_push (e);
1396 }
1397 }
ee03e71d
RB
1398}
1399
b9393656
DN
1400/* Read the physical representation of a tree node with tag TAG from
1401 input block IB using the per-file context in DATA_IN. */
d7f09764 1402
b9393656
DN
1403static tree
1404lto_read_tree (struct lto_input_block *ib, struct data_in *data_in,
ee03e71d 1405 enum LTO_tags tag, hashval_t hash)
47c79d56 1406{
b9393656 1407 /* Instantiate a new tree node. */
412288f1 1408 tree result = streamer_alloc_tree (ib, data_in, tag);
b9393656
DN
1409
1410 /* Enter RESULT in the reader cache. This will make RESULT
1411 available so that circular references in the rest of the tree
1412 structure can be resolved in subsequent calls to stream_read_tree. */
ee03e71d 1413 streamer_tree_cache_append (data_in->reader_cache, result, hash);
b9393656 1414
ee03e71d 1415 lto_read_tree_1 (ib, data_in, result);
b9393656 1416
ee03e71d 1417 /* end_marker = */ streamer_read_uchar (ib);
b9393656 1418
ee03e71d
RB
1419 return result;
1420}
b9393656 1421
b9393656 1422
ee03e71d
RB
1423/* Populate the reader cache with trees materialized from the SCC
1424 following in the IB, DATA_IN stream. */
b9393656 1425
ee03e71d
RB
1426hashval_t
1427lto_input_scc (struct lto_input_block *ib, struct data_in *data_in,
1428 unsigned *len, unsigned *entry_len)
1429{
1430 /* A blob of unnamed tree nodes, fill the cache from it and
1431 recurse. */
1432 unsigned size = streamer_read_uhwi (ib);
1433 hashval_t scc_hash = streamer_read_uhwi (ib);
1434 unsigned scc_entry_len = 1;
b9393656 1435
ee03e71d
RB
1436 if (size == 1)
1437 {
1438 enum LTO_tags tag = streamer_read_record_start (ib);
1439 lto_input_tree_1 (ib, data_in, tag, scc_hash);
1440 }
1441 else
1442 {
1443 unsigned int first = data_in->reader_cache->nodes.length ();
1444 tree result;
1445
1446 scc_entry_len = streamer_read_uhwi (ib);
1447
1448 /* Materialize size trees by reading their headers. */
1449 for (unsigned i = 0; i < size; ++i)
1450 {
1451 enum LTO_tags tag = streamer_read_record_start (ib);
1452 if (tag == LTO_null
1453 || (tag >= LTO_field_decl_ref && tag <= LTO_global_decl_ref)
1454 || tag == LTO_tree_pickle_reference
ee03e71d
RB
1455 || tag == LTO_integer_cst
1456 || tag == LTO_tree_scc)
1457 gcc_unreachable ();
1458
1459 result = streamer_alloc_tree (ib, data_in, tag);
1460 streamer_tree_cache_append (data_in->reader_cache, result, 0);
1461 }
1462
1463 /* Read the tree bitpacks and references. */
1464 for (unsigned i = 0; i < size; ++i)
1465 {
1466 result = streamer_tree_cache_get_tree (data_in->reader_cache,
1467 first + i);
1468 lto_read_tree_1 (ib, data_in, result);
1469 /* end_marker = */ streamer_read_uchar (ib);
1470 }
1471 }
1472
1473 *len = size;
1474 *entry_len = scc_entry_len;
1475 return scc_hash;
b9393656
DN
1476}
1477
1478
1479/* Read a tree from input block IB using the per-file context in
1480 DATA_IN. This context is used, for example, to resolve references
1481 to previously read nodes. */
1482
1483tree
ee03e71d
RB
1484lto_input_tree_1 (struct lto_input_block *ib, struct data_in *data_in,
1485 enum LTO_tags tag, hashval_t hash)
b9393656 1486{
b9393656
DN
1487 tree result;
1488
b9393656
DN
1489 gcc_assert ((unsigned) tag < (unsigned) LTO_NUM_TAGS);
1490
1491 if (tag == LTO_null)
1492 result = NULL_TREE;
5f673c6a 1493 else if (tag >= LTO_field_decl_ref && tag <= LTO_namelist_decl_ref)
b9393656
DN
1494 {
1495 /* If TAG is a reference to an indexable tree, the next value
1496 in IB is the index into the table where we expect to find
1497 that tree. */
1498 result = lto_input_tree_ref (ib, data_in, cfun, tag);
1499 }
1500 else if (tag == LTO_tree_pickle_reference)
1501 {
1502 /* If TAG is a reference to a previously read tree, look it up in
1503 the reader cache. */
412288f1 1504 result = streamer_get_pickled_tree (ib, data_in);
b9393656 1505 }
c61f8c3b 1506 else if (tag == LTO_integer_cst)
b9393656 1507 {
807e902e
KZ
1508 /* For shared integer constants in singletons we can use the
1509 existing tree integer constant merging code. */
ee03e71d 1510 tree type = stream_read_tree (ib, data_in);
807e902e
KZ
1511 unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
1512 unsigned HOST_WIDE_INT i;
1513 HOST_WIDE_INT a[WIDE_INT_MAX_ELTS];
1514
1515 for (i = 0; i < len; i++)
1516 a[i] = streamer_read_hwi (ib);
1517 gcc_assert (TYPE_PRECISION (type) <= MAX_BITSIZE_MODE_ANY_INT);
1518 result = wide_int_to_tree (type, wide_int::from_array
1519 (a, len, TYPE_PRECISION (type)));
ee03e71d
RB
1520 streamer_tree_cache_append (data_in->reader_cache, result, hash);
1521 }
1522 else if (tag == LTO_tree_scc)
b12c44e9 1523 gcc_unreachable ();
b9393656
DN
1524 else
1525 {
1526 /* Otherwise, materialize a new node from IB. */
ee03e71d 1527 result = lto_read_tree (ib, data_in, tag, hash);
b9393656
DN
1528 }
1529
1530 return result;
47c79d56
DN
1531}
1532
ee03e71d
RB
1533tree
1534lto_input_tree (struct lto_input_block *ib, struct data_in *data_in)
1535{
b12c44e9
RB
1536 enum LTO_tags tag;
1537
1538 /* Input and skip SCCs. */
1539 while ((tag = streamer_read_record_start (ib)) == LTO_tree_scc)
1540 {
1541 unsigned len, entry_len;
1542 lto_input_scc (ib, data_in, &len, &entry_len);
1ea85365
RB
1543
1544 /* Register DECLs with the debuginfo machinery. */
1545 while (!dref_queue.is_empty ())
1546 {
1547 dref_entry e = dref_queue.pop ();
1548 debug_hooks->register_external_die (e.decl, e.sym, e.off);
1549 }
b12c44e9
RB
1550 }
1551 return lto_input_tree_1 (ib, data_in, tag, 0);
ee03e71d
RB
1552}
1553
47c79d56 1554
49f836ba
JB
1555/* Input toplevel asms. */
1556
1557void
398f05da 1558lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base)
49f836ba
JB
1559{
1560 size_t len;
1561 const char *data = lto_get_section_data (file_data, LTO_section_asm,
1562 NULL, &len);
207c68cd
RB
1563 const struct lto_simple_header_with_strings *header
1564 = (const struct lto_simple_header_with_strings *) data;
4ad9a9de 1565 int string_offset;
49f836ba 1566 struct data_in *data_in;
49f836ba
JB
1567 tree str;
1568
1569 if (! data)
1570 return;
1571
1572 string_offset = sizeof (*header) + header->main_size;
1573
db847fa8
JJ
1574 lto_input_block ib (data + sizeof (*header), header->main_size,
1575 file_data->mode_table);
49f836ba
JB
1576
1577 data_in = lto_data_in_create (file_data, data + string_offset,
6e1aa848 1578 header->string_size, vNULL);
49f836ba 1579
49f836ba 1580 while ((str = streamer_read_string_cst (data_in, &ib)))
398f05da 1581 {
3dafb85c 1582 asm_node *node = symtab->finalize_toplevel_asm (str);
398f05da 1583 node->order = streamer_read_hwi (&ib) + order_base;
3dafb85c
ML
1584 if (node->order >= symtab->order)
1585 symtab->order = node->order + 1;
398f05da 1586 }
49f836ba 1587
49f836ba
JB
1588 lto_data_in_delete (data_in);
1589
1590 lto_free_section_data (file_data, LTO_section_asm, NULL, data, len);
1591}
1592
1593
db847fa8
JJ
1594/* Input mode table. */
1595
1596void
1597lto_input_mode_table (struct lto_file_decl_data *file_data)
1598{
1599 size_t len;
1600 const char *data = lto_get_section_data (file_data, LTO_section_mode_table,
1601 NULL, &len);
1602 if (! data)
1603 {
1604 internal_error ("cannot read LTO mode table from %s",
1605 file_data->file_name);
1606 return;
1607 }
1608
1609 unsigned char *table = ggc_cleared_vec_alloc<unsigned char> (1 << 8);
1610 file_data->mode_table = table;
1611 const struct lto_simple_header_with_strings *header
1612 = (const struct lto_simple_header_with_strings *) data;
1613 int string_offset;
1614 struct data_in *data_in;
1615 string_offset = sizeof (*header) + header->main_size;
1616
1617 lto_input_block ib (data + sizeof (*header), header->main_size, NULL);
1618 data_in = lto_data_in_create (file_data, data + string_offset,
1619 header->string_size, vNULL);
1620 bitpack_d bp = streamer_read_bitpack (&ib);
1621
1622 table[VOIDmode] = VOIDmode;
1623 table[BLKmode] = BLKmode;
1624 unsigned int m;
1625 while ((m = bp_unpack_value (&bp, 8)) != VOIDmode)
1626 {
1627 enum mode_class mclass
1628 = bp_unpack_enum (&bp, mode_class, MAX_MODE_CLASS);
cf098191 1629 poly_uint16 size = bp_unpack_poly_value (&bp, 16);
bb94ec76 1630 poly_uint16 prec = bp_unpack_poly_value (&bp, 16);
96a2d174 1631 machine_mode inner = (machine_mode) bp_unpack_value (&bp, 8);
7b777afa 1632 poly_uint16 nunits = bp_unpack_poly_value (&bp, 16);
db847fa8
JJ
1633 unsigned int ibit = 0, fbit = 0;
1634 unsigned int real_fmt_len = 0;
1635 const char *real_fmt_name = NULL;
1636 switch (mclass)
1637 {
1638 case MODE_FRACT:
1639 case MODE_UFRACT:
1640 case MODE_ACCUM:
1641 case MODE_UACCUM:
1642 ibit = bp_unpack_value (&bp, 8);
1643 fbit = bp_unpack_value (&bp, 8);
1644 break;
1645 case MODE_FLOAT:
1646 case MODE_DECIMAL_FLOAT:
1647 real_fmt_name = bp_unpack_indexed_string (data_in, &bp,
1648 &real_fmt_len);
1649 break;
1650 default:
1651 break;
1652 }
1653 /* First search just the GET_CLASS_NARROWEST_MODE to wider modes,
1654 if not found, fallback to all modes. */
1655 int pass;
1656 for (pass = 0; pass < 2; pass++)
1657 for (machine_mode mr = pass ? VOIDmode
1658 : GET_CLASS_NARROWEST_MODE (mclass);
1659 pass ? mr < MAX_MACHINE_MODE : mr != VOIDmode;
78647e65 1660 pass ? mr = (machine_mode) (mr + 1)
490d0f6c 1661 : mr = GET_MODE_WIDER_MODE (mr).else_void ())
db847fa8 1662 if (GET_MODE_CLASS (mr) != mclass
cf098191 1663 || maybe_ne (GET_MODE_SIZE (mr), size)
bb94ec76 1664 || maybe_ne (GET_MODE_PRECISION (mr), prec)
96a2d174
TS
1665 || (inner == m
1666 ? GET_MODE_INNER (mr) != mr
1667 : GET_MODE_INNER (mr) != table[(int) inner])
db847fa8
JJ
1668 || GET_MODE_IBIT (mr) != ibit
1669 || GET_MODE_FBIT (mr) != fbit
7b777afa 1670 || maybe_ne (GET_MODE_NUNITS (mr), nunits))
db847fa8
JJ
1671 continue;
1672 else if ((mclass == MODE_FLOAT || mclass == MODE_DECIMAL_FLOAT)
1673 && strcmp (REAL_MODE_FORMAT (mr)->name, real_fmt_name) != 0)
1674 continue;
1675 else
1676 {
1677 table[m] = mr;
1678 pass = 2;
1679 break;
1680 }
1681 unsigned int mname_len;
1682 const char *mname = bp_unpack_indexed_string (data_in, &bp, &mname_len);
1683 if (pass == 2)
1684 {
1685 switch (mclass)
1686 {
5c0caeb3 1687 case MODE_VECTOR_BOOL:
db847fa8
JJ
1688 case MODE_VECTOR_INT:
1689 case MODE_VECTOR_FLOAT:
1690 case MODE_VECTOR_FRACT:
1691 case MODE_VECTOR_UFRACT:
1692 case MODE_VECTOR_ACCUM:
1693 case MODE_VECTOR_UACCUM:
1694 /* For unsupported vector modes just use BLKmode,
1695 if the scalar mode is supported. */
96a2d174 1696 if (table[(int) inner] != VOIDmode)
db847fa8
JJ
1697 {
1698 table[m] = BLKmode;
1699 break;
1700 }
1701 /* FALLTHRU */
1702 default:
a9c697b8 1703 fatal_error (UNKNOWN_LOCATION, "unsupported mode %qs", mname);
db847fa8
JJ
1704 break;
1705 }
1706 }
1707 }
1708 lto_data_in_delete (data_in);
1709
1710 lto_free_section_data (file_data, LTO_section_mode_table, NULL, data, len);
1711}
1712
1713
d7f09764
DN
1714/* Initialization for the LTO reader. */
1715
1716void
47c79d56 1717lto_reader_init (void)
d7f09764
DN
1718{
1719 lto_streamer_init ();
c203e8a7
TS
1720 file_name_hash_table
1721 = new hash_table<freeing_string_slot_hasher> (37);
d7f09764
DN
1722}
1723
1724
1725/* Create a new data_in object for FILE_DATA. STRINGS is the string
1726 table to use with LEN strings. RESOLUTIONS is the vector of linker
1727 resolutions (NULL if not using a linker plugin). */
1728
1729struct data_in *
1730lto_data_in_create (struct lto_file_decl_data *file_data, const char *strings,
1731 unsigned len,
9771b263 1732 vec<ld_plugin_symbol_resolution_t> resolutions)
d7f09764 1733{
eaeec5ec 1734 struct data_in *data_in = new (struct data_in);
d7f09764
DN
1735 data_in->file_data = file_data;
1736 data_in->strings = strings;
1737 data_in->strings_len = len;
1738 data_in->globals_resolution = resolutions;
bdc67fd6 1739 data_in->reader_cache = streamer_tree_cache_create (false, false, true);
d7f09764
DN
1740 return data_in;
1741}
1742
1743
1744/* Remove DATA_IN. */
1745
1746void
1747lto_data_in_delete (struct data_in *data_in)
1748{
9771b263 1749 data_in->globals_resolution.release ();
412288f1 1750 streamer_tree_cache_delete (data_in->reader_cache);
eaeec5ec 1751 delete data_in;
d7f09764 1752}