summaryrefslogtreecommitdiff
path: root/gcc/streamer-hooks.h
diff options
context:
space:
mode:
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-08 16:49:34 +0000
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-08 16:49:34 +0000
commit2541503d0742669641111007ac41e8b26fc69794 (patch)
tree71d0dfebe89d85d68e84274293c25cee61f487e2 /gcc/streamer-hooks.h
parent82310a30d8c326acabefb8af6f4b943cde02425e (diff)
downloadgcc-2541503d0742669641111007ac41e8b26fc69794.tar.gz
rebase
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177571 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/streamer-hooks.h')
-rw-r--r--gcc/streamer-hooks.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/gcc/streamer-hooks.h b/gcc/streamer-hooks.h
new file mode 100644
index 00000000000..29a6591ccc0
--- /dev/null
+++ b/gcc/streamer-hooks.h
@@ -0,0 +1,118 @@
+/* Streamer hooks. Support for adding streamer-specific callbacks to
+ generic streaming routines.
+
+ Copyright 2011 Free Software Foundation, Inc.
+ Contributed by Diego Novillo <dnovillo@google.com>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_STREAMER_HOOKS_H
+#define GCC_STREAMER_HOOKS_H
+
+#include "tree.h"
+
+/* Forward declarations to avoid including unnecessary headers. */
+struct output_block;
+struct lto_input_block;
+struct data_in;
+struct bitpack_d;
+struct lto_streamer_cache_d;
+
+/* Streamer hooks. These functions do additional processing as
+ needed by the module. There are two types of callbacks, those that
+ replace the default behavior and those that supplement it.
+
+ Hooks marked [REQ] are required to be set. Those marked [OPT] may
+ be NULL, if the streamer does not need to implement them. */
+struct streamer_hooks {
+ /* [REQ] A string identifying this streamer. */
+ const char *name;
+
+ /* [REQ] Called by lto_streamer_cache_create to instantiate a cache of
+ well-known nodes. These are tree nodes that are always
+ instantiated by the compiler on startup. Additionally, these
+ nodes need to be shared. This function should call
+ lto_streamer_cache_append on every tree node that it wishes to
+ preload in the streamer cache. This way, the writer will only
+ write out a reference to the tree and the reader will instantiate
+ the tree out of this pre-populated cache. */
+ void (*preload_common_nodes) (struct lto_streamer_cache_d *);
+
+ /* [REQ] Return true if the given tree is supported by this streamer. */
+ bool (*is_streamable) (tree);
+
+ /* [OPT] Called by lto_write_tree after writing all the common parts of
+ a tree. If defined, the callback is in charge of writing all
+ the fields that lto_write_tree did not write out. Arguments
+ are as in lto_write_tree.
+
+ The following tree fields are not handled by common code:
+
+ DECL_ABSTRACT_ORIGIN
+ DECL_INITIAL
+ DECL_SAVED_TREE
+
+ Callbacks may choose to ignore or handle them. If handled,
+ the reader should read them in the exact same sequence written
+ by the writer. */
+ void (*write_tree) (struct output_block *, tree, bool);
+
+ /* [OPT] Called by lto_read_tree after reading all the common parts of
+ a tree. If defined, the callback is in charge of reading all
+ the fields that lto_read_tree did not read in. Arguments
+ are as in lto_read_tree. */
+ void (*read_tree) (struct lto_input_block *, struct data_in *, tree);
+
+ /* [OPT] Called by lto_output_tree_ref to determine if the given tree node
+ should be emitted as a reference to the table of declarations
+ (the same table that holds global declarations). */
+ bool (*indexable_with_decls_p) (tree);
+
+ /* [OPT] Called by pack_value_fields to store any non-pointer fields
+ in the tree structure. The arguments are as in pack_value_fields. */
+ void (*pack_value_fields) (struct bitpack_d *, tree);
+
+ /* [OPT] Called by unpack_value_fields to retrieve any non-pointer fields
+ in the tree structure. The arguments are as in unpack_value_fields. */
+ void (*unpack_value_fields) (struct bitpack_d *, tree);
+
+ /* [OPT] Called by lto_materialize_tree for tree nodes that it does not
+ know how to allocate memory for. If defined, this hook should
+ return a new tree node of the given code. The data_in and
+ input_block arguments are passed in case the hook needs to
+ read more data from the stream to allocate the node.
+ If this hook returns NULL, then lto_materialize_tree will attempt
+ to allocate the tree by calling make_node directly. */
+ tree (*alloc_tree) (enum tree_code, struct lto_input_block *,
+ struct data_in *);
+
+ /* [OPT] Called by lto_output_tree_header to write any streamer-specific
+ information needed to allocate the tree. This hook may assume
+ that the basic header data (tree code, etc) has already been
+ written. It should only write any extra data needed to allocate
+ the node (e.g., in the case of CALL_EXPR, this hook would write
+ the number of arguments to the CALL_EXPR). */
+ void (*output_tree_header) (struct output_block *, tree);
+};
+
+/* Streamer hooks. */
+extern struct streamer_hooks streamer_hooks;
+
+/* In streamer-hooks.c. */
+void streamer_hooks_init (void);
+
+#endif /* GCC_STREAMER_HOOKS_H */