]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cpphash.h (struct cpp_reader): New members line, pseudo_newlines.
authorNeil Booth <neil@cat.daikokuya.demon.co.uk>
Wed, 1 Aug 2001 06:19:39 +0000 (06:19 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Wed, 1 Aug 2001 06:19:39 +0000 (06:19 +0000)
* 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

gcc/ChangeLog
gcc/cpphash.h
gcc/cpplex.c
gcc/cpplib.h
gcc/cppmacro.c

index f392c820daa9d436f3fcf6c03617774716744e58..857a75db7d570791b2aafae523161c6aa034dfc9 100644 (file)
@@ -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.
index 82746b5e24cdc88783892cbab0720f7c684c8a79..12b64a80afa8d102be8e5262e538f1bd8bc8f4d6 100644 (file)
@@ -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;
index 5248a422f458aa6329d0883db0a30d68e80b59de..5970442c073a8b320a6083ebbab0e8411f907a0d 100644 (file)
@@ -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.
index 58e4af60316047a5d1b1785f2f2bc3dd148737e2..fb7fac276db6c68df1e5ddf0b0079f9598f509df 100644 (file)
@@ -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 */
 
index a4569a3e0733e750d3836995d0a8f2d3b639346a..f8b3a2b0f90cbb46cad84376d0f1d55457decb34 100644 (file)
@@ -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;