]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/lto-streamer.h
wide-int: Fix up set_bit_large
[thirdparty/gcc.git] / gcc / lto-streamer.h
CommitLineData
d7f09764
DN
1/* Data structures and declarations used for reading and writing
2 GIMPLE to a file stream.
3
8d9254fc 4 Copyright (C) 2009-2020 Free Software Foundation, Inc.
d7f09764
DN
5 Contributed by Doug Kwan <dougkwan@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#ifndef GCC_LTO_STREAMER_H
24#define GCC_LTO_STREAMER_H
25
26#include "plugin-api.h"
db0bf14f 27#include "gcov-io.h"
f0efc7aa 28#include "diagnostic.h"
47c79d56 29
d7f09764
DN
30/* The encoding for a function consists of the following sections:
31
32 1) The header.
33 2) FIELD_DECLS.
34 3) FUNCTION_DECLS.
35 4) global VAR_DECLS.
36 5) type_decls
37 6) types.
38 7) Names for the labels that have names
39 8) The SSA names.
40 9) The control flow graph.
41 10-11)Gimple for local decls.
42 12) Gimple for the function.
43 13) Strings.
44
45 1) THE HEADER.
46 2-6) THE GLOBAL DECLS AND TYPES.
47
48 The global decls and types are encoded in the same way. For each
49 entry, there is word with the offset within the section to the
50 entry.
51
b8698a0f 52 7) THE LABEL NAMES.
d7f09764
DN
53
54 Since most labels do not have names, this section my be of zero
55 length. It consists of an array of string table references, one
56 per label. In the lto code, the labels are given either
57 positive or negative indexes. the positive ones have names and
58 the negative ones do not. The positive index can be used to
59 find the name in this array.
60
b8698a0f 61 9) THE CFG.
d7f09764
DN
62
63 10) Index into the local decls. Since local decls can have local
64 decls inside them, they must be read in randomly in order to
b8698a0f 65 properly restore them.
d7f09764
DN
66
67 11-12) GIMPLE FOR THE LOCAL DECLS AND THE FUNCTION BODY.
68
69 The gimple consists of a set of records.
70
71 THE FUNCTION
b8698a0f 72
d7f09764
DN
73 At the top level of (8) is the function. It consists of five
74 pieces:
75
76 LTO_function - The tag.
77 eh tree - This is all of the exception handling regions
78 put out in a post order traversial of the
79 tree. Siblings are output as lists terminated
80 by a 0. The set of fields matches the fields
81 defined in except.c.
82
83 last_basic_block - in uleb128 form.
84
85 basic blocks - This is the set of basic blocks.
86
87 zero - The termination of the basic blocks.
88
89 BASIC BLOCKS
90
91 There are two forms of basic blocks depending on if they are
92 empty or not.
93
94 The basic block consists of:
95
96 LTO_bb1 or LTO_bb0 - The tag.
97
98 bb->index - the index in uleb128 form.
99
100 #succs - The number of successors un uleb128 form.
101
102 the successors - For each edge, a pair. The first of the
103 pair is the index of the successor in
104 uleb128 form and the second are the flags in
105 uleb128 form.
106
107 the statements - A gimple tree, as described above.
108 These are only present for LTO_BB1.
109 Following each statement is an optional
110 exception handling record LTO_eh_region
111 which contains the region number (for
112 regions >= 0).
113
114 zero - This is only present for LTO_BB1 and is used
115 to terminate the statements and exception
116 regions within this block.
117
118 12) STRINGS
119
120 String are represented in the table as pairs, a length in ULEB128
121 form followed by the data for the string. */
122
86c23d93 123#define LTO_major_version 9
15b25b24 124#define LTO_minor_version 0
d7f09764
DN
125
126typedef unsigned char lto_decl_flags_t;
127
a746f952
JH
128/* Stream additional data to LTO object files to make it easier to debug
129 streaming code. This changes object files. */
130static const bool streamer_debugging = false;
d7f09764 131
d7f09764
DN
132/* Tags representing the various IL objects written to the bytecode file
133 (GIMPLE statements, basic blocks, EH regions, tree nodes, etc).
134
135 NOTE, when adding new LTO tags, also update lto_tag_name. */
b8698a0f 136enum LTO_tags
d7f09764
DN
137{
138 LTO_null = 0,
139
dda71670 140 /* Reference to previously-streamed node. */
15d16c8a
RB
141 LTO_tree_pickle_reference,
142
dda71670
JH
143 /* References to indexable tree nodes. These objects are stored in
144 tables that are written separately from the function bodies
145 and variable constructors that reference them. This way they can be
146 instantiated even when the referencing functions aren't (e.g., during WPA)
147 and it also allows functions to be copied from one file to another without
148 having to unpickle the body first (the references are location
149 independent). */
150 LTO_global_stream_ref,
d7f09764 151
dda71670 152 LTO_ssa_name_ref,
d7f09764 153
dda71670
JH
154 /* Special for global streamer. A blob of unnamed tree nodes. */
155 LTO_tree_scc,
d7f09764 156
dda71670
JH
157 /* Sequence of trees. */
158 LTO_trees,
159
160 /* Shared INTEGER_CST node. */
161 LTO_integer_cst,
162
163 /* Tags of trees are encoded as
164 LTO_first_tree_tag + TREE_CODE. */
165 LTO_first_tree_tag,
166 /* Tags of gimple typles are encoded as
167 LTO_first_gimple_tag + gimple_code. */
168 LTO_first_gimple_tag = LTO_first_tree_tag + MAX_TREE_CODES,
169
170 /* Entry and exit basic blocks. */
171 LTO_bb0 = LTO_first_gimple_tag + LAST_AND_UNUSED_GIMPLE_CODE,
d7f09764
DN
172 LTO_bb1,
173
174 /* EH region holding the previous statement. */
175 LTO_eh_region,
176
d7f09764
DN
177 /* Function body. */
178 LTO_function,
179
180 /* EH table. */
181 LTO_eh_table,
182
183 /* EH region types. These mirror enum eh_region_type. */
184 LTO_ert_cleanup,
185 LTO_ert_try,
186 LTO_ert_allowed_exceptions,
187 LTO_ert_must_not_throw,
188
189 /* EH landing pad. */
190 LTO_eh_landing_pad,
191
192 /* EH try/catch node. */
193 LTO_eh_catch,
194
d7f09764
DN
195 /* This tag must always be last. */
196 LTO_NUM_TAGS
197};
198
199
200/* Set of section types that are in an LTO file. This list will grow
201 as the number of IPA passes grows since each IPA pass will need its
202 own section type to store its summary information.
203
204 When adding a new section type, you must also extend the
205 LTO_SECTION_NAME array in lto-section-in.c. */
206enum lto_section_type
207{
208 LTO_section_decls = 0,
209 LTO_section_function_body,
210 LTO_section_static_initializer,
ab96cc5b 211 LTO_section_symtab,
c8429c2a 212 LTO_section_symtab_extension,
369451ec 213 LTO_section_refs,
49f836ba 214 LTO_section_asm,
fb3f88cc 215 LTO_section_jump_functions,
d7f09764
DN
216 LTO_section_ipa_pure_const,
217 LTO_section_ipa_reference,
0208f7da 218 LTO_section_ipa_profile,
ab96cc5b 219 LTO_section_symtab_nodes,
d7f09764 220 LTO_section_opts,
922f15c2 221 LTO_section_cgraph_opt_sum,
0bceb671 222 LTO_section_ipa_fn_summary,
2c9561b5 223 LTO_section_ipcp_transform,
b84d4347 224 LTO_section_ipa_icf,
ec6fe917 225 LTO_section_offload_table,
db847fa8 226 LTO_section_mode_table,
88614dfa 227 LTO_section_lto,
ff6686d2 228 LTO_section_ipa_sra,
3fb68f2e 229 LTO_section_odr_types,
d119f34c 230 LTO_section_ipa_modref,
d7f09764
DN
231 LTO_N_SECTION_TYPES /* Must be last. */
232};
233
234/* Indices to the various function, type and symbol streams. */
84562394 235enum lto_decl_stream_e_t
d7f09764 236{
ff7da2b5 237 LTO_DECL_STREAM = 0, /* Must be first. */
d7f09764 238 LTO_N_DECL_STREAMS
84562394 239};
d7f09764
DN
240
241typedef enum ld_plugin_symbol_resolution ld_plugin_symbol_resolution_t;
d7f09764 242
d7f09764
DN
243/* Return a char pointer to the start of a data stream for an lto pass
244 or function. The first parameter is the file data that contains
245 the information. The second parameter is the type of information
246 to be obtained. The third parameter is the name of the function
b8698a0f 247 and is only used when finding a function body; otherwise it is
d7f09764 248 NULL. The fourth parameter is the length of the data returned. */
b8698a0f 249typedef const char* (lto_get_section_data_f) (struct lto_file_decl_data *,
d7f09764 250 enum lto_section_type,
b8698a0f 251 const char *,
3c56d8d8 252 int,
d7f09764
DN
253 size_t *);
254
255/* Return the data found from the above call. The first three
256 parameters are the same as above. The fourth parameter is the data
073a8998 257 itself and the fifth is the length of the data. */
b8698a0f 258typedef void (lto_free_section_data_f) (struct lto_file_decl_data *,
d7f09764
DN
259 enum lto_section_type,
260 const char *,
261 const char *,
262 size_t);
263
eaeec5ec 264/* The location cache holds expanded locations for streamed in trees.
e4112065 265 This is done to reduce memory usage of libcpp linemap that strongly prefers
3536ff2d 266 locations to be inserted in the source order. */
eaeec5ec
JH
267
268class lto_location_cache
269{
270public:
271 /* Apply all changes in location cache. Add locations into linemap and patch
272 trees. */
273 bool apply_location_cache ();
274 /* Tree merging did not suceed; mark all changes in the cache as accepted. */
275 void accept_location_cache ();
276 /* Tree merging did suceed; throw away recent changes. */
277 void revert_location_cache ();
278 void input_location (location_t *loc, struct bitpack_d *bp,
99b1c316 279 class data_in *data_in);
3536ff2d
JJ
280 void input_location_and_block (location_t *loc, struct bitpack_d *bp,
281 class lto_input_block *ib,
282 class data_in *data_in);
eaeec5ec
JH
283 lto_location_cache ()
284 : loc_cache (), accepted_length (0), current_file (NULL), current_line (0),
3536ff2d
JJ
285 current_col (0), current_sysp (false), current_loc (UNKNOWN_LOCATION),
286 current_block (NULL_TREE)
eaeec5ec
JH
287 {
288 gcc_assert (!current_cache);
289 current_cache = this;
290 }
291 ~lto_location_cache ()
292 {
293 apply_location_cache ();
294 gcc_assert (current_cache == this);
295 current_cache = NULL;
296 }
297
298 /* There can be at most one instance of location cache (combining multiple
299 would bring it out of sync with libcpp linemap); point to current
300 one. */
301 static lto_location_cache *current_cache;
302
303private:
304 static int cmp_loc (const void *pa, const void *pb);
305
306 struct cached_location
307 {
308 const char *file;
309 location_t *loc;
310 int line, col;
6c1bc27c 311 bool sysp;
3536ff2d 312 tree block;
eaeec5ec
JH
313 };
314
315 /* The location cache. */
316
50cfd44e 317 auto_vec<cached_location> loc_cache;
eaeec5ec
JH
318
319 /* Accepted entries are ones used by trees that are known to be not unified
320 by tree merging. */
321
322 int accepted_length;
323
324 /* Bookkeeping to remember state in between calls to lto_apply_location_cache
325 When streaming gimple, the location cache is not used and thus
326 lto_apply_location_cache happens per location basis. It is then
327 useful to avoid redundant calls of linemap API. */
328
329 const char *current_file;
330 int current_line;
331 int current_col;
6c1bc27c 332 bool current_sysp;
eaeec5ec 333 location_t current_loc;
3536ff2d 334 tree current_block;
eaeec5ec
JH
335};
336
d7f09764 337/* Structure used as buffer for reading an LTO file. */
207c68cd 338class lto_input_block
d7f09764 339{
207c68cd
RB
340public:
341 /* Special constructor for the string table, it abuses this to
342 do random access but use the uhwi decoder. */
db847fa8
JJ
343 lto_input_block (const char *data_, unsigned int p_, unsigned int len_,
344 const unsigned char *mode_table_)
345 : data (data_), mode_table (mode_table_), p (p_), len (len_) {}
346 lto_input_block (const char *data_, unsigned int len_,
347 const unsigned char *mode_table_)
348 : data (data_), mode_table (mode_table_), p (0), len (len_) {}
207c68cd 349
d7f09764 350 const char *data;
db847fa8 351 const unsigned char *mode_table;
d7f09764
DN
352 unsigned int p;
353 unsigned int len;
354};
355
88614dfa 356/* Compression algorithm used for compression of LTO bytecode. */
d7f09764 357
88614dfa
ML
358enum lto_compression
359{
360 ZLIB,
361 ZSTD
362};
363
364/* Structure that represents LTO ELF section with information
365 about the format. */
366
367struct lto_section
d7f09764
DN
368{
369 int16_t major_version;
370 int16_t minor_version;
d1caf05a
ML
371 unsigned char slim_object;
372
373 /* Flags is a private field that is not defined publicly. */
374 uint16_t flags;
375
376 /* Set compression to FLAGS. */
377 inline void set_compression (lto_compression c)
378 {
379 flags = c;
380 }
381
382 /* Get compression from FLAGS. */
383 inline lto_compression get_compression ()
384 {
385 return (lto_compression) flags;
386 }
d7f09764
DN
387};
388
88614dfa
ML
389STATIC_ASSERT (sizeof (lto_section) == 8);
390
207c68cd
RB
391/* The is the first part of the record in an LTO file for many of the
392 IPA passes. */
88614dfa 393struct lto_simple_header
d7f09764 394{
207c68cd
RB
395 /* Size of main gimple body of function. */
396 int32_t main_size;
397};
d7f09764 398
207c68cd
RB
399struct lto_simple_header_with_strings : lto_simple_header
400{
d7f09764
DN
401 /* Size of the string table. */
402 int32_t string_size;
403};
404
207c68cd
RB
405/* The header for a function body. */
406struct lto_function_header : lto_simple_header_with_strings
407{
408 /* Size of the cfg. */
409 int32_t cfg_size;
410};
411
d7f09764
DN
412
413/* Structure describing a symbol section. */
207c68cd 414struct lto_decl_header : lto_simple_header_with_strings
d7f09764 415{
d7f09764
DN
416 /* Size of region for decl state. */
417 int32_t decl_state_size;
418
419 /* Number of nodes in globals stream. */
420 int32_t num_nodes;
49f836ba
JB
421};
422
423
d7f09764
DN
424/* Statistics gathered during LTO, WPA and LTRANS. */
425struct lto_stats_d
426{
427 unsigned HOST_WIDE_INT num_input_cgraph_nodes;
7b99cca4 428 unsigned HOST_WIDE_INT num_output_symtab_nodes;
d7f09764
DN
429 unsigned HOST_WIDE_INT num_input_files;
430 unsigned HOST_WIDE_INT num_output_files;
431 unsigned HOST_WIDE_INT num_cgraph_partitions;
432 unsigned HOST_WIDE_INT section_size[LTO_N_SECTION_TYPES];
433 unsigned HOST_WIDE_INT num_function_bodies;
434 unsigned HOST_WIDE_INT num_trees[NUM_TREE_CODES];
435 unsigned HOST_WIDE_INT num_output_il_bytes;
436 unsigned HOST_WIDE_INT num_compressed_il_bytes;
437 unsigned HOST_WIDE_INT num_input_il_bytes;
438 unsigned HOST_WIDE_INT num_uncompressed_il_bytes;
ee03e71d
RB
439 unsigned HOST_WIDE_INT num_tree_bodies_output;
440 unsigned HOST_WIDE_INT num_pickle_refs_output;
d7f09764
DN
441};
442
7b99cca4 443/* Entry of LTO symtab encoder. */
84562394 444struct lto_encoder_entry
7b99cca4 445{
5e20cdc9 446 symtab_node *node;
7b99cca4
JH
447 /* Is the node in this partition (i.e. ltrans of this partition will
448 be responsible for outputting it)? */
449 unsigned int in_partition:1;
450 /* Do we encode body in this partition? */
451 unsigned int body:1;
452 /* Do we encode initializer in this partition?
453 For example the readonly variable initializers are encoded to aid
454 constant folding even if they are not in the partition. */
455 unsigned int initializer:1;
84562394 456};
7b99cca4 457
7b99cca4 458
d7f09764 459/* Encoder data structure used to stream callgraph nodes. */
7380e6ef 460struct lto_symtab_encoder_d
d7f09764 461{
9771b263 462 vec<lto_encoder_entry> nodes;
b787e7a2 463 hash_map<symtab_node *, size_t> *map;
2f41ecf5 464};
7380e6ef
JH
465
466typedef struct lto_symtab_encoder_d *lto_symtab_encoder_t;
2f41ecf5 467
f27c1867 468/* Iterator structure for cgraph node sets. */
84562394 469struct lto_symtab_encoder_iterator
703e95cf 470{
f27c1867
JH
471 lto_symtab_encoder_t encoder;
472 unsigned index;
84562394 473};
f27c1867
JH
474
475
476
d7f09764
DN
477/* The lto_tree_ref_encoder struct is used to encode trees into indices. */
478
479struct lto_tree_ref_encoder
480{
1eb68d2d 481 hash_map<tree, unsigned> *tree_hash_table; /* Maps pointers to indices. */
d579fcda 482 vec<tree> trees; /* Maps indices to pointers. */
d7f09764
DN
483};
484
485
486/* Structure to hold states of input scope. */
907dadbd 487struct GTY((for_user)) lto_in_decl_state
d7f09764
DN
488{
489 /* Array of lto_in_decl_buffers to store type and decls streams. */
9c71e9df 490 vec<tree, va_gc> *streams[LTO_N_DECL_STREAMS];
d7f09764
DN
491
492 /* If this in-decl state is associated with a function. FN_DECL
493 point to the FUNCTION_DECL. */
494 tree fn_decl;
ca834876
JH
495
496 /* True if decl state is compressed. */
497 bool compressed;
d7f09764
DN
498};
499
500typedef struct lto_in_decl_state *lto_in_decl_state_ptr;
501
ca752f39 502struct decl_state_hasher : ggc_ptr_hash<lto_in_decl_state>
907dadbd
TS
503{
504 static hashval_t
505 hash (lto_in_decl_state *s)
506 {
507 return htab_hash_pointer (s->fn_decl);
508 }
509
510 static bool
511 equal (lto_in_decl_state *a, lto_in_decl_state *b)
512 {
513 return a->fn_decl == b->fn_decl;
514 }
515};
d7f09764
DN
516
517/* The structure that holds all of the vectors of global types,
518 decls and cgraph nodes used in the serialization of this file. */
519struct lto_out_decl_state
520{
521 /* The buffers contain the sets of decls of various kinds and types we have
522 seen so far and the indexes assigned to them. */
523 struct lto_tree_ref_encoder streams[LTO_N_DECL_STREAMS];
524
525 /* Encoder for cgraph nodes. */
7380e6ef 526 lto_symtab_encoder_t symtab_node_encoder;
2f41ecf5 527
d7f09764
DN
528 /* If this out-decl state belongs to a function, fn_decl points to that
529 function. Otherwise, it is NULL. */
530 tree fn_decl;
ca834876
JH
531
532 /* True if decl state is compressed. */
533 bool compressed;
d7f09764
DN
534};
535
536typedef struct lto_out_decl_state *lto_out_decl_state_ptr;
537
d7f09764 538
aed7d7cf
AK
539/* Compact representation of a index <-> resolution pair. Unpacked to an
540 vector later. */
541struct res_pair
542{
543 ld_plugin_symbol_resolution_t res;
544 unsigned index;
545};
aed7d7cf 546
aed7d7cf 547
d7f09764
DN
548/* One of these is allocated for each object file that being compiled
549 by lto. This structure contains the tables that are needed by the
550 serialized functions and ipa passes to connect themselves to the
551 global types and decls as they are reconstituted. */
49ba8180 552struct GTY(()) lto_file_decl_data
d7f09764
DN
553{
554 /* Decl state currently used. */
555 struct lto_in_decl_state *current_decl_state;
556
557 /* Decl state corresponding to regions outside of any functions
558 in the compilation unit. */
559 struct lto_in_decl_state *global_decl_state;
560
561 /* Table of cgraph nodes present in this file. */
7380e6ef 562 lto_symtab_encoder_t GTY((skip)) symtab_node_encoder;
2f41ecf5 563
d7f09764 564 /* Hash table maps lto-related section names to location in file. */
907dadbd 565 hash_table<decl_state_hasher> *function_decl_states;
d7f09764
DN
566
567 /* The .o file that these offsets relate to. */
49ba8180 568 const char *GTY((skip)) file_name;
d7f09764 569
d7f09764 570 /* Hash table maps lto-related section names to location in file. */
49ba8180 571 htab_t GTY((skip)) section_hash_table;
d7f09764
DN
572
573 /* Hash new name of renamed global declaration to its original name. */
49ba8180 574 htab_t GTY((skip)) renaming_hash_table;
73ce4d1e
AK
575
576 /* Linked list used temporarily in reader */
577 struct lto_file_decl_data *next;
578
ebad2eee
JH
579 /* Order in which the file appears on the command line. */
580 int order;
581
73ce4d1e 582 /* Sub ID for merged objects. */
dde8b360 583 unsigned HOST_WIDE_INT id;
73ce4d1e
AK
584
585 /* Symbol resolutions for this file */
9771b263 586 vec<res_pair> GTY((skip)) respairs;
aed7d7cf 587 unsigned max_index;
db0bf14f 588
7f3577f5 589 gcov_summary GTY((skip)) profile_info;
bbf9ad07
JH
590
591 /* Map assigning declarations their resolutions. */
39c8aaa4 592 hash_map<tree, ld_plugin_symbol_resolution> * GTY((skip)) resolution_map;
db847fa8
JJ
593
594 /* Mode translation table. */
595 const unsigned char *mode_table;
88614dfa
ML
596
597 /* Read LTO section. */
598 lto_section lto_section_header;
3c56d8d8
ML
599
600 int order_base;
b74d8dc4
JH
601
602 int unit_base;
d7f09764
DN
603};
604
a9429e29
LB
605typedef struct lto_file_decl_data *lto_file_decl_data_ptr;
606
d7f09764
DN
607struct lto_char_ptr_base
608{
609 char *ptr;
610};
611
612/* An incore byte stream to buffer the various parts of the function.
613 The entire structure should be zeroed when created. The record
614 consists of a set of blocks. The first sizeof (ptr) bytes are used
615 as a chain, and the rest store the bytes to be written. */
616struct lto_output_stream
617{
618 /* The pointer to the first block in the stream. */
619 struct lto_char_ptr_base * first_block;
620
621 /* The pointer to the last and current block in the stream. */
622 struct lto_char_ptr_base * current_block;
623
624 /* The pointer to where the next char should be written. */
625 char * current_pointer;
626
627 /* The number of characters left in the current block. */
628 unsigned int left_in_block;
629
630 /* The block size of the last block allocated. */
631 unsigned int block_size;
632
633 /* The total number of characters written. */
634 unsigned int total_size;
635};
636
d7f09764
DN
637/* A simple output block. This can be used for simple IPA passes that
638 do not need more than one stream. */
639struct lto_simple_output_block
640{
641 enum lto_section_type section_type;
642 struct lto_out_decl_state *decl_state;
643
644 /* The stream that the main tree codes are written to. */
645 struct lto_output_stream *main_stream;
646};
647
4a8fb1a1
LC
648/* String hashing. */
649
650struct string_slot
651{
652 const char *s;
653 int len;
654 unsigned int slot_num;
655};
656
657/* Hashtable helpers. */
658
8d67ee55 659struct string_slot_hasher : nofree_ptr_hash <string_slot>
4a8fb1a1 660{
67f58944
TS
661 static inline hashval_t hash (const string_slot *);
662 static inline bool equal (const string_slot *, const string_slot *);
4a8fb1a1
LC
663};
664
665/* Returns a hash code for DS. Adapted from libiberty's htab_hash_string
666 to support strings that may not end in '\0'. */
667
668inline hashval_t
67f58944 669string_slot_hasher::hash (const string_slot *ds)
4a8fb1a1
LC
670{
671 hashval_t r = ds->len;
672 int i;
673
674 for (i = 0; i < ds->len; i++)
675 r = r * 67 + (unsigned)ds->s[i] - 113;
676 return r;
677}
678
679/* Returns nonzero if DS1 and DS2 are equal. */
680
681inline bool
67f58944 682string_slot_hasher::equal (const string_slot *ds1, const string_slot *ds2)
4a8fb1a1
LC
683{
684 if (ds1->len == ds2->len)
685 return memcmp (ds1->s, ds2->s, ds1->len) == 0;
686
687 return 0;
688}
689
d7f09764
DN
690/* Data structure holding all the data and descriptors used when writing
691 an LTO file. */
692struct output_block
693{
694 enum lto_section_type section_type;
695 struct lto_out_decl_state *decl_state;
696
697 /* The stream that the main tree codes are written to. */
698 struct lto_output_stream *main_stream;
699
700 /* The stream that contains the string table. */
701 struct lto_output_stream *string_stream;
702
703 /* The stream that contains the cfg. */
704 struct lto_output_stream *cfg_stream;
705
706 /* The hash table that contains the set of strings we have seen so
707 far and the indexes assigned to them. */
c203e8a7 708 hash_table<string_slot_hasher> *string_hash_table;
d7f09764 709
0b83e688 710 /* The current symbol that we are currently serializing. Null
d7f09764 711 if we are serializing something else. */
f473c082 712 symtab_node *symbol;
d7f09764
DN
713
714 /* These are the last file and line that were seen in the stream.
715 If the current node differs from these, it needs to insert
716 something into the stream and fix these up. */
717 const char *current_file;
718 int current_line;
719 int current_col;
6c1bc27c 720 bool current_sysp;
70d8d9bd 721 bool reset_locus;
3d0af0c9 722 bool emit_pwd;
3536ff2d 723 tree current_block;
d7f09764 724
d7f09764 725 /* Cache of nodes written in this section. */
412288f1 726 struct streamer_tree_cache_d *writer_cache;
fac009a8 727
03d90a20
JH
728 /* All trees identified as local to the unit streamed. */
729 hash_set<tree> *local_trees;
730
fac009a8
JH
731 /* All data persistent across whole duration of output block
732 can go here. */
733 struct obstack obstack;
d7f09764
DN
734};
735
736
737/* Data and descriptors used when reading from an LTO file. */
6c1dae73 738class data_in
d7f09764 739{
6c1dae73 740public:
d7f09764
DN
741 /* The global decls and types. */
742 struct lto_file_decl_data *file_data;
743
d7f09764
DN
744 /* The string table. */
745 const char *strings;
746
747 /* The length of the string table. */
748 unsigned int strings_len;
749
d7f09764 750 /* Maps each reference number to the resolution done by the linker. */
9771b263 751 vec<ld_plugin_symbol_resolution_t> globals_resolution;
d7f09764
DN
752
753 /* Cache of pickled nodes. */
412288f1 754 struct streamer_tree_cache_d *reader_cache;
eaeec5ec
JH
755
756 /* Cache of source code location. */
757 lto_location_cache location_cache;
d7f09764
DN
758};
759
760
761/* In lto-section-in.c */
99b1c316 762extern class lto_input_block * lto_create_simple_input_block (
b8698a0f 763 struct lto_file_decl_data *,
d7f09764
DN
764 enum lto_section_type, const char **, size_t *);
765extern void
b8698a0f 766lto_destroy_simple_input_block (struct lto_file_decl_data *,
d7f09764 767 enum lto_section_type,
99b1c316 768 class lto_input_block *, const char *, size_t);
b8698a0f 769extern void lto_set_in_hooks (struct lto_file_decl_data **,
d7f09764
DN
770 lto_get_section_data_f *,
771 lto_free_section_data_f *);
772extern struct lto_file_decl_data **lto_get_file_decl_data (void);
773extern const char *lto_get_section_data (struct lto_file_decl_data *,
774 enum lto_section_type,
3c56d8d8 775 const char *, int, size_t *,
ca834876 776 bool decompress = false);
3c56d8d8
ML
777extern const char *lto_get_summary_section_data (struct lto_file_decl_data *,
778 enum lto_section_type,
779 size_t *);
ca834876
JH
780extern const char *lto_get_raw_section_data (struct lto_file_decl_data *,
781 enum lto_section_type,
3c56d8d8 782 const char *, int, size_t *);
d7f09764 783extern void lto_free_section_data (struct lto_file_decl_data *,
ca834876
JH
784 enum lto_section_type,
785 const char *, const char *, size_t,
786 bool decompress = false);
787extern void lto_free_raw_section_data (struct lto_file_decl_data *,
788 enum lto_section_type,
789 const char *, const char *, size_t);
d7f09764
DN
790extern htab_t lto_create_renaming_table (void);
791extern void lto_record_renamed_decl (struct lto_file_decl_data *,
792 const char *, const char *);
793extern const char *lto_get_decl_name_mapping (struct lto_file_decl_data *,
794 const char *);
795extern struct lto_in_decl_state *lto_new_in_decl_state (void);
796extern void lto_delete_in_decl_state (struct lto_in_decl_state *);
d7f09764
DN
797extern struct lto_in_decl_state *lto_get_function_in_decl_state (
798 struct lto_file_decl_data *, tree);
82e9d642 799extern void lto_free_function_in_decl_state (struct lto_in_decl_state *);
5e20cdc9 800extern void lto_free_function_in_decl_state_for_node (symtab_node *);
99b1c316 801extern void lto_section_overrun (class lto_input_block *) ATTRIBUTE_NORETURN;
f242c0a5
JH
802extern void lto_value_range_error (const char *,
803 HOST_WIDE_INT, HOST_WIDE_INT,
804 HOST_WIDE_INT) ATTRIBUTE_NORETURN;
d7f09764
DN
805
806/* In lto-section-out.c */
d7f09764
DN
807extern void lto_begin_section (const char *, bool);
808extern void lto_end_section (void);
f6bcdb5e 809extern void lto_write_data (const void *, unsigned int);
ca834876 810extern void lto_write_raw_data (const void *, unsigned int);
d7f09764 811extern void lto_write_stream (struct lto_output_stream *);
d7f09764
DN
812extern struct lto_simple_output_block *lto_create_simple_output_block (
813 enum lto_section_type);
814extern void lto_destroy_simple_output_block (struct lto_simple_output_block *);
815extern struct lto_out_decl_state *lto_new_out_decl_state (void);
816extern void lto_delete_out_decl_state (struct lto_out_decl_state *);
817extern struct lto_out_decl_state *lto_get_out_decl_state (void);
818extern void lto_push_out_decl_state (struct lto_out_decl_state *);
819extern struct lto_out_decl_state *lto_pop_out_decl_state (void);
820extern void lto_record_function_out_decl_state (tree,
821 struct lto_out_decl_state *);
bc0fe8cb 822extern void lto_append_block (struct lto_output_stream *);
d7f09764
DN
823
824
825/* In lto-streamer.c. */
1b34e6e2
BS
826
827/* Set when streaming LTO for offloading compiler. */
828extern bool lto_stream_offload_p;
829
d7f09764 830extern const char *lto_tag_name (enum LTO_tags);
3c56d8d8
ML
831extern char *lto_get_section_name (int, const char *, int,
832 struct lto_file_decl_data *);
b8f4e58f 833extern void print_lto_report (const char *);
d7f09764
DN
834extern void lto_streamer_init (void);
835extern bool gate_lto_out (void);
b898d037 836extern void lto_check_version (int, int, const char *);
47c79d56 837extern void lto_streamer_hooks_init (void);
d7f09764
DN
838
839/* In lto-streamer-in.c */
d7f09764 840extern void lto_input_cgraph (struct lto_file_decl_data *, const char *);
47c79d56 841extern void lto_reader_init (void);
c38ee9a2 842extern void lto_free_file_name_hash (void);
5e581212
JH
843extern void lto_input_function_body (struct lto_file_decl_data *,
844 struct cgraph_node *,
d7f09764 845 const char *);
0b83e688
JH
846extern void lto_input_variable_constructor (struct lto_file_decl_data *,
847 struct varpool_node *,
848 const char *);
d7f09764
DN
849extern void lto_input_constructors_and_inits (struct lto_file_decl_data *,
850 const char *);
398f05da 851extern void lto_input_toplevel_asms (struct lto_file_decl_data *, int);
db847fa8 852extern void lto_input_mode_table (struct lto_file_decl_data *);
99b1c316 853extern class data_in *lto_data_in_create (struct lto_file_decl_data *,
d7f09764 854 const char *, unsigned,
9771b263 855 vec<ld_plugin_symbol_resolution_t> );
99b1c316
MS
856extern void lto_data_in_delete (class data_in *);
857extern void lto_input_data_block (class lto_input_block *, void *, size_t);
858void lto_input_location (location_t *, struct bitpack_d *, class data_in *);
99b1c316 859tree lto_input_tree_ref (class lto_input_block *, class data_in *,
f0efc7aa
DN
860 struct function *, enum LTO_tags);
861void lto_tag_check_set (enum LTO_tags, int, ...);
862void lto_init_eh (void);
99b1c316 863hashval_t lto_input_scc (class lto_input_block *, class data_in *,
03d90a20 864 unsigned *, unsigned *, bool);
99b1c316 865tree lto_input_tree_1 (class lto_input_block *, class data_in *,
ee03e71d 866 enum LTO_tags, hashval_t hash);
99b1c316 867tree lto_input_tree (class lto_input_block *, class data_in *);
33e23881 868tree stream_read_tree_ref (class lto_input_block *, class data_in *);
d7f09764
DN
869
870
871/* In lto-streamer-out.c */
872extern void lto_register_decl_definition (tree, struct lto_file_decl_data *);
873extern struct output_block *create_output_block (enum lto_section_type);
874extern void destroy_output_block (struct output_block *);
7e54c608 875extern void lto_output_tree (struct output_block *, tree, bool, bool);
33e23881 876extern void stream_write_tree_ref (struct output_block *, tree);
ff7da2b5
JH
877extern void lto_output_var_decl_ref (struct lto_out_decl_state *,
878 struct lto_output_stream *, tree);
879extern void lto_output_fn_decl_ref (struct lto_out_decl_state *,
880 struct lto_output_stream *, tree);
881extern tree lto_input_var_decl_ref (lto_input_block *, lto_file_decl_data *);
882extern tree lto_input_fn_decl_ref (lto_input_block *, lto_file_decl_data *);
49f836ba 883extern void lto_output_toplevel_asms (void);
fb3f88cc 884extern void produce_asm (struct output_block *ob, tree fn);
38f4f02f
BS
885extern void lto_output ();
886extern void produce_asm_for_decls ();
a183b5c7
DN
887void lto_output_decl_state_streams (struct output_block *,
888 struct lto_out_decl_state *);
889void lto_output_decl_state_refs (struct output_block *,
890 struct lto_output_stream *,
891 struct lto_out_decl_state *);
3536ff2d
JJ
892void lto_output_location (struct output_block *, struct bitpack_d *,
893 location_t);
894void lto_output_location_and_block (struct output_block *, struct bitpack_d *,
895 location_t);
db847fa8 896void lto_output_init_mode_table (void);
1fcf52a6 897void lto_prepare_function_for_streaming (cgraph_node *);
d7f09764
DN
898
899
900/* In lto-cgraph.c */
9cf7975d 901extern bool asm_nodes_output;
e75f8f79 902lto_symtab_encoder_t lto_symtab_encoder_new (bool);
5e20cdc9 903int lto_symtab_encoder_encode (lto_symtab_encoder_t, symtab_node *);
7380e6ef 904void lto_symtab_encoder_delete (lto_symtab_encoder_t);
5e20cdc9 905bool lto_symtab_encoder_delete_node (lto_symtab_encoder_t, symtab_node *);
7380e6ef 906bool lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t,
91fbf0c7 907 struct cgraph_node *);
f27c1867 908bool lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t,
5e20cdc9 909 symtab_node *);
f27c1867 910void lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t,
5e20cdc9 911 symtab_node *);
91fbf0c7 912
7380e6ef 913bool lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t,
2c8326a5 914 varpool_node *);
f27c1867 915void output_symtab (void);
ab96cc5b 916void input_symtab (void);
ec6fe917 917void output_offload_tables (void);
ed5d948d 918void input_offload_tables (bool);
369451ec 919bool referenced_from_other_partition_p (struct ipa_ref_list *,
f27c1867 920 lto_symtab_encoder_t);
9a809897 921bool reachable_from_other_partition_p (struct cgraph_node *,
f27c1867 922 lto_symtab_encoder_t);
f473c082 923bool referenced_from_this_partition_p (symtab_node *,
f27c1867 924 lto_symtab_encoder_t);
f3380641 925bool reachable_from_this_partition_p (struct cgraph_node *,
f27c1867 926 lto_symtab_encoder_t);
b4661bfe 927lto_symtab_encoder_t compute_ltrans_boundary (lto_symtab_encoder_t encoder);
837bac8c 928void select_what_to_stream (void);
d7f09764 929
325fe981
JH
930/* In options-save.c. */
931void cl_target_option_stream_out (struct output_block *, struct bitpack_d *,
932 struct cl_target_option *);
933
99b1c316 934void cl_target_option_stream_in (class data_in *,
325fe981
JH
935 struct bitpack_d *,
936 struct cl_target_option *);
937
c518c102
ML
938void cl_optimization_stream_out (struct output_block *,
939 struct bitpack_d *, struct cl_optimization *);
ca9a04da 940
99b1c316 941void cl_optimization_stream_in (class data_in *,
c518c102 942 struct bitpack_d *, struct cl_optimization *);
ca9a04da 943
d7f09764 944
d7f09764
DN
945
946/* In lto-opts.c. */
d7f09764 947extern void lto_write_options (void);
d7f09764
DN
948
949
d7f09764
DN
950/* Statistics gathered during LTO, WPA and LTRANS. */
951extern struct lto_stats_d lto_stats;
952
953/* Section names corresponding to the values of enum lto_section_type. */
954extern const char *lto_section_name[];
955
956/* Holds all the out decl states of functions output so far in the
957 current output file. */
9771b263 958extern vec<lto_out_decl_state_ptr> lto_function_decl_states;
d7f09764
DN
959
960/* Return true if LTO tag TAG corresponds to a tree code. */
961static inline bool
962lto_tag_is_tree_code_p (enum LTO_tags tag)
963{
dda71670 964 return tag > LTO_first_tree_tag && (unsigned) tag <= MAX_TREE_CODES;
d7f09764
DN
965}
966
967
968/* Return true if LTO tag TAG corresponds to a gimple code. */
969static inline bool
970lto_tag_is_gimple_code_p (enum LTO_tags tag)
971{
dda71670
JH
972 return (unsigned) tag >= LTO_first_gimple_tag
973 && (unsigned) tag
974 < LTO_first_gimple_tag + LAST_AND_UNUSED_GIMPLE_CODE;
d7f09764
DN
975}
976
977
978/* Return the LTO tag corresponding to gimple code CODE. See enum
979 LTO_tags for details on the conversion. */
980static inline enum LTO_tags
981lto_gimple_code_to_tag (enum gimple_code code)
982{
dda71670 983 return (enum LTO_tags) ((unsigned) code + LTO_first_gimple_tag);
d7f09764
DN
984}
985
986
987/* Return the GIMPLE code corresponding to TAG. See enum LTO_tags for
988 details on the conversion. */
989static inline enum gimple_code
990lto_tag_to_gimple_code (enum LTO_tags tag)
991{
992 gcc_assert (lto_tag_is_gimple_code_p (tag));
dda71670 993 return (enum gimple_code) ((unsigned) tag - LTO_first_gimple_tag);
d7f09764
DN
994}
995
996
997/* Return the LTO tag corresponding to tree code CODE. See enum
998 LTO_tags for details on the conversion. */
999static inline enum LTO_tags
1000lto_tree_code_to_tag (enum tree_code code)
1001{
dda71670 1002 return (enum LTO_tags) ((unsigned) code + LTO_first_tree_tag);
d7f09764
DN
1003}
1004
1005
1006/* Return the tree code corresponding to TAG. See enum LTO_tags for
1007 details on the conversion. */
1008static inline enum tree_code
1009lto_tag_to_tree_code (enum LTO_tags tag)
1010{
1011 gcc_assert (lto_tag_is_tree_code_p (tag));
dda71670 1012 return (enum tree_code) ((unsigned) tag - LTO_first_tree_tag);
d7f09764
DN
1013}
1014
f0efc7aa
DN
1015/* Check that tag ACTUAL == EXPECTED. */
1016static inline void
1017lto_tag_check (enum LTO_tags actual, enum LTO_tags expected)
1018{
1019 if (actual != expected)
1020 internal_error ("bytecode stream: expected tag %s instead of %s",
1021 lto_tag_name (expected), lto_tag_name (actual));
1022}
1023
1024/* Check that tag ACTUAL is in the range [TAG1, TAG2]. */
1025static inline void
1026lto_tag_check_range (enum LTO_tags actual, enum LTO_tags tag1,
1027 enum LTO_tags tag2)
1028{
1029 if (actual < tag1 || actual > tag2)
1030 internal_error ("bytecode stream: tag %s is not in the expected range "
1031 "[%s, %s]",
1032 lto_tag_name (actual),
1033 lto_tag_name (tag1),
1034 lto_tag_name (tag2));
1035}
1036
d7f09764
DN
1037/* Initialize an lto_out_decl_buffer ENCODER. */
1038static inline void
d579fcda 1039lto_init_tree_ref_encoder (struct lto_tree_ref_encoder *encoder)
d7f09764 1040{
1eb68d2d 1041 encoder->tree_hash_table = new hash_map<tree, unsigned> (251);
9771b263 1042 encoder->trees.create (0);
d7f09764
DN
1043}
1044
1045
073a8998 1046/* Destroy an lto_tree_ref_encoder ENCODER by freeing its contents. The
d7f09764
DN
1047 memory used by ENCODER is not freed by this function. */
1048static inline void
1049lto_destroy_tree_ref_encoder (struct lto_tree_ref_encoder *encoder)
1050{
1051 /* Hash table may be delete already. */
1eb68d2d
TS
1052 delete encoder->tree_hash_table;
1053 encoder->tree_hash_table = NULL;
9771b263 1054 encoder->trees.release ();
d7f09764
DN
1055}
1056
1057/* Return the number of trees encoded in ENCODER. */
1058static inline unsigned int
1059lto_tree_ref_encoder_size (struct lto_tree_ref_encoder *encoder)
1060{
9771b263 1061 return encoder->trees.length ();
d7f09764
DN
1062}
1063
1064/* Return the IDX-th tree in ENCODER. */
1065static inline tree
1066lto_tree_ref_encoder_get_tree (struct lto_tree_ref_encoder *encoder,
1067 unsigned int idx)
1068{
9771b263 1069 return encoder->trees[idx];
d7f09764
DN
1070}
1071
f27c1867
JH
1072/* Return number of encoded nodes in ENCODER. */
1073static inline int
1074lto_symtab_encoder_size (lto_symtab_encoder_t encoder)
1075{
9771b263 1076 return encoder->nodes.length ();
7b99cca4
JH
1077}
1078
1079/* Value used to represent failure of lto_symtab_encoder_lookup. */
1080#define LCC_NOT_FOUND (-1)
1081
1082/* Look up NODE in encoder. Return NODE's reference if it has been encoded
1083 or LCC_NOT_FOUND if it is not there. */
1084
1085static inline int
1086lto_symtab_encoder_lookup (lto_symtab_encoder_t encoder,
5e20cdc9 1087 symtab_node *node)
7b99cca4 1088{
b787e7a2
TS
1089 size_t *slot = encoder->map->get (node);
1090 return (slot && *slot ? *(slot) - 1 : LCC_NOT_FOUND);
f27c1867
JH
1091}
1092
1093/* Return true if iterator LSE points to nothing. */
1094static inline bool
1095lsei_end_p (lto_symtab_encoder_iterator lsei)
1096{
1097 return lsei.index >= (unsigned)lto_symtab_encoder_size (lsei.encoder);
1098}
1099
1100/* Advance iterator LSE. */
1101static inline void
1102lsei_next (lto_symtab_encoder_iterator *lsei)
1103{
1104 lsei->index++;
1105}
1106
1107/* Return the node pointed to by LSI. */
5e20cdc9 1108static inline symtab_node *
f27c1867
JH
1109lsei_node (lto_symtab_encoder_iterator lsei)
1110{
9771b263 1111 return lsei.encoder->nodes[lsei.index].node;
f27c1867
JH
1112}
1113
1114/* Return the node pointed to by LSI. */
1115static inline struct cgraph_node *
1116lsei_cgraph_node (lto_symtab_encoder_iterator lsei)
1117{
d52f5295 1118 return dyn_cast<cgraph_node *> (lsei.encoder->nodes[lsei.index].node);
f27c1867
JH
1119}
1120
1121/* Return the node pointed to by LSI. */
2c8326a5 1122static inline varpool_node *
f27c1867
JH
1123lsei_varpool_node (lto_symtab_encoder_iterator lsei)
1124{
d52f5295 1125 return dyn_cast<varpool_node *> (lsei.encoder->nodes[lsei.index].node);
f27c1867
JH
1126}
1127
f27c1867
JH
1128/* Return the cgraph node corresponding to REF using ENCODER. */
1129
5e20cdc9 1130static inline symtab_node *
f27c1867
JH
1131lto_symtab_encoder_deref (lto_symtab_encoder_t encoder, int ref)
1132{
1133 if (ref == LCC_NOT_FOUND)
1134 return NULL;
1135
9771b263 1136 return encoder->nodes[ref].node;
f27c1867
JH
1137}
1138
1139/* Return an iterator to the first node in LSI. */
1140static inline lto_symtab_encoder_iterator
1141lsei_start (lto_symtab_encoder_t encoder)
1142{
1143 lto_symtab_encoder_iterator lsei;
1144
1145 lsei.encoder = encoder;
1146 lsei.index = 0;
1147 return lsei;
1148}
1149
1150/* Advance iterator LSE. */
1151static inline void
1152lsei_next_in_partition (lto_symtab_encoder_iterator *lsei)
1153{
1154 lsei_next (lsei);
1155 while (!lsei_end_p (*lsei)
1156 && !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei)))
1157 lsei_next (lsei);
1158}
1159
1160/* Return an iterator to the first node in LSI. */
1161static inline lto_symtab_encoder_iterator
1162lsei_start_in_partition (lto_symtab_encoder_t encoder)
1163{
1164 lto_symtab_encoder_iterator lsei = lsei_start (encoder);
1165
1166 if (lsei_end_p (lsei))
1167 return lsei;
1168 if (!lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei)))
1169 lsei_next_in_partition (&lsei);
1170
1171 return lsei;
1172}
1173
1174/* Advance iterator LSE. */
1175static inline void
1176lsei_next_function_in_partition (lto_symtab_encoder_iterator *lsei)
1177{
1178 lsei_next (lsei);
1179 while (!lsei_end_p (*lsei)
7de90a6c 1180 && (!is_a <cgraph_node *> (lsei_node (*lsei))
f27c1867
JH
1181 || !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei))))
1182 lsei_next (lsei);
1183}
1184
1185/* Return an iterator to the first node in LSI. */
1186static inline lto_symtab_encoder_iterator
1187lsei_start_function_in_partition (lto_symtab_encoder_t encoder)
1188{
1189 lto_symtab_encoder_iterator lsei = lsei_start (encoder);
1190
1191 if (lsei_end_p (lsei))
1192 return lsei;
7de90a6c 1193 if (!is_a <cgraph_node *> (lsei_node (lsei))
f27c1867
JH
1194 || !lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei)))
1195 lsei_next_function_in_partition (&lsei);
1196
1197 return lsei;
1198}
1199
1200/* Advance iterator LSE. */
1201static inline void
1202lsei_next_variable_in_partition (lto_symtab_encoder_iterator *lsei)
1203{
1204 lsei_next (lsei);
1205 while (!lsei_end_p (*lsei)
7de90a6c 1206 && (!is_a <varpool_node *> (lsei_node (*lsei))
f27c1867
JH
1207 || !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei))))
1208 lsei_next (lsei);
1209}
1210
1211/* Return an iterator to the first node in LSI. */
1212static inline lto_symtab_encoder_iterator
1213lsei_start_variable_in_partition (lto_symtab_encoder_t encoder)
1214{
1215 lto_symtab_encoder_iterator lsei = lsei_start (encoder);
1216
1217 if (lsei_end_p (lsei))
1218 return lsei;
7de90a6c 1219 if (!is_a <varpool_node *> (lsei_node (lsei))
f27c1867
JH
1220 || !lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei)))
1221 lsei_next_variable_in_partition (&lsei);
1222
1223 return lsei;
1224}
1225
1ea85365
RB
1226/* Entry for the delayed registering of decl -> DIE references. */
1227struct dref_entry {
1228 tree decl;
1229 const char *sym;
1230 unsigned HOST_WIDE_INT off;
1231};
1232
1233extern vec<dref_entry> dref_queue;
1234
b4da704c 1235extern FILE *streamer_dump_file;
1ea85365 1236
d7f09764 1237#endif /* GCC_LTO_STREAMER_H */