diff --git a/libcpp/charset.cc b/libcpp/charset.cc index 79072877cbf747aea7a3fbfac6ce0495825d43ae..fd57f6139804612d41311ebda684d13ff8c0c3d4 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 3775091d259eec3a73c8c71c847ba60d0e8092c9..fc66b9c3d73add260f1809aec16ab7bffa1ef65f 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 a20215c57095359e7ff275988979c9fcf7430c9b..ad0a5d5d4e34e5d3b22df7b65c3797616cf1616c 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 f2d47d112b921763c2a7a1ff38e7ac2192601f9b..7f0f8d07735b7c2c881877bbf27022b5bc43230e 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;