Message ID | 20240824144626.6646-1-amonakov@ispras.ru |
---|---|
State | New |
Headers | show |
Series | libcpp: deduplicate definition of padding size | expand |
> Am 24.08.2024 um 16:47 schrieb Alexander Monakov <amonakov@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 >
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;