OSDN Git Service

* cpperror.c (print_containing_files): Moved to line-map.c.
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Aug 2001 21:07:41 +0000 (21:07 +0000)
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Aug 2001 21:07:41 +0000 (21:07 +0000)
(print_location): line-map.c handles re-listing or otherwise.
* cpphash.h (struct lexer_state): Remove next_bol.
(struct cpp_buffer): Remove include_stack_listed.
* cpplib.c (do_line, cpp_push_buffer, _cpp_pop_buffer):
Remove faked buffer handling.
(_cpp_do_file_change): Tweak.
* cpplib.h (enum cpp_buffer_type): Remove BUF_FAKE.
* cppmain.c (struct printer): Remove filename.
(print_line, cb_file_change): Update accordingly.
* line-map.c: Include intl.h.
(init_line_maps): Initialize last_listed.
(free_line_maps): Sanity check, warn if ENABLED_CHECKING.
(add_line_map): Sanity check inputs, warn if ENABLED_CHECKING.
(print_containing_files): New.
* line-map.h (struct line_maps): New member last_listed.
(print_containing_files, INCLUDED_FROM): New.
* Makefile.in: Update.
* po/POTFILES.in: Add line-map.c.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44670 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/Makefile.in
gcc/cpperror.c
gcc/cpphash.h
gcc/cpplib.c
gcc/cpplib.h
gcc/cppmain.c
gcc/line-map.c
gcc/line-map.h
gcc/po/POTFILES.in

index 485d769..b3cbf8b 100644 (file)
@@ -1,3 +1,25 @@
+2001-08-06  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+       * cpperror.c (print_containing_files): Moved to line-map.c.
+       (print_location): line-map.c handles re-listing or otherwise.
+       * cpphash.h (struct lexer_state): Remove next_bol.
+       (struct cpp_buffer): Remove include_stack_listed.
+       * cpplib.c (do_line, cpp_push_buffer, _cpp_pop_buffer):
+       Remove faked buffer handling.
+       (_cpp_do_file_change): Tweak.
+       * cpplib.h (enum cpp_buffer_type): Remove BUF_FAKE.
+       * cppmain.c (struct printer): Remove filename.
+       (print_line, cb_file_change): Update accordingly.
+       * line-map.c: Include intl.h.
+       (init_line_maps): Initialize last_listed.
+       (free_line_maps): Sanity check, warn if ENABLED_CHECKING.
+       (add_line_map): Sanity check inputs, warn if ENABLED_CHECKING.
+       (print_containing_files): New.
+       * line-map.h (struct line_maps): New member last_listed.
+       (print_containing_files, INCLUDED_FROM): New.
+       * Makefile.in: Update.
+       * po/POTFILES.in: Add line-map.c.
+
 2001-08-06  Richard Henderson  <rth@redhat.com>
 
        * except.c (convert_from_eh_region_ranges_1): Never mark
index 6db8ae1..eca0b96 100644 (file)
@@ -1325,7 +1325,7 @@ stringpool.o: stringpool.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(OBSTACK_H) \
 
 hashtable.o: hashtable.c hashtable.h $(CONFIG_H) $(SYSTEM_H) $(OBSTACK_H)
 
-line-map.o: line-map.c line-map.h $(CONFIG_H) $(SYSTEM_H)
+line-map.o: line-map.c line-map.h intl.h $(CONFIG_H) $(SYSTEM_H)
 
 ggc-none.o: ggc-none.c $(GCONFIG_H) $(SYSTEM_H) $(GGC_H)
        $(CC) -c $(ALL_CFLAGS) -DGENERATOR_FILE $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION)
index 4ed4de6..167ea9d 100644 (file)
@@ -29,8 +29,6 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #include "cpphash.h"
 #include "intl.h"
 
-static void print_containing_files     PARAMS ((struct line_map *,
-                                                struct line_map *));
 static void print_location             PARAMS ((cpp_reader *,
                                                 const char *,
                                                 const cpp_lexer_pos *));
