From 54d3be9157735d256433f8ba19ca25a2961fe236 Mon Sep 17 00:00:00 2001 From: zack Date: Mon, 13 Oct 2003 18:53:28 +0000 Subject: [PATCH] * cpplex.c (_cpp_clean_line): In the common case of a line with no trigraphs and no \-newline, avoid writing to memory. (_cpp_skip_block_comment): Use a local 'cur' pointer instead of the buffer member. Make c an uchar to avoid unnecessary sign extensions. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72437 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 18 +++++++++---- gcc/cpplex.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dddfe9a..584fd72 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2003-10-13 Zack Weinberg + + * cpplex.c (_cpp_clean_line): In the common case of a line + with no trigraphs and no \-newline, avoid writing to memory. + (_cpp_skip_block_comment): Use a local 'cur' pointer instead + of the buffer member. Make c an uchar to avoid unnecessary + sign extensions. + 2003-10-13 Nathanael Nerode * configure.in: Remove unnecessary test. @@ -9,13 +17,13 @@ 2003-10-13 Andreas Krebbel - * config/s390/s390.md ("*fmadddf4", "*fmsubdf4", "*fmaddsf4", + * config/s390/s390.md ("*fmadddf4", "*fmsubdf4", "*fmaddsf4", "*fmsubsf4"): Insns are now dependent on TARGET_FUSED_MADD instead of flag_unsafe_math_optimizations. * config/s390/s390.h ("MASK_NO_FUSED_MADD", "TARGET_NO_FUSED_MADD", "TARGET_FUSED_MADD", "TARGET_SWITCHES"): Introduced new target flags fused-madd and no-fused-madd. - * doc/invoke.texi: Documented the new options fused-madd and + * doc/invoke.texi: Documented the new options fused-madd and no-fused-madd for S/390. 2003-10-14 Alan Modra @@ -123,7 +131,7 @@ and the signed type would overflow. Always negate real constants unless we honor -ftrapping-math. Only convert -(A-B) into B-A if allowed by reorder_operands_p. Add support for COMPLEX_CST. - Optimize negation through floating point extensions and + Optimize negation through floating point extensions and sign-preserving built-in functions (as defined by negate_mathfn_p). (fold): Adjust calls to tree_swap_operands_p. (fold ): Move the remaining negation optimizations @@ -226,7 +234,7 @@ Sat Oct 11 12:24:23 CEST 2003 Jan Hubicka point optimizations with -funsafe-math-optimizations. 2003-10-11 Andrew Pinski - + * genmodes.c (emit_mode_mask) Change MASK to MODE_MASK. 2003-10-11 Kazu Hirata @@ -298,7 +306,7 @@ Sat Oct 11 12:24:23 CEST 2003 Jan Hubicka Paul Dale * config/m68k/lb1sf68.asm: Add __PIC__ and __ID_SHARED_LIBRARY__ - support. + support. * config/m68k/m68k-none.h (ASM_SPEC): Pass --pcrel to assembler on -fpic, -fPIC, -msep-data and -mid-shared-library. * config/m68k/m68k.c (m68k_library_id_string): New global variable. diff --git a/gcc/cpplex.c b/gcc/cpplex.c index 45cf574..3701415 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -114,7 +114,57 @@ _cpp_clean_line (cpp_reader *pfile) if (!buffer->from_stage3) { - d = (uchar *) s; + /* Short circuit for the common case of an un-escaped line with + no trigraphs. The primary win here is by not writing any + data back to memory until we have to. */ + for (;;) + { + c = *++s; + if (c == '\n' || c == '\r') + { + d = (uchar *) s; + + if (s == buffer->rlimit) + goto done; + + /* DOS line ending? */ + if (c == '\r' && s[1] == '\n') + s++; + + if (s == buffer->rlimit) + goto done; + + /* check for escaped newline */ + p = d; + while (p != buffer->next_line && is_nvspace (p[-1])) + p--; + if (p == buffer->next_line || p[-1] != '\\') + goto done; + + /* Have an escaped newline; process it and proceed to + the slow path. */ + add_line_note (buffer, p - 1, p != d ? ' ' : '\\'); + d = p - 2; + buffer->next_line = p - 1; + break; + } + if (c == '?' && s[1] == '?' && _cpp_trigraph_map[s[2]]) + { + /* Have a trigraph. We may or may not have to convert + it. Add a line note regardless, for -Wtrigraphs. */ + add_line_note (buffer, s, s[2]); + if (CPP_OPTION (pfile, trigraphs)) + { + /* We do, and that means we have to switch to the + slow path. */ + d = (uchar *) s; + *d = _cpp_trigraph_map[s[2]]; + s += 2; + break; + } + } + } + for (;;) { @@ -164,6 +214,7 @@ _cpp_clean_line (cpp_reader *pfile) s++; } + done: *d = '\n'; /* A sentinel note that should never be processed. */ add_line_note (buffer, d + 1, '\n'); @@ -266,43 +317,49 @@ bool _cpp_skip_block_comment (cpp_reader *pfile) { cpp_buffer *buffer = pfile->buffer; - cppchar_t c; + const uchar *cur = buffer->cur; + uchar c; - buffer->cur++; - if (*buffer->cur == '/') - buffer->cur++; + cur++; + if (*cur == '/') + cur++; for (;;) { - c = *buffer->cur++; - /* People like decorating comments with '*', so check for '/' instead for efficiency. */ + c = *cur++; + if (c == '/') { - if (buffer->cur[-2] == '*') + if (cur[-2] == '*') break; /* Warn about potential nested comments, but not if the '/' comes immediately before the true comment delimiter. Don't bother to get it right across escaped newlines. */ if (CPP_OPTION (pfile, warn_comments) - && buffer->cur[0] == '*' && buffer->cur[1] != '/') - cpp_error_with_line (pfile, DL_WARNING, - pfile->line, CPP_BUF_COL (buffer), - "\"/*\" within comment"); + && cur[0] == '*' && cur[1] != '/') + { + buffer->cur = cur; + cpp_error_with_line (pfile, DL_WARNING, + pfile->line, CPP_BUF_COL (buffer), + "\"/*\" within comment"); + } } else if (c == '\n') { - buffer->cur--; + buffer->cur = cur - 1; _cpp_process_line_notes (pfile, true); if (buffer->next_line >= buffer->rlimit) return true; _cpp_clean_line (pfile); pfile->line++; + cur = buffer->cur; } } + buffer->cur = cur; _cpp_process_line_notes (pfile, true); return false; } -- 2.7.4