> Am 27.12.2024 um 03:48 schrieb Andi Kleen <a...@firstfloor.org>:
>
> From: Andi Kleen <a...@gcc.gnu.org>
>
> glibc ferror is surprisingly expensive. Move it out of the hot loop
> of finding lines by setting a flag after the actual IO operations.
This 4/6 is OK.
Richard
> gcc/ChangeLog:
>
> PR preprocessor/118168
> * input.cc (file_cache_slot::m_error): New field.
> (file_cache_slot::create): Clear m_error.
> (file_cache_slot::file_cache_slot): Clear m_error.
> (file_cache_slot::read_data): Set m_error on error.
> (file_cache_slot::get_next_line): Use m_error instead of ferror.
> ---
> gcc/input.cc | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/input.cc b/gcc/input.cc
> index 577826cef97..e17d455c0fb 100644
> --- a/gcc/input.cc
> +++ b/gcc/input.cc
> @@ -140,6 +140,9 @@ public:
>
> FILE *m_fp;
>
> + /* True when an read error happened. */
> + bool m_error;
> +
> /* This points to the content of the file that we've read so
> far. */
> char *m_data;
> @@ -386,6 +389,7 @@ file_cache_slot::evict ()
> m_file_path = NULL;
> if (m_fp)
> fclose (m_fp);
> + m_error = false;
> m_fp = NULL;
> m_nb_read = 0;
> m_line_start_idx = 0;
> @@ -480,6 +484,7 @@ file_cache_slot::create (const file_cache::input_context
> &in_context,
> m_file_path = file_path;
> if (m_fp)
> fclose (m_fp);
> + m_error = false;
> m_fp = fp;
> if (m_alloc_offset)
> offset_buffer (-m_alloc_offset);
> @@ -590,7 +595,7 @@ file_cache::lookup_or_add_file (const char *file_path)
> diagnostic. */
>
> file_cache_slot::file_cache_slot ()
> -: m_use_count (0), m_file_path (NULL), m_fp (NULL), m_data (0),
> +: m_use_count (0), m_file_path (NULL), m_fp (NULL), m_error (false), m_data
> (0),
> m_alloc_offset (0), m_size (0), m_nb_read (0), m_line_start_idx (0),
> m_line_num (0), m_missing_trailing_newline (true)
> {
> @@ -704,7 +709,10 @@ file_cache_slot::read_data ()
> size_t nb_read = fread (from, 1, to_read, m_fp);
>
> if (ferror (m_fp))
> - return false;
> + {
> + m_error = true;
> + return false;
> + }
>
> m_nb_read += nb_read;
> return !!nb_read;
> @@ -822,7 +830,7 @@ file_cache_slot::get_next_line (char **line, ssize_t
> *line_len)
> m_missing_trailing_newline = false;
> }
>
> - if (m_fp && ferror (m_fp))
> + if (m_error)
> return false;
>
> /* At this point, we've found the end of the of line. It either points to
> --
> 2.47.0
>