@@ -40,49 +38,6 @@ static void print_location           PARAMS ((cpp_reader *,
 #define v_message(msgid, ap) \
  do { vfprintf (stderr, _(msgid), ap); putc ('\n', stderr); } while (0)
 
-/* Print the file names and line numbers of the #include
-   commands which led to the current file.  */
-static void
-print_containing_files (map_array, map)
-     struct line_map *map_array;
-     struct line_map *map;
-{
-  int first = 1;
-
-  for (;;)
-    {
-      if (MAIN_FILE_P (map))
-       break;
-      map = &map_array[map->included_from];
-
-      if (first)
-       {
-         first = 0;
-         /* The current line in each outer source file is now the
-            same as the line of the #include.  */
-         fprintf (stderr,  _("In file included from %s:%u"),
-                  map->to_file, LAST_SOURCE_LINE (map));
-       }
-      else
-       /* Translators note: this message is used in conjunction
-          with "In file included from %s:%ld" and some other
-          tricks.  We want something like this:
-
-          | In file included from sys/select.h:123,
-          |                  from sys/types.h:234,
-          |                  from userfile.c:31:
-          | bits/select.h:45: <error message here>
-
-          with all the "from"s lined up.
-          The trailing comma is at the beginning of this message,
-          and the trailing colon is not translated.  */
-       fprintf (stderr, _(",\n                 from %s:%u"),
-                map->to_file, LAST_SOURCE_LINE (map));
-    }
-
-  fputs (":\n", stderr);
-}
-
 static void
 print_location (pfile, filename, pos)
      cpp_reader *pfile;
@@ -122,12 +77,7 @@ print_location (pfile, filename, pos)
          if (col == 0)
            col = 1;
 
-         /* Don't repeat the include stack unnecessarily.  */
-         if (buffer->prev && ! buffer->include_stack_listed)
-           {
-             buffer->include_stack_listed = 1;
-             print_containing_files (pfile->line_maps.maps, map);
-           }
+         print_containing_files (&pfile->line_maps, map);
        }
 
       if (filename == 0)
index 1ba4282..5409e07 100644 (file)
@@ -131,9 +131,6 @@ struct lexer_state
      all directives apart from #define.  */
   unsigned char save_comments;
 
-  /* If nonzero the next token is at the beginning of the line.  */
-  unsigned char next_bol;
-
   /* Nonzero if we're mid-comment.  */
   unsigned char lexing_comment;
 
@@ -219,10 +216,6 @@ struct cpp_buffer
   /* 1 = system header file, 2 = C system header file used for C++.  */
   unsigned char sysp;
 
-  /* Nonzero means we have printed (while error reporting) a list of
-     containing files that matches the current status.  */
-  unsigned char include_stack_listed;
-
   /* Nonzero means that the directory to start searching for ""
      include files has been calculated and stored in "dir" below.  */
   unsigned char search_cached;
index 0792f2b..4710beb 100644 (file)
@@ -736,12 +736,10 @@ do_line (pfile)
   cpp_get_token (pfile, &token);
   if (token.type == CPP_STRING)
     {
-      const char *fname = (const char *) token.val.str.text;
+      buffer->nominal_fname = (const char *) token.val.str.text;
 
       /* Only accept flags for the # 55 form.  */
-      if (! pfile->state.line_extension)
-       check_eol (pfile);
-      else
+      if (pfile->state.line_extension)
        {
          int flag = 0, sysp = 0;
 
@@ -749,6 +747,8 @@ do_line (pfile)
          if (flag == 1)
            {
              reason = LC_ENTER;
+             /* Fake an include for cpp_included ().  */
+             _cpp_fake_include (pfile, buffer->nominal_fname);
              flag = read_flag (pfile, flag);
            }
          else if (flag == 2)
@@ -761,43 +761,11 @@ do_line (pfile)
              sysp = 1;
              flag = read_flag (pfile, flag);
              if (flag == 4)
-               sysp = 2, read_flag (pfile, flag);
-           }
-
-         if (reason == LC_ENTER)
-           {
-             /* Fake a buffer stack for diagnostics.  */
-             cpp_push_buffer (pfile, 0, 0, BUF_FAKE, fname, 0);
-             /* Fake an include for cpp_included.  */
-             _cpp_fake_include (pfile, fname);
-             buffer = pfile->buffer;
-           }
-         else if (reason == LC_LEAVE)
-           {
-             if (buffer->type != BUF_FAKE)
-               {
-                 cpp_warning (pfile, "file \"%s\" left but not entered",
-                              buffer->nominal_fname);
-                 reason = LC_RENAME;
-               }
-             else
-               {
-                 _cpp_pop_buffer (pfile);
-                 pfile->lexer_pos.output_line++;
-                 buffer = pfile->buffer;
-#ifdef ENABLE_CHECKING
-                 if (strcmp (buffer->nominal_fname, fname))
-                   cpp_warning (pfile, "expected to return to file \"%s\"",
-                                buffer->nominal_fname);
-                 if (buffer->sysp != sysp)
-                   cpp_warning (pfile, "header flags for \"%s\" have changed",
-                                buffer->nominal_fname);
-#endif
-               }
+               sysp = 2;
            }
          buffer->sysp = sysp;
        }
-      buffer->nominal_fname = fname;
+      check_eol (pfile);
     }
   else if (token.type != CPP_EOF)
     {
@@ -818,9 +786,8 @@ _cpp_do_file_change (pfile, reason, file_line)
      enum lc_reason reason;
      unsigned int file_line;
 {
-  cpp_buffer *buffer;
-
-  buffer = pfile->buffer;
+  cpp_buffer *buffer = pfile->buffer;
+  
   pfile->map = add_line_map (&pfile->line_maps, reason,
                             pfile->line, buffer->nominal_fname, file_line);
 
@@ -1785,36 +1752,27 @@ cpp_push_buffer (pfile, buffer, len, type, filename, return_at_eof)
 {
   cpp_buffer *new = xobnew (&pfile->buffer_ob, cpp_buffer);
 
-  if (type == BUF_FAKE)
-    {
-      /* A copy of the current buffer, just with a new name and type.  */
-      memcpy (new, pfile->buffer, sizeof (cpp_buffer));
-      new->type = BUF_FAKE;
-    }
-  else
-    {
-      if (type == BUF_BUILTIN)
-       filename = _("<builtin>");
-      else if (type == BUF_CL_OPTION)
-       filename = _("<command line>");
-      else if (type == BUF_PRAGMA)
-       filename = "<_Pragma>";
-
-      /* Clears, amongst other things, if_stack and mi_cmacro.  */
-      memset (new, 0, sizeof (cpp_buffer));
-
-      new->line_base = new->buf = new->cur = buffer;
-      new->rlimit = buffer + len;
-      new->sysp = 0;
-
-      /* No read ahead or extra char initially.  */
-      new->read_ahead = EOF;
-      new->extra_char = EOF;
-
-      /* Preprocessed files, builtins, _Pragma and command line
-        options don't do trigraph and escaped newline processing.  */
-      new->from_stage3 = type != BUF_FILE || CPP_OPTION (pfile, preprocessed);
-    }
+  if (type == BUF_BUILTIN)
+    filename = _("<builtin>");
+  else if (type == BUF_CL_OPTION)
+    filename = _("<command line>");
+  else if (type == BUF_PRAGMA)
+    filename = "<_Pragma>";
+
+  /* Clears, amongst other things, if_stack and mi_cmacro.  */
+  memset (new, 0, sizeof (cpp_buffer));
+
+  new->line_base = new->buf = new->cur = buffer;
+  new->rlimit = buffer + len;
+  new->sysp = 0;
+
+  /* No read ahead or extra char initially.  */
+  new->read_ahead = EOF;
+  new->extra_char = EOF;
+
+  /* Preprocessed files, builtins, _Pragma and command line
+     options don't do trigraph and escaped newline processing.  */
+  new->from_stage3 = type != BUF_FILE || CPP_OPTION (pfile, preprocessed);
 
   if (*filename == '\0')
     new->nominal_fname = _("<stdin>");
@@ -1823,10 +1781,8 @@ cpp_push_buffer (pfile, buffer, len, type, filename, return_at_eof)
   new->type = type;
   new->prev = pfile->buffer;
   new->pfile = pfile;
-  new->include_stack_listed = 0;
   new->return_at_eof = return_at_eof;
 
-  pfile->state.next_bol = 1;
   pfile->buffer_stack_depth++;
   pfile->buffer = new;
 
@@ -1840,49 +1796,26 @@ void
 _cpp_pop_buffer (pfile)
      cpp_reader *pfile;
 {
-  cpp_buffer *buffer;
+  cpp_buffer *buffer = pfile->buffer;
   struct if_stack *ifs;
 
-  for (;;)
-    {
-      buffer = pfile->buffer;
-      /* Walk back up the conditional stack till we reach its level at
-        entry to this file, issuing error messages.  */
-      for (ifs = buffer->if_stack; ifs; ifs = ifs->next)
-       cpp_error_with_line (pfile, ifs->pos.line, ifs->pos.col,
-                            "unterminated #%s", dtable[ifs->type].name);
-
-      if (buffer->type == BUF_FAKE)
-       {
-         buffer->prev->cur = buffer->cur;
-         buffer->prev->line_base = buffer->line_base;
-         buffer->prev->read_ahead = buffer->read_ahead;
-       }
-      else if (buffer->type == BUF_FILE)
-       _cpp_pop_file_buffer (pfile, buffer);
-
-      pfile->buffer = buffer->prev;
-      pfile->buffer_stack_depth--;
-
-      /* Callbacks only generated for faked or real files.  */
-      if (buffer->type != BUF_FILE && buffer->type != BUF_FAKE)
-       break;
-         
-      /* No callback for EOF of last file.  */
-      if (!pfile->buffer)
-       break;
+  /* Walk back up the conditional stack till we reach its level at
+     entry to this file, issuing error messages.  */
+  for (ifs = buffer->if_stack; ifs; ifs = ifs->next)
+    cpp_error_with_line (pfile, ifs->pos.line, ifs->pos.col,
+                        "unterminated #%s", dtable[ifs->type].name);
 
-      /* do_line does its own call backs.  */
-      pfile->buffer->include_stack_listed = 0;
-      if (pfile->directive == &dtable[T_LINE])
-       break;
+  /* Update the reader's buffer before _cpp_do_file_change.  */
+  pfile->buffer = buffer->prev;
+  pfile->buffer_stack_depth--;
 
-      _cpp_do_file_change (pfile, LC_LEAVE, pfile->buffer->return_to_line);
-      if (pfile->buffer->type == BUF_FILE)
-       break;
+  if (buffer->type == BUF_FILE)
+    {
+      /* Callbacks are not generated for popping the main file.  */
+      if (buffer->prev)
+       _cpp_do_file_change (pfile, LC_LEAVE, buffer->prev->return_to_line);
 
-      cpp_warning (pfile, "file \"%s\" entered but not left",
-                  buffer->nominal_fname);
+      _cpp_pop_file_buffer (pfile, buffer);
     }
 
   obstack_free (&pfile->buffer_ob, buffer);
index 937e604..29f20d7 100644 (file)
@@ -416,10 +416,9 @@ struct cpp_callbacks
 /* Name under which this program was invoked.  */
 extern const char *progname;
 
-/* Where does this buffer come from?  A faked include, a source file,
-   a builtin macro, a command-line option, or a _Pragma operator.  */
-enum cpp_buffer_type {BUF_FAKE, BUF_FILE, BUF_BUILTIN,
-                     BUF_CL_OPTION, BUF_PRAGMA};
+/* Where does this buffer come from?  A source file, a builtin macro,
+   a command-line option, or a _Pragma operator.  */
+enum cpp_buffer_type {BUF_FILE, BUF_BUILTIN, BUF_CL_OPTION, BUF_PRAGMA};
 
 /* The structure of a node in the hash table.  The hash table has
    entries for all identifiers: either macros defined by #define
index 86d245a..978c644 100644 (file)
@@ -31,7 +31,6 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 struct printer
 {
   FILE *outf;                  /* Stream to write to.  */
-  const char *filename;                /* Name of current file.  */
   const char *syshdr_flags;    /* System header flags, if any.  */
   unsigned int line;           /* Line currently being written.  */
   unsigned char printed;       /* Nonzero if something output at line.  */
@@ -81,8 +80,7 @@ main (argc, argv)
   
   do_preprocessing (argc, argv);
 
-  /* Call to cpp_destroy () omitted for performance reasons.  */
-  if (cpp_errors (pfile))
+  if (cpp_destroy (pfile))
     return FATAL_EXIT_CODE;
 
   return SUCCESS_EXIT_CODE;
@@ -328,7 +326,7 @@ print_line (line, special_flags)
   if (! options->no_line_commands)
     fprintf (print.outf, "# %u \"%s\"%s%s\n",
             SOURCE_LINE (print.map, print.line),
-            print.filename, special_flags, print.syshdr_flags);
+            print.map->to_file, special_flags, print.syshdr_flags);
 }
 
 /* Callbacks.  */
@@ -400,7 +398,6 @@ cb_file_change (pfile, fc)
     maybe_print_line (fc->line - 1);
 
   print.map = fc->map;
-  print.filename = fc->map->to_file;
   if (fc->externc)
     print.syshdr_flags = " 3 4";
   else if (fc->sysp)
index 27bcf2f..1cd1bfd 100644 (file)
@@ -23,6 +23,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #include "config.h"
 #include "system.h"
 #include "line-map.h"
+#include "intl.h"
 
 /* Initialize a line map set.  */
 
@@ -33,15 +34,27 @@ init_line_maps (set)
   set->maps = 0;
   set->allocated = 0;
   set->used = 0;
+  set->last_listed = -1;
 }
 
 /* Free a line map set.  */
 
-void free_line_maps (set)
+void
+free_line_maps (set)
      struct line_maps *set;
 {
   if (set->maps)
-    free (set->maps);
+    {
+#ifdef ENABLE_CHECKING
+      struct line_map *map;
+
+      for (map = CURRENT_LINE_MAP (set); ! MAIN_FILE_P (map);
+          map = INCLUDED_FROM (set, map))
+       fprintf (stderr, "line-map.c: file \"%s\" entered but not left\n",
+                map->to_file);
+#endif
+      free (set->maps);
+    }
 }
 
 /* Add a mapping of logical source line to physical source file and
@@ -76,18 +89,29 @@ add_line_map (set, reason, from_line, to_file, to_line)
   map->to_file = to_file;
   map->to_line = to_line;
 
+  /* If we don't keep our line maps consistent, we can easily
+     segfault.  Don't rely on the client to do it for us.  */
   if (set->used == 0)
-    map->included_from = -1;
-  else if (reason == LC_ENTER)
+    reason = LC_ENTER;
+  else if (reason == LC_LEAVE)
+    {
+      if (MAIN_FILE_P (map - 1)
+         || strcmp (INCLUDED_FROM (set, map - 1)->to_file, to_file))
+       {
+#ifdef ENABLE_CHECKING
+         fprintf (stderr, "line-map.c: file \"%s\" left but not entered\n",
+                  to_file);
+#endif
+         reason = LC_RENAME;
+       }
+    }
+
+  if (reason == LC_ENTER)
     map->included_from = set->used - 1;
   else if (reason == LC_RENAME)
     map->included_from = map[-1].included_from;
   else if (reason == LC_LEAVE)
-    {
-      if (map[-1].included_from < 0)
-       abort ();
-      map->included_from = set->maps[map[-1].included_from].included_from;
-    }
+    map->included_from = INCLUDED_FROM (set, map - 1)->included_from;
 
   set->used++;
   return map;
@@ -119,3 +143,43 @@ lookup_line (set, line)
 
   return &set->maps[mn];
 }
+
+/* Print the file names and line numbers of the #include commands
+   which led to the map MAP, if any, to stderr.  Nothing is output if
+   the most recently listed stack is the same as the current one.  */
+
+void
+print_containing_files (set, map)
+     struct line_maps *set;
+     struct line_map *map;
+{
+  if (MAIN_FILE_P (map) || set->last_listed == map->included_from)
+    return;
+
+  set->last_listed = map->included_from;
+  map = INCLUDED_FROM (set, map);
+
+  fprintf (stderr,  _("In file included from %s:%u"),
+          map->to_file, LAST_SOURCE_LINE (map));
+
+  while (! MAIN_FILE_P (map))
+    {
+      map = INCLUDED_FROM (set, map);
+      /* Translators note: this message is used in conjunction
+        with "In file included from %s:%ld" and some other
+        tricks.  We want something like this:
+
+        | In file included from sys/select.h:123,
+        |                  from sys/types.h:234,
+        |                  from userfile.c:31:
+        | bits/select.h:45: <error message here>
+
+        with all the "from"s lined up.
+        The trailing comma is at the beginning of this message,
+        and the trailing colon is not translated.  */
+      fprintf (stderr, _(",\n                 from %s:%u"),
+              map->to_file, LAST_SOURCE_LINE (map));
+    }
+
+  fputs (":\n", stderr);
+}
index bbc6caa..d5705c7 100644 (file)
@@ -42,6 +42,11 @@ struct line_maps
   struct line_map *maps;
   unsigned int allocated;
   unsigned int used;
+
+  /* The most recently listed include stack, if any, starts with
+     LAST_LISTED as the topmost including file.  -1 indicates nothing
+     has been listed yet.  */
+  int last_listed;
 };
 
 /* Reason for adding a line change with add_line_map ().  LC_ENTER is
@@ -74,6 +79,12 @@ extern struct line_map *add_line_map
 extern struct line_map *lookup_line
   PARAMS ((struct line_maps *, unsigned int));
 
+/* Print the file names and line numbers of the #include commands
+   which led to the map MAP, if any, to stderr.  Nothing is output if
+   the most recently listed stack is the same as the current one.  */
+extern void print_containing_files
+  PARAMS ((struct line_maps *, struct line_map *));
+
 /* Converts a map and logical line to source line.  */
 #define SOURCE_LINE(MAP, LINE) ((LINE) + (MAP)->to_line - (MAP)->from_line)
 
@@ -81,6 +92,9 @@ extern struct line_map *lookup_line
    of the #include, or other directive, that caused a map change.  */
 #define LAST_SOURCE_LINE(MAP) SOURCE_LINE ((MAP), (MAP)[1].from_line - 1)
 
+/* Returns the map a given map was included from.  */
+#define INCLUDED_FROM(SET, MAP) (&(SET)->maps[(MAP)->included_from])
+
 /* Non-zero if the map is at the bottom of the include stack.  */
 #define MAIN_FILE_P(MAP) ((MAP)->included_from < 0)
 
index f4acdba..67a5380 100644 (file)
@@ -941,6 +941,7 @@ lcm.c
 #libgcc2.h is part of the GCC library
 #limitx.h is part of the GCC library
 #limity.h is part of the GCC library
+line-map.c
 lists.c
 local-alloc.c
 #longlong.h is part of the GCC library