> 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
> 

Reply via email to