xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-streamer.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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