> Am 24.08.2024 um 16:47 schrieb Alexander Monakov <amona...@ispras.ru>:
> 
> Tie together the two functions that ensure tail padding with
> search_line_ssse3 via CPP_BUFFER_PADDING macro.

Ok

Richard 

> libcpp/ChangeLog:
> 
>    * internal.h (CPP_BUFFER_PADDING): New macro; use it ...
>    * charset.cc (_cpp_convert_input): ...here, and ...
>    * files.cc (read_file_guts): ...here, and ...
>    * lex.cc (search_line_ssse3): here.
> ---
> libcpp/charset.cc | 7 +------
> libcpp/files.cc   | 6 +-----
> libcpp/internal.h | 7 +++++++
> libcpp/lex.cc     | 4 ++--
> 4 files changed, 11 insertions(+), 13 deletions(-)
> 
> diff --git a/libcpp/charset.cc b/libcpp/charset.cc
> index 79072877cb..fd57f61398 100644
> --- a/libcpp/charset.cc
> +++ b/libcpp/charset.cc
> @@ -3093,7 +3093,7 @@ _cpp_convert_input (cpp_reader *pfile, const char 
> *input_charset,
>   struct cset_converter input_cset;
>   struct _cpp_strbuf to;
>   unsigned char *buffer;
> -  size_t pad;
> +  size_t pad = CPP_BUFFER_PADDING;
> 
>   input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset);
>   if (input_cset.func == convert_no_conversion)
> @@ -3130,11 +3130,6 @@ _cpp_convert_input (cpp_reader *pfile, const char 
> *input_charset,
>    }
>     }
> 
> -#ifdef HAVE_SSSE3
> -  pad = 64;
> -#else
> -  pad = 16;
> -#endif
>   /* Resize buffer if we allocated substantially too much, or if we
>      don't have enough space for the following padding, which allows
>      search_line_fast to use (possibly misaligned) vector loads.  */
> diff --git a/libcpp/files.cc b/libcpp/files.cc
> index 3775091d25..fc66b9c3d7 100644
> --- a/libcpp/files.cc
> +++ b/libcpp/files.cc
> @@ -732,11 +732,7 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file, 
> location_t loc,
>        the majority of C source files.  */
>     size = 8 * 1024;
> 
> -#ifdef HAVE_SSSE3
> -  pad = 64;
> -#else
> -  pad = 16;
> -#endif
> +  pad = CPP_BUFFER_PADDING;
>   /* The '+ PAD' here is space for the final '\n' and PAD-1 bytes of padding,
>      allowing search_line_fast to use (possibly misaligned) vector loads.  */
>   buf = XNEWVEC (uchar, size + pad);
> diff --git a/libcpp/internal.h b/libcpp/internal.h
> index a20215c570..ad0a5d5d4e 100644
> --- a/libcpp/internal.h
> +++ b/libcpp/internal.h
> @@ -322,6 +322,13 @@ struct _cpp_line_note
>   unsigned int type;
> };
> 
> +/* Tail padding required by search_line_fast alternatives.  */
> +#ifdef HAVE_SSSE3
> +#define CPP_BUFFER_PADDING 64
> +#else
> +#define CPP_BUFFER_PADDING 16
> +#endif
> +
> /* Represents the contents of a file cpplib has read in.  */
> struct cpp_buffer
> {
> diff --git a/libcpp/lex.cc b/libcpp/lex.cc
> index f2d47d112b..7f0f8d0773 100644
> --- a/libcpp/lex.cc
> +++ b/libcpp/lex.cc
> @@ -359,8 +359,8 @@ search_line_ssse3 (const uchar *s, const uchar *end 
> ATTRIBUTE_UNUSED)
>                 "host character encoding is ASCII");
> 
>   v16qi d1, d2, t1, t2;
> -  /* Unaligned loads.  Reading beyond the final newline is safe,
> -     since files.cc:read_file_guts pads the allocation.  */
> +  /* Unaligned loads, potentially using padding after the final newline.  */
> +  static_assert (CPP_BUFFER_PADDING >= 64, "");
>   d1 = *(const v16qi_u *)s;
>   d2 = *(const v16qi_u *)(s + 16);
>   unsigned m1, m2, found;
> --
> 2.46.0
> 

Reply via email to