1/* Streamer hooks. Support for adding streamer-specific callbacks to 2 generic streaming routines. 3 4 Copyright (C) 2011-2015 Free Software Foundation, Inc. 5 Contributed 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#ifndef GCC_STREAMER_HOOKS_H 24#define GCC_STREAMER_HOOKS_H 25 26/* Forward declarations to avoid including unnecessary headers. */ 27struct output_block; 28struct lto_input_block; 29struct data_in; 30 31/* Streamer hooks. These functions do additional processing as 32 needed by the module. There are two types of callbacks, those that 33 replace the default behavior and those that supplement it. 34 35 Hooks marked [REQ] are required to be set. Those marked [OPT] may 36 be NULL, if the streamer does not need to implement them. */ 37struct streamer_hooks { 38 /* [REQ] Called by every tree streaming routine that needs to write 39 a tree node. The arguments are: output_block where to write the 40 node, the tree node to write and a boolean flag that should be true 41 if the caller wants to write a reference to the tree, instead of the 42 tree itself. The second boolean parameter specifies this for 43 the tree itself, the first for all siblings that are streamed. 44 The referencing mechanism is up to each streamer to implement. */ 45 void (*write_tree) (struct output_block *, tree, bool, bool); 46 47 /* [REQ] Called by every tree streaming routine that needs to read 48 a tree node. It takes two arguments: an lto_input_block pointing 49 to the buffer where to read from and a data_in instance with tables 50 and descriptors needed by the unpickling routines. It returns the 51 tree instantiated from the stream. */ 52 tree (*read_tree) (struct lto_input_block *, struct data_in *); 53 54 /* [REQ] Called by every streaming routine that needs to read a location. */ 55 void (*input_location) (location_t *, struct bitpack_d *, struct data_in *); 56 57 /* [REQ] Called by every streaming routine that needs to write a location. */ 58 void (*output_location) (struct output_block *, struct bitpack_d *, location_t); 59}; 60 61#define stream_write_tree(OB, EXPR, REF_P) \ 62 streamer_hooks.write_tree (OB, EXPR, REF_P, REF_P) 63 64#define stream_write_tree_shallow_non_ref(OB, EXPR, REF_P) \ 65 streamer_hooks.write_tree (OB, EXPR, REF_P, false) 66 67#define stream_read_tree(IB, DATA_IN) \ 68 streamer_hooks.read_tree (IB, DATA_IN) 69 70#define stream_input_location(LOCPTR, BP, DATA_IN) \ 71 streamer_hooks.input_location (LOCPTR, BP, DATA_IN) 72 73#define stream_output_location(OB, BP, LOC) \ 74 streamer_hooks.output_location (OB, BP, LOC) 75 76/* Streamer hooks. */ 77extern struct streamer_hooks streamer_hooks; 78 79/* In streamer-hooks.c. */ 80void streamer_hooks_init (void); 81 82#endif /* GCC_STREAMER_HOOKS_H */ 83