From: Gabriel Charette <gcharette1@gmail.com>
To: Diego Novillo <dnovillo@google.com>
Cc: reply@codereview.appspotmail.com, crowl@google.com,
gcc-patches@gcc.gnu.org
Subject: Re: [pph] Do not read pph files more than once (issue4983055)
Date: Mon, 12 Sep 2011 15:13:00 -0000 [thread overview]
Message-ID: <CAAb05gFZUY4NL806AsMJqFSOJRamMh-DTUoG__nCnbJ813dq+A@mail.gmail.com> (raw)
In-Reply-To: <20110909205432.9A2611DA1D9@topo.tor.corp.google.com>
Oops forgot to reply all the first time...
On Fri, Sep 9, 2011 at 4:54 PM, Diego Novillo <dnovillo@google.com> wrote:
> This was not causing any failures, but it is pretty wasteful to read
> the same PPH more than once.
>
> We cannot just skip them, however. We need to read the line table to
> properly modify the line table for the current translation unit.
I don't think that's right. If the header is not re-read (i.e. ifdef
guarded out), it should not show in the line_table either. I think you
simply want to do this check at the top of pph_read_file itself.
>
> /* Read PPH file FILENAME. Return the in-memory pph_stream instance. */
>
> -pph_stream *
> +void
> pph_read_file (const char *filename)
> {
> pph_stream *stream;
> @@ -1667,7 +1696,7 @@ pph_read_file (const char *filename)
> else
> error ("Cannot open PPH file for reading: %s: %m", filename);
>
> - return stream;
> + pph_add_read_image (stream);
> }
This needs to be after the check for an already read image I think
(having it here wouldn't create test failures, but would create
duplicate entries for skipped headers (as right now they are still
added to pph_read_images when skipped I think)).
Cheers!,
Gab
On Fri, Sep 9, 2011 at 4:54 PM, Diego Novillo <dnovillo@google.com> wrote:
> This was not causing any failures, but it is pretty wasteful to read
> the same PPH more than once.
>
> We cannot just skip them, however. We need to read the line table to
> properly modify the line table for the current translation unit.
>
> Tested on x86_64. Committed to branch.
>
>
> Diego.
>
>
> * pph-streamer-in.c (pph_image_already_read): New.
> (pph_read_file_1): Call pph_image_already_read. If it returns
> true, return after reading the line table.
> (pph_add_read_image): New.
> (pph_read_file): Change return value to void. Update all callers.
> Call pph_add_read_image.
> * pph-streamer-out.c (pph_add_include): Remove second argument.
> Update all callers.
> Do not add INCLUDE to pph_read_images.
> * pph-streamer.h (pph_add_include): Update prototype.
>
> diff --git a/gcc/cp/pph-streamer-in.c b/gcc/cp/pph-streamer-in.c
> index b111850..ea44460 100644
> --- a/gcc/cp/pph-streamer-in.c
> +++ b/gcc/cp/pph-streamer-in.c
> @@ -1462,7 +1462,6 @@ pph_in_include (pph_stream *stream)
> {
> int old_loc_offset;
> const char *include_name;
> - pph_stream *include;
> source_location prev_start_loc = pph_in_source_location (stream);
>
> /* Simulate highest_location to be as it would be at this point in a non-pph
> @@ -1475,8 +1474,7 @@ pph_in_include (pph_stream *stream)
> old_loc_offset = pph_loc_offset;
>
> include_name = pph_in_string (stream);
> - include = pph_read_file (include_name);
> - pph_add_include (include, false);
> + pph_read_file (include_name);
>
> pph_loc_offset = old_loc_offset;
> }
> @@ -1583,6 +1581,23 @@ pph_in_line_table_and_includes (pph_stream *stream)
> }
>
>
> +/* If FILENAME has already been read, return the stream associated with it. */
> +
> +static pph_stream *
> +pph_image_already_read (const char *filename)
> +{
> + pph_stream *include;
> + unsigned i;
> +
> + /* FIXME pph, implement a hash map to avoid this linear search. */
> + FOR_EACH_VEC_ELT (pph_stream_ptr, pph_read_images, i, include)
> + if (strcmp (include->name, filename) == 0)
> + return include;
> +
> + return NULL;
> +}
> +
> +
> /* Helper for pph_read_file. Read contents of PPH file in STREAM. */
>
> static void
> @@ -1605,6 +1620,11 @@ pph_read_file_1 (pph_stream *stream)
> read. */
> cpp_token_replay_loc = pph_in_line_table_and_includes (stream);
>
> + /* If we have read STREAM before, we do not need to re-read the rest
> + of its body. We only needed to read its line table. */
> + if (pph_image_already_read (stream->name))
> + return;
> +
> /* Read all the identifiers and pre-processor symbols in the global
> namespace. */
> pph_in_identifiers (stream, &idents_used);
> @@ -1650,13 +1670,22 @@ pph_read_file_1 (pph_stream *stream)
> STREAM will need to be read again the next time we want to read
> the image we are now generating. */
> if (pph_out_file && !pph_reading_includes)
> - pph_add_include (stream, true);
> + pph_add_include (stream);
> +}
> +
> +
> +/* Add STREAM to the list of read images. */
> +
> +static void
> +pph_add_read_image (pph_stream *stream)
> +{
> + VEC_safe_push (pph_stream_ptr, heap, pph_read_images, stream);
> }
>
>
> /* Read PPH file FILENAME. Return the in-memory pph_stream instance. */
>
> -pph_stream *
> +void
> pph_read_file (const char *filename)
> {
> pph_stream *stream;
> @@ -1667,7 +1696,7 @@ pph_read_file (const char *filename)
> else
> error ("Cannot open PPH file for reading: %s: %m", filename);
>
> - return stream;
> + pph_add_read_image (stream);
> }
>
>
> diff --git a/gcc/cp/pph-streamer-out.c b/gcc/cp/pph-streamer-out.c
> index 264294c..1a32814 100644
> --- a/gcc/cp/pph-streamer-out.c
> +++ b/gcc/cp/pph-streamer-out.c
> @@ -1845,18 +1845,13 @@ pph_add_decl_to_symtab (tree decl, enum pph_symtab_action action,
> }
>
>
> -/* Add INCLUDE to the list of files included by the main pph_out_stream
> - if IS_MAIN_STREAM_INCLUDE, as well as to the global list of all read
> - includes. */
> +/* Add INCLUDE to the list of files included by pph_out_stream. */
>
> void
> -pph_add_include (pph_stream *include, bool is_main_stream_include)
> +pph_add_include (pph_stream *include)
> {
> - if (is_main_stream_include)
> - VEC_safe_push (pph_stream_ptr, heap,
> - pph_out_stream->encoder.w.includes, include);
> -
> - VEC_safe_push (pph_stream_ptr, heap, pph_read_images, include);
> + VEC_safe_push (pph_stream_ptr, heap, pph_out_stream->encoder.w.includes,
> + include);
> }
>
>
> diff --git a/gcc/cp/pph-streamer.h b/gcc/cp/pph-streamer.h
> index 7205d64..7f98764 100644
> --- a/gcc/cp/pph-streamer.h
> +++ b/gcc/cp/pph-streamer.h
> @@ -255,7 +255,7 @@ void pph_flush_buffers (pph_stream *);
> void pph_init_write (pph_stream *);
> void pph_write_tree (struct output_block *, tree, bool);
> void pph_add_decl_to_symtab (tree, enum pph_symtab_action, bool, bool);
> -void pph_add_include (pph_stream *, bool);
> +void pph_add_include (pph_stream *);
> void pph_writer_init (void);
> void pph_writer_finish (void);
> void pph_write_location (struct output_block *, location_t);
> @@ -269,7 +269,7 @@ struct binding_table_s *pph_in_binding_table (pph_stream *);
> void pph_init_read (pph_stream *);
> tree pph_read_tree (struct lto_input_block *, struct data_in *);
> location_t pph_read_location (struct lto_input_block *, struct data_in *);
> -pph_stream *pph_read_file (const char *);
> +void pph_read_file (const char *);
> void pph_reader_finish (void);
>
> /* In pt.c. */
>
> --
> This patch is available for review at http://codereview.appspot.com/4983055
>
next prev parent reply other threads:[~2011-09-12 14:51 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-10 4:12 Diego Novillo
2011-09-12 15:13 ` Gabriel Charette [this message]
2011-09-27 17:54 ` Diego Novillo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAAb05gFZUY4NL806AsMJqFSOJRamMh-DTUoG__nCnbJ813dq+A@mail.gmail.com \
--to=gcharette1@gmail.com \
--cc=crowl@google.com \
--cc=dnovillo@google.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=reply@codereview.appspotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).