11debfc3dSmrg /* Data structures and functions for streaming trees.
21debfc3dSmrg
3*8feb0f0bSmrg Copyright (C) 2011-2020 Free Software Foundation, Inc.
41debfc3dSmrg Contributed by Diego Novillo <dnovillo@google.com>
51debfc3dSmrg
61debfc3dSmrg This file is part of GCC.
71debfc3dSmrg
81debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
91debfc3dSmrg the terms of the GNU General Public License as published by the Free
101debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
111debfc3dSmrg version.
121debfc3dSmrg
131debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
141debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
151debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
161debfc3dSmrg for more details.
171debfc3dSmrg
181debfc3dSmrg You should have received a copy of the GNU General Public License
191debfc3dSmrg along with GCC; see the file COPYING3. If not see
201debfc3dSmrg <http://www.gnu.org/licenses/>. */
211debfc3dSmrg
221debfc3dSmrg #ifndef GCC_TREE_STREAMER_H
231debfc3dSmrg #define GCC_TREE_STREAMER_H
241debfc3dSmrg
251debfc3dSmrg #include "streamer-hooks.h"
261debfc3dSmrg #include "data-streamer.h"
271debfc3dSmrg
281debfc3dSmrg /* Cache of pickled nodes. Used to avoid writing the same node more
291debfc3dSmrg than once. The first time a tree node is streamed out, it is
301debfc3dSmrg entered in this cache. Subsequent references to the same node are
311debfc3dSmrg resolved by looking it up in this cache.
321debfc3dSmrg
331debfc3dSmrg This is used in two ways:
341debfc3dSmrg
351debfc3dSmrg - On the writing side, the first time T is added to STREAMER_CACHE,
361debfc3dSmrg a new reference index is created for T and T is emitted on the
371debfc3dSmrg stream. If T needs to be emitted again to the stream, instead of
381debfc3dSmrg pickling it again, the reference index is emitted.
391debfc3dSmrg
401debfc3dSmrg - On the reading side, the first time T is read from the stream, it
411debfc3dSmrg is reconstructed in memory and a new reference index created for
421debfc3dSmrg T. The reconstructed T is inserted in some array so that when
431debfc3dSmrg the reference index for T is found in the input stream, it can be
441debfc3dSmrg used to look up into the array to get the reconstructed T. */
451debfc3dSmrg
461debfc3dSmrg struct streamer_tree_cache_d
471debfc3dSmrg {
481debfc3dSmrg /* The mapping between tree nodes and slots into the nodes array. */
491debfc3dSmrg hash_map<tree, unsigned> *node_map;
501debfc3dSmrg
511debfc3dSmrg /* The nodes pickled so far. */
521debfc3dSmrg vec<tree> nodes;
531debfc3dSmrg /* The node hashes (if available). */
541debfc3dSmrg vec<hashval_t> hashes;
551debfc3dSmrg
561debfc3dSmrg /* Next index to assign. */
571debfc3dSmrg unsigned next_idx;
581debfc3dSmrg };
591debfc3dSmrg
601debfc3dSmrg /* In tree-streamer-in.c. */
61*8feb0f0bSmrg tree streamer_read_string_cst (class data_in *, class lto_input_block *);
62*8feb0f0bSmrg tree streamer_read_chain (class lto_input_block *, class data_in *);
63*8feb0f0bSmrg tree streamer_alloc_tree (class lto_input_block *, class data_in *,
641debfc3dSmrg enum LTO_tags);
65*8feb0f0bSmrg void streamer_read_tree_body (class lto_input_block *, class data_in *, tree);
66*8feb0f0bSmrg tree streamer_get_pickled_tree (class lto_input_block *, class data_in *);
67*8feb0f0bSmrg void streamer_read_tree_bitfields (class lto_input_block *,
68*8feb0f0bSmrg class data_in *, tree);
691debfc3dSmrg
701debfc3dSmrg /* In tree-streamer-out.c. */
711debfc3dSmrg void streamer_write_string_cst (struct output_block *,
721debfc3dSmrg struct lto_output_stream *, tree);
731debfc3dSmrg void streamer_write_chain (struct output_block *, tree, bool);
741debfc3dSmrg void streamer_write_tree_header (struct output_block *, tree);
751debfc3dSmrg void streamer_write_tree_bitfields (struct output_block *, tree);
761debfc3dSmrg void streamer_write_tree_body (struct output_block *, tree, bool);
771debfc3dSmrg void streamer_write_integer_cst (struct output_block *, tree, bool);
781debfc3dSmrg
791debfc3dSmrg /* In tree-streamer.c. */
801debfc3dSmrg extern unsigned char streamer_mode_table[1 << 8];
811debfc3dSmrg void streamer_check_handled_ts_structures (void);
821debfc3dSmrg bool streamer_tree_cache_insert (struct streamer_tree_cache_d *, tree,
831debfc3dSmrg hashval_t, unsigned *);
841debfc3dSmrg void streamer_tree_cache_replace_tree (struct streamer_tree_cache_d *, tree,
851debfc3dSmrg unsigned);
861debfc3dSmrg void streamer_tree_cache_append (struct streamer_tree_cache_d *, tree,
871debfc3dSmrg hashval_t);
881debfc3dSmrg bool streamer_tree_cache_lookup (struct streamer_tree_cache_d *, tree,
891debfc3dSmrg unsigned *);
901debfc3dSmrg struct streamer_tree_cache_d *streamer_tree_cache_create (bool, bool, bool);
911debfc3dSmrg void streamer_tree_cache_delete (struct streamer_tree_cache_d *);
921debfc3dSmrg
931debfc3dSmrg /* Return the tree node at slot IX in CACHE. */
941debfc3dSmrg
951debfc3dSmrg static inline tree
streamer_tree_cache_get_tree(struct streamer_tree_cache_d * cache,unsigned ix)961debfc3dSmrg streamer_tree_cache_get_tree (struct streamer_tree_cache_d *cache, unsigned ix)
971debfc3dSmrg {
981debfc3dSmrg return cache->nodes[ix];
991debfc3dSmrg }
1001debfc3dSmrg
1011debfc3dSmrg /* Return the tree hash value at slot IX in CACHE. */
1021debfc3dSmrg
1031debfc3dSmrg static inline hashval_t
streamer_tree_cache_get_hash(struct streamer_tree_cache_d * cache,unsigned ix)1041debfc3dSmrg streamer_tree_cache_get_hash (struct streamer_tree_cache_d *cache, unsigned ix)
1051debfc3dSmrg {
1061debfc3dSmrg return cache->hashes[ix];
1071debfc3dSmrg }
1081debfc3dSmrg
1091debfc3dSmrg static inline void
bp_pack_machine_mode(struct bitpack_d * bp,machine_mode mode)1101debfc3dSmrg bp_pack_machine_mode (struct bitpack_d *bp, machine_mode mode)
1111debfc3dSmrg {
1121debfc3dSmrg streamer_mode_table[mode] = 1;
1131debfc3dSmrg bp_pack_enum (bp, machine_mode, 1 << 8, mode);
1141debfc3dSmrg }
1151debfc3dSmrg
1161debfc3dSmrg static inline machine_mode
bp_unpack_machine_mode(struct bitpack_d * bp)1171debfc3dSmrg bp_unpack_machine_mode (struct bitpack_d *bp)
1181debfc3dSmrg {
1191debfc3dSmrg return (machine_mode)
120*8feb0f0bSmrg ((class lto_input_block *)
1211debfc3dSmrg bp->stream)->mode_table[bp_unpack_enum (bp, machine_mode, 1 << 8)];
1221debfc3dSmrg }
1231debfc3dSmrg
1241debfc3dSmrg #endif /* GCC_TREE_STREAMER_H */
125