@@ -33,13 +33,6 @@ along with GCC; see the file COPYING3. If not see
#include "cppbuiltin.h"
#include "toplev.h"
-/* List of PPH images read during parsing. Images opened during #include
- processing and opened from pph_in_includes cannot be closed
- immediately after reading, because the pickle cache contained in
- them may be referenced from other images. We delay closing all of
- them until the end of parsing (when pph_reader_finish is called). */
-static VEC(pph_stream_ptr,heap) *pph_read_images = NULL;
-
typedef char *char_p;
DEF_VEC_P(char_p);
DEF_VEC_ALLOC_P(char_p,heap);
@@ -53,6 +46,12 @@ DEF_VEC_ALLOC_P(char_p,heap);
memory will remain allocated until the end of compilation. */
static VEC(char_p,heap) *string_tables = NULL;
+/* Increment when we are in the process of reading includes as we do not want
+ to add those to the parent pph stream's list of includes to be written out.
+ Decrement when done. We cannot use a simple true/false flag as read includes
+ will call pph_in_includes as well. */
+static int pph_reading_includes = 0;
+
/* Wrapper for memory allocation calls that should have their results
registered in the PPH streamer cache. DATA is the pointer returned
by the memory allocation call in ALLOC_EXPR. IX is the cache slot
@@ -1289,6 +1288,8 @@ pph_in_includes (pph_stream *stream)
{
unsigned i, num;
+ pph_reading_includes++;
+
num = pph_in_uint (stream);
for (i = 0; i < num; i++)
{
@@ -1296,6 +1297,8 @@ pph_in_includes (pph_stream *stream)
pph_stream *include = pph_read_file (include_name);
pph_add_include (stream, include);
}
+
+ pph_reading_includes--;
}
@@ -1467,7 +1470,7 @@ pph_read_file_1 (pph_stream *stream)
/* If we are generating an image, the PPH contents we just read from
STREAM will need to be read again the next time we want to read
the image we are now generating. */
- if (pph_out_file)
+ if (pph_out_file && !pph_reading_includes)
pph_add_include (NULL, stream);
}
@@ -1481,10 +1484,7 @@ pph_read_file (const char *filename)
stream = pph_stream_open (filename, "rb");
if (stream)
- {
- pph_read_file_1 (stream);
- VEC_safe_push (pph_stream_ptr, heap, pph_read_images, stream);
- }
+ pph_read_file_1 (stream);
else
error ("Cannot open PPH file for reading: %s: %m", filename);
@@ -1964,4 +1964,6 @@ pph_reader_finish (void)
/* Close any images read during parsing. */
FOR_EACH_VEC_ELT (pph_stream_ptr, pph_read_images, i, image)
pph_stream_close (image);
+
+ VEC_free (pph_stream_ptr, heap, pph_read_images);
}
@@ -207,11 +207,11 @@ pph_out_start_record (pph_stream *stream, void *data)
return false;
}
- /* DATA is not in STREAM's cache. See if it is in any of STREAM's
+ /* DATA is not in STREAM's cache. See if it is in any of the
included images. If it is, write an external reference to it
and inform the caller that it should not write a physical
representation for DATA. */
- if (pph_cache_lookup_in_includes (stream, data, &include_ix, &ix))
+ if (pph_cache_lookup_in_includes (data, &include_ix, &ix))
{
pph_out_record_marker (stream, PPH_RECORD_XREF);
pph_out_uint (stream, include_ix);
@@ -351,7 +351,7 @@ pph_out_ld_min (pph_stream *stream, struct lang_decl_min *ldm)
/* Return true if T matches FILTER for STREAM. */
static inline bool
-pph_tree_matches (pph_stream *stream, tree t, unsigned filter)
+pph_tree_matches (tree t, unsigned filter)
{
if ((filter & PPHF_NO_BUILTINS)
&& DECL_P (t)
@@ -359,7 +359,7 @@ pph_tree_matches (pph_stream *stream, tree t, unsigned filter)
return false;
if ((filter & PPHF_NO_XREFS)
- && pph_cache_lookup_in_includes (stream, t, NULL, NULL))
+ && pph_cache_lookup_in_includes (t, NULL, NULL))
return false;
return true;
@@ -399,7 +399,7 @@ pph_out_tree_vec_filtered (pph_stream *stream, VEC(tree,gc) *v, unsigned filter)
/* Collect all the nodes that match the filter. */
FOR_EACH_VEC_ELT (tree, v, i, t)
- if (pph_tree_matches (stream, t, filter))
+ if (pph_tree_matches (t, filter))
VEC_safe_push (tree, heap, to_write, t);
/* Write them. */
@@ -533,7 +533,7 @@ pph_out_chain_filtered (pph_stream *stream, tree first, unsigned filter)
/* Collect all the nodes that match the filter. */
for (t = first; t; t = TREE_CHAIN (t))
- if (pph_tree_matches (stream, t, filter))
+ if (pph_tree_matches (t, filter))
VEC_safe_push (tree, heap, to_write, t);
/* Write them. */
@@ -1746,7 +1746,8 @@ pph_add_decl_to_symtab (tree decl)
/* Add INCLUDE to the list of files included by STREAM. If STREAM is
NULL, INCLUDE is added to the list of includes for pph_out_stream
- (the image that we are currently generating). */
+ (the image that we are currently generating). Also add the INCLUDE
+ to the global list pph_read_images. */
void
pph_add_include (pph_stream *stream, pph_stream *include)
@@ -1754,6 +1755,8 @@ pph_add_include (pph_stream *stream, pph_stream *include)
if (stream == NULL)
stream = pph_out_stream;
VEC_safe_push (pph_stream_ptr, heap, stream->includes, include);
+
+ VEC_safe_push (pph_stream_ptr, heap, pph_read_images, include);
}
@@ -33,6 +33,13 @@ along with GCC; see the file COPYING3. If not see
#include "cppbuiltin.h"
#include "streamer-hooks.h"
+/* List of PPH images read during parsing. Images opened during #include
+ processing and opened from pph_in_includes cannot be closed
+ immediately after reading, because the pickle cache contained in
+ them may be referenced from other images. We delay closing all of
+ them until the end of parsing (when pph_reader_finish is called). */
+VEC(pph_stream_ptr, heap) *pph_read_images = NULL;
+
/* Pre-load common tree nodes into the pickle cache in STREAM. These
nodes are always built by the front end, so there is no need to
pickle them.
@@ -154,6 +161,7 @@ pph_stream_close (pph_stream *stream)
destroy_output_block (stream->encoder.w.ob);
free (stream->encoder.w.decl_state_stream);
lto_delete_out_decl_state (stream->encoder.w.out_state);
+ VEC_free (pph_stream_ptr, heap, stream->includes);
}
else
{
@@ -423,8 +431,7 @@ pph_cache_lookup (pph_stream *stream, void *data, unsigned *ix_p)
}
-/* Return true if DATA is in the pickle cache of one of STREAM's
- included images.
+/* Return true if DATA is in the pickle cache of one of the included images.
If DATA is found:
- the index for INCLUDE_P into IMAGE->INCLUDES is returned in
@@ -439,15 +446,15 @@ pph_cache_lookup (pph_stream *stream, void *data, unsigned *ix_p)
- the function returns false. */
bool
-pph_cache_lookup_in_includes (pph_stream *stream, void *data,
- unsigned *include_ix_p, unsigned *ix_p)
+pph_cache_lookup_in_includes (void *data, unsigned *include_ix_p,
+ unsigned *ix_p)
{
unsigned include_ix, ix;
pph_stream *include;
bool found_it;
found_it = false;
- FOR_EACH_VEC_ELT (pph_stream_ptr, stream->includes, include_ix, include)
+ FOR_EACH_VEC_ELT (pph_stream_ptr, pph_read_images, include_ix, include)
if (pph_cache_lookup (include, data, &ix))
{
found_it = true;
@@ -512,7 +519,7 @@ pph_cache_get (pph_stream *stream, unsigned include_ix, unsigned ix)
if (include_ix == (unsigned) -1)
image = stream;
else
- image = VEC_index (pph_stream_ptr, stream->includes, include_ix);
+ image = VEC_index (pph_stream_ptr, pph_read_images, include_ix);
data = VEC_index (void_p, image->cache.v, ix);
gcc_assert (data);
@@ -179,8 +179,8 @@ typedef struct pph_stream {
they were instantiated originally. */
pph_symtab symtab;
- /* List of PPH files included by the PPH file that we are currently
- generating. Note that this list only contains PPH files, not
+ /* List of PPH files directly included by the PPH file that we are currently
+ generating/reading. Note that this list only contains PPH files, not
regular text headers. Those are embedded in this stream. */
VEC(pph_stream_ptr,heap) *includes;
} pph_stream;
@@ -203,11 +203,12 @@ void pph_trace_chain (pph_stream *, tree);
void pph_trace_bitpack (pph_stream *, struct bitpack_d *);
void pph_cache_insert_at (pph_stream *, void *, unsigned);
bool pph_cache_lookup (pph_stream *, void *, unsigned *);
-bool pph_cache_lookup_in_includes (pph_stream *, void *, unsigned *,
- unsigned *);
+bool pph_cache_lookup_in_includes (void *, unsigned *, unsigned *);
bool pph_cache_add (pph_stream *, void *, unsigned *);
void *pph_cache_get (pph_stream *, unsigned, unsigned);
+extern VEC(pph_stream_ptr, heap) *pph_read_images;
+
/* In pph-streamer-out.c. */
void pph_flush_buffers (pph_stream *);
void pph_init_write (pph_stream *);
@@ -172,7 +172,7 @@ void
pph_finish (void)
{
/* Finalize the writer. */
- pph_writer_finish ();
+ pph_writer_finish ();
/* Finalize the reader. */
pph_reader_finish ();
@@ -1,5 +1,3 @@
-// pph asm xdiff 00611
-
#include "c2deepincl3.h"
int test() {