diff options
author | Neil Booth <neil@cat.daikokuya.demon.co.uk> | 2001-08-01 06:19:39 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2001-08-01 06:19:39 +0000 |
commit | 1444f2ed7cfaf30f6e50da21f9a74e164f1fad84 (patch) | |
tree | 31a44a63f5280d362281e3aedf7c120f4aed024a | |
parent | 7f8a212577aa9bc71a1828635b426c3f2157c3b6 (diff) | |
download | gcc-1444f2ed7cfaf30f6e50da21f9a74e164f1fad84.zip gcc-1444f2ed7cfaf30f6e50da21f9a74e164f1fad84.tar.gz gcc-1444f2ed7cfaf30f6e50da21f9a74e164f1fad84.tar.bz2 |
cpphash.h (struct cpp_reader): New members line, pseudo_newlines.
* cpphash.h (struct cpp_reader): New members line, pseudo_newlines.
* cpplex.c (handle_newline): Update prototype. Maintain logical
line number.
(skip_escaped_newlines, skip_block_comment, parse_string):
Update accordingly.
(_cpp_lex_token): Update, and store token position within the token.
* cpplib.h (struct cpp_token): Add line and column entries.
* cppmacro.c (replace_args): Position stringified tokens correctly.
From-SVN: r44533
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cpphash.h | 6 | ||||
-rw-r--r-- | gcc/cpplex.c | 23 | ||||
-rw-r--r-- | gcc/cpplib.h | 2 | ||||
-rw-r--r-- | gcc/cppmacro.c | 9 |
5 files changed, 43 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f392c82..857a75d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2001-08-01 Neil Booth <neil@cat.daikokuya.demon.co.uk> + + * cpphash.h (struct cpp_reader): New members line, pseudo_newlines. + * cpplex.c (handle_newline): Update prototype. Maintain logical + line number. + (skip_escaped_newlines, skip_block_comment, parse_string): + Update accordingly. + (_cpp_lex_token): Update, and store token position within the token. + * cpplib.h (struct cpp_token): Add line and column entries. + * cppmacro.c (replace_args): Position stringified tokens correctly. + 2001-08-01 Andreas Jaeger <aj@suse.de> * basic-block.h: Add prototype for last_loop_beg_note. diff --git a/gcc/cpphash.h b/gcc/cpphash.h index 82746b5..12b64a8 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -246,6 +246,12 @@ struct cpp_reader /* Lexer state. */ struct lexer_state state; + /* Source line tracking. Subtract pseudo_newlines from the actual + line number to get the line number of preprocessed output. Used + for escaped newlines and macro args that cross multiple lines. */ + unsigned int line; + unsigned int pseudo_newlines; + /* The position of the last lexed token and last lexed directive. */ cpp_lexer_pos lexer_pos; cpp_lexer_pos directive_pos; diff --git a/gcc/cpplex.c b/gcc/cpplex.c index 5248a42..5970442 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -80,7 +80,7 @@ const struct token_spelling token_spellings [N_TTYPES] = {TTYPE_TABLE }; #define TOKEN_SPELL(token) (token_spellings[(token)->type].category) #define TOKEN_NAME(token) (token_spellings[(token)->type].name) -static cppchar_t handle_newline PARAMS ((cpp_buffer *, cppchar_t)); +static cppchar_t handle_newline PARAMS ((cpp_reader *, cppchar_t)); static cppchar_t skip_escaped_newlines PARAMS ((cpp_buffer *, cppchar_t)); static cppchar_t get_effective_char PARAMS ((cpp_buffer *)); @@ -124,12 +124,17 @@ cpp_ideq (token, string) /* Call when meeting a newline. Returns the character after the newline (or carriage-return newline combination), or EOF. */ static cppchar_t -handle_newline (buffer, newline_char) - cpp_buffer *buffer; +handle_newline (pfile, newline_char) + cpp_reader *pfile; cppchar_t newline_char; { + cpp_buffer *buffer; cppchar_t next = EOF; + pfile->line++; + pfile->pseudo_newlines++; + + buffer = pfile->buffer; buffer->col_adjust = 0; buffer->lineno++; buffer->line_base = buffer->cur; @@ -264,7 +269,7 @@ skip_escaped_newlines (buffer, next) cpp_warning (buffer->pfile, "backslash and newline separated by space"); - next = handle_newline (buffer, next1); + next = handle_newline (buffer->pfile, next1); if (next == EOF) cpp_pedwarn (buffer->pfile, "backslash-newline at end of file"); } @@ -348,7 +353,7 @@ skip_block_comment (pfile) } else if (is_vspace (c)) { - prevc = c, c = handle_newline (buffer, c); + prevc = c, c = handle_newline (pfile, c); goto next_char; } else if (c == '\t') @@ -706,7 +711,7 @@ parse_string (pfile, token, terminator) if (pfile->mlstring_pos.line == 0) pfile->mlstring_pos = pfile->lexer_pos; - c = handle_newline (buffer, c); + c = handle_newline (pfile, c); *dest++ = '\n'; goto have_char; } @@ -866,6 +871,7 @@ _cpp_lex_token (pfile, result) buffer->saved_flags = 0; next_char: pfile->lexer_pos.line = buffer->lineno; + result->line = pfile->line; next_char2: pfile->lexer_pos.col = CPP_BUF_COLUMN (buffer, buffer->cur); @@ -875,6 +881,7 @@ _cpp_lex_token (pfile, result) c = *buffer->cur++; pfile->lexer_pos.col++; } + result->col = pfile->lexer_pos.col; do_switch: buffer->read_ahead = EOF; @@ -901,7 +908,9 @@ _cpp_lex_token (pfile, result) case '\n': case '\r': if (!pfile->state.in_directive) { - handle_newline (buffer, c); + handle_newline (pfile, c); + if (!pfile->state.parsing_args) + pfile->pseudo_newlines = 0; bol = 1; pfile->lexer_pos.output_line = buffer->lineno; /* This is a new line, so clear any white space flag. diff --git a/gcc/cpplib.h b/gcc/cpplib.h index 58e4af6..fb7fac2 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -172,6 +172,8 @@ struct cpp_string occupy 12 bytes on 32-bit hosts and 16 bytes on 64-bit hosts. */ struct cpp_token { + unsigned int line; /* Logical line of first char of token. */ + unsigned short col; /* Column of first char of token. */ ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT; /* token type */ unsigned char flags; /* flags - see above */ diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c index a4569a3e..f8b3a2b 100644 --- a/gcc/cppmacro.c +++ b/gcc/cppmacro.c @@ -761,7 +761,12 @@ replace_args (pfile, macro, args, list) arg = &args[src->val.arg_no - 1]; if (src->flags & STRINGIFY_ARG) - from = arg->stringified, count = 1; + { + from = arg->stringified, count = 1; + /* Ugh. Maintain position of original argument. */ + arg->stringified->line = src->line; + arg->stringified->col = src->col; + } else if (src->flags & PASTE_LEFT) count = arg->count, from = arg->first; else if (src > macro->expansion && (src[-1].flags & PASTE_LEFT)) @@ -923,6 +928,7 @@ cpp_get_token (pfile, token) /* PASTE_LEFT tokens can only appear in macro expansions. */ if (token->flags & PASTE_LEFT) { + /* Maintains position of original token. */ paste_all_tokens (pfile, token); pfile->buffer->saved_flags = AVOID_LPASTE; } @@ -957,6 +963,7 @@ cpp_get_token (pfile, token) if (node->flags & NODE_BUILTIN) { + /* Maintains position of original token. */ builtin_macro (pfile, token); pfile->buffer->saved_flags = AVOID_LPASTE; break; |