diff options
author | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-06 22:51:36 +0000 |
---|---|---|
committer | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-06 22:51:36 +0000 |
commit | 13225ff5797aafcf9364ad2334a637c23f63f5cb (patch) | |
tree | 44627b6221b370fdd68008a052a86fa6e7c16f32 | |
parent | 589468a60a5517c8df8a93f35e5ebbe5785834e8 (diff) | |
download | gcc-13225ff5797aafcf9364ad2334a637c23f63f5cb.tar.gz |
Revert "preprocessor/58580 - preprocessor goes OOM with warning for zero literals"
This reverts commit fc3eff8854861fcd70d33d26095b17fe456fae31.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204490 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/diagnostic.c | 17 | ||||
-rw-r--r-- | gcc/input.c | 115 | ||||
-rw-r--r-- | gcc/input.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c | bin | 240 -> 0 bytes |
6 files changed, 34 insertions, 127 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d9bc7c6853a..75603e79382 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -80,27 +80,6 @@ (register_new_assert_for): Use drop_tree_overflow. (vrp_visit_phi_node): Likewise. -2013-11-06 Dodji Seketeli <dodji@redhat.com> - - preprocessor/58580 - * input.h (location_get_source_line): Take an additional line_size - parameter. - * input.c (get_line): New static function definition. - (read_line): Take an additional line_length output parameter to be - set to the size of the line. Use the new get_line function do the - actual line reading. - (location_get_source_line): Take an additional output line_len - parameter. Update the use of read_line to pass it the line_len - parameter. - * diagnostic.c (adjust_line): Take an additional input parameter - for the length of the line, rather than calculating it with - strlen. - (diagnostic_show_locus): Adjust the use of - location_get_source_line and adjust_line with respect to their new - signature. While displaying a line now, do not stop at the first - null byte. Rather, display the zero byte as a space and keep - going until we reach the size of the line. - 2013-11-06 Eric Botcazou <ebotcazou@adacore.com> * config/i386/i386.c (ix86_expand_prologue): Optimize stack diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index e0c5d9dc79a..36094a19c9a 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -259,13 +259,12 @@ diagnostic_build_prefix (diagnostic_context *context, MAX_WIDTH by some margin, then adjust the start of the line such that the COLUMN is smaller than MAX_WIDTH minus the margin. The margin is either 10 characters or the difference between the column - and the length of the line, whatever is smaller. The length of - LINE is given by LINE_WIDTH. */ + and the length of the line, whatever is smaller. */ static const char * -adjust_line (const char *line, int line_width, - int max_width, int *column_p) +adjust_line (const char *line, int max_width, int *column_p) { int right_margin = 10; + int line_width = strlen (line); int column = *column_p; right_margin = MIN (line_width - column, right_margin); @@ -285,7 +284,6 @@ diagnostic_show_locus (diagnostic_context * context, const diagnostic_info *diagnostic) { const char *line; - int line_width; char *buffer; expanded_location s; int max_width; @@ -299,25 +297,22 @@ diagnostic_show_locus (diagnostic_context * context, context->last_location = diagnostic->location; s = expand_location_to_spelling_point (diagnostic->location); - line = location_get_source_line (s, &line_width); + line = location_get_source_line (s); if (line == NULL) return; max_width = context->caret_max_width; - line = adjust_line (line, line_width, max_width, &(s.column)); + line = adjust_line (line, max_width, &(s.column)); pp_newline (context->printer); saved_prefix = pp_get_prefix (context->printer); pp_set_prefix (context->printer, NULL); pp_space (context->printer); - while (max_width > 0 && line_width > 0) + while (max_width > 0 && *line != '\0') { char c = *line == '\t' ? ' ' : *line; - if (c == '\0') - c = ' '; pp_character (context->printer, c); max_width--; - line_width--; line++; } pp_newline (context->printer); diff --git a/gcc/input.c b/gcc/input.c index cb3a0a09f33..a141a92cac3 100644 --- a/gcc/input.c +++ b/gcc/input.c @@ -87,114 +87,53 @@ expand_location_1 (source_location loc, return xloc; } -/* This function reads a line that might contain bytes whose value is - zero. It returns the number of bytes read. The 'end-of-line' - character found at the end of the line is not contained in the - returned buffer. Note that this function has been adapted from - getline() and _IO_getdelim() GNU C library functions. It's been - duplicated here because the getline() function is not necessarily - present on all platforms. - - LINEPTR points to a buffer that is to contain the line read. - - N points to the size of the the LINEPTR buffer. - - FP points to the file to consider. */ - -static ssize_t -get_line (char **lineptr, size_t *n, FILE *fp) +/* Reads one line from file into a static buffer. */ +static const char * +read_line (FILE *file) { - ssize_t cur_len = 0, len; - char buf[16384]; - - if (lineptr == NULL || n == NULL) - return -1; + static char *string; + static size_t string_len; + size_t pos = 0; + char *ptr; - if (*lineptr == NULL || *n == 0) + if (!string_len) { - *n = 120; - *lineptr = XNEWVEC (char, *n); + string_len = 200; + string = XNEWVEC (char, string_len); } - len = fread (buf, 1, sizeof buf, fp); - if (ferror (fp)) - return -1; - - for (;;) + while ((ptr = fgets (string + pos, string_len - pos, file))) { - size_t needed; - char *t = (char*) memchr (buf, '\n', len); - if (t != NULL) len = (t - buf); - if (__builtin_expect (len >= SSIZE_MAX - cur_len, 0)) - return -1; - needed = cur_len + len + 1; - if (needed > *n) + size_t len = strlen (string + pos); + + if (string[pos + len - 1] == '\n') { - char *new_lineptr; - if (needed < 2 * *n) - needed = 2 * *n; - new_lineptr = XRESIZEVEC (char, *lineptr, needed); - *lineptr = new_lineptr; - *n = needed; + string[pos + len - 1] = 0; + return string; } - memcpy (*lineptr + cur_len, buf, len); - cur_len += len; - if (t != NULL) - break; - len = fread (buf, 1, sizeof buf, fp); - if (ferror (fp)) - return -1; - if (len == 0) - break; + pos += len; + string = XRESIZEVEC (char, string, string_len * 2); + string_len *= 2; } - - if (cur_len) - (*lineptr)[cur_len] = '\0'; - return cur_len; -} - -/* Reads one line from FILE into a static buffer. If LINE_LENGTH is - *non-null LINE_LENGTH, will be set by this function to the length of - *the returned line. Note that the returned line can contain several - *zero bytes. Also note that the returned string is allocated in - *static storage that is going to be re-used by subsequent invocations - *of read_line. */ -static const char * -read_line (FILE *file, int *line_length) -{ - static char *string; - static size_t string_len; - int len; - - len = get_line (&string, &string_len, file); - if (line_length) - *line_length = len; - return len ? string : NULL; + + return pos ? string : NULL; } /* Return the physical source line that corresponds to xloc in a buffer that is statically allocated. The newline is replaced by - the null character. Note that the line can contain several null - characters, so LINE_LEN, if non-null, points to the actual length - of the line. */ + the null character. */ const char * -location_get_source_line (expanded_location xloc, - int *line_len) +location_get_source_line (expanded_location xloc) { - const char *buffer = NULL, *ptr; - int lines = 0, len = 0; + const char *buffer; + int lines = 1; FILE *stream = xloc.file ? fopen (xloc.file, "r") : NULL; if (!stream) return NULL; - while ((ptr = read_line (stream, &len)) && lines < xloc.line) - { - buffer = ptr; - lines++; - if (line_len) - *line_len = len; - } + while ((buffer = read_line (stream)) && lines < xloc.line) + lines++; fclose (stream); return buffer; diff --git a/gcc/input.h b/gcc/input.h index 128e28cd942..8fdc7b28d92 100644 --- a/gcc/input.h +++ b/gcc/input.h @@ -37,8 +37,7 @@ extern char builtins_location_check[(BUILTINS_LOCATION < RESERVED_LOCATION_COUNT) ? 1 : -1]; extern expanded_location expand_location (source_location); -extern const char *location_get_source_line (expanded_location xloc, - int *line_size); +extern const char *location_get_source_line (expanded_location xloc); extern expanded_location expand_location_to_spelling_point (source_location); extern source_location expansion_point_location_if_in_system_header (source_location); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 27a76280e5d..ce0c26c7e45 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -199,11 +199,6 @@ * gcc.dg/cilk-plus/cilk-plus.exp: Removed duplicate/un-necessary compiler flag testing. -2013-11-06 Dodji Seketeli <dodji@redhat.com> - - preprocessor/58580 - * c-c++-common/cpp/warning-zero-in-literals-1.c: New test file. - 2013-11-06 Christian Bruel <christian.bruel@st.com> * gcc.target/sh/strlen.c: New test. diff --git a/gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c b/gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c Binary files differdeleted file mode 100644 index ff2ed962ac9..00000000000 --- a/gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c +++ /dev/null |