This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Move -include into the front end


This patch moves -include into the combined C front end.  It's not as
clean as I'd like, but I'm going to wait until the remaining switches
are also transferred before attending to that.

Bootstrapped and regtested x86 Linux.

Neil.

	* Makefile.in: Update.
	* c-common.h (fe_file_change, pp_file_change): New.
	* c-lex.c (init_c_lex): Don't set cb_file_change.
	(c_common_parse_file): Move to c-opts.c.
	(cb_file_change): Rename fe_file_change.
	* c-opts.c: Include debug.h.
	(warn_unused_macros, include_cursor): New.
	(push_command_line_include, cb_file_change): New.
	(COMMAND_LINE_OPTIONS): Handle -include.
	(c_common_decode_option): Use local warn_unused_macros.
	Handle OPT_include.
	(c_common_post_options): Set file change callback.
	(handle_deferred_opts): Skip -include.  Don't free the array.
	(c_common_init): Call cpp_finish_options here, and push an
	initial -include file.
	* c-ppoutput.c (cb_file_change): Rename pp_file_change.
	(preprocess_file): Don't call cpp_finish_options.
	(init_pp_output): Don't set the file change callback.
	(pp_file_change): Return if no line commands or no output.
	* cpphash.h (next_include_file, first_unused_line): Remove.
	* cppinit.c (include_head, include_tail): Remove.
	(cpp_destroy): Don't free -include chain.
	(cpp_finish_options): Don't handle -include, or worry about
	-Wunused-macros.
	(_cpp_maybe_push_include_file): Remove.
	(COMMAND_LINE_OPTIONS, cpp_handle_option): Don't handle -include.
	* cpplib.c (_cpp_pop_buffer): Don't handle -include.
	* cppmacro.c (_cpp_warn_if_unused_macro, _cpp_create_definition):
	Used flag is set based upon the state of the warn_unused_macros
	flag, and so use of first_unused_line is unnecessary.

============================================================
Index: gcc/Makefile.in
--- gcc/Makefile.in	13 Mar 2003 20:19:02 -0000	1.1018
+++ gcc/Makefile.in	14 Mar 2003 06:59:49 -0000
@@ -1308,9 +1308,9 @@ c-common.o : c-common.c $(CONFIG_H) $(SY
 c-pretty-print.o : c-pretty-print.c c-pretty-print.h pretty-print.h \
 	$(C_COMMON_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) real.h
 
-c-opts.o : c-opts.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(C_COMMON_H) \
+c-opts.o : c-opts.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
         c-pragma.h flags.h toplev.h langhooks.h tree-inline.h diagnostic.h \
-	intl.h
+	intl.h debug.h $(C_COMMON_H)
 
 c-cppbuiltin.o : c-cppbuiltin.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
 	$(TREE_H) $(C_COMMON_H) c-pragma.h flags.h toplev.h langhooks.h \
============================================================
Index: gcc/c-common.h
--- gcc/c-common.h	11 Mar 2003 06:42:18 -0000	1.171
+++ gcc/c-common.h	14 Mar 2003 06:59:50 -0000
@@ -1,6 +1,6 @@
 /* Definitions for c-common.c.
    Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998,
-   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -1295,9 +1295,11 @@ extern void c_common_write_pch			PARAMS 
 extern void builtin_define_with_value		PARAMS ((const char *,
 							 const char *, int));
 extern void c_stddef_cpp_builtins		PARAMS ((void));
+extern void fe_file_change		PARAMS ((const struct line_map *));
 
 /* In c-ppoutput.c  */
 extern void init_pp_output			PARAMS ((FILE *));
 extern void preprocess_file			PARAMS ((cpp_reader *));
+extern void pp_file_change		PARAMS ((const struct line_map *));
 
 #endif /* ! GCC_C_COMMON_H */
============================================================
Index: gcc/c-lex.c
--- gcc/c-lex.c	6 Mar 2003 23:12:29 -0000	1.197
+++ gcc/c-lex.c	14 Mar 2003 06:59:50 -0000
@@ -86,7 +86,6 @@ static int dump_one_header	PARAMS ((spla
 static void cb_line_change     PARAMS ((cpp_reader *, const cpp_token *, int));
 static void cb_ident		PARAMS ((cpp_reader *, unsigned int,
 					 const cpp_string *));
-static void cb_file_change    PARAMS ((cpp_reader *, const struct line_map *));
 static void cb_def_pragma	PARAMS ((cpp_reader *, unsigned int));
 static void cb_define		PARAMS ((cpp_reader *, unsigned int,
 					 cpp_hashnode *));
@@ -116,7 +115,6 @@ init_c_lex ()
   cb->register_builtins = cb_register_builtins;
   cb->line_change = cb_line_change;
   cb->ident = cb_ident;
-  cb->file_change = cb_file_change;
   cb->def_pragma = cb_def_pragma;
   cb->valid_pch = c_common_valid_pch;
   cb->read_pch = c_common_read_pch;
@@ -131,30 +129,6 @@ init_c_lex ()
     }
 }
 
-/* A thin wrapper around the real parser that initializes the 
-   integrated preprocessor after debug output has been initialized.
-   Also, make sure the start_source_file debug hook gets called for
-   the primary source file.  */
-
-void
-c_common_parse_file (set_yydebug)
-     int set_yydebug ATTRIBUTE_UNUSED;
-{
-#if YYDEBUG != 0
-  yydebug = set_yydebug;
-#else
-  warning ("YYDEBUG not defined");
-#endif
-
-  (*debug_hooks->start_source_file) (lineno, input_filename);
-  cpp_finish_options (parse_in);
-
-  pch_init();
-  
-  yyparse ();
-  free_parser_stacks ();
-}
-
 struct c_fileinfo *
 get_fileinfo (name)
      const char *name;
@@ -245,9 +219,8 @@ cb_line_change (pfile, token, parsing_ar
   src_lineno = SOURCE_LINE (map, token->line);
 }
 
-static void
-cb_file_change (pfile, new_map)
-     cpp_reader *pfile ATTRIBUTE_UNUSED;
+void
+fe_file_change (new_map)
      const struct line_map *new_map;
 {
   unsigned int to_line = SOURCE_LINE (new_map, new_map->to_line);
============================================================
Index: gcc/c-opts.c
--- gcc/c-opts.c	10 Mar 2003 20:02:27 -0000	1.35
+++ gcc/c-opts.c	14 Mar 2003 06:59:51 -0000
@@ -34,6 +34,7 @@ Software Foundation, 59 Temple Place - S
 #include "intl.h"
 #include "cppdefault.h"
 #include "c-incpath.h"
+#include "debug.h"		/* For debug_hooks.  */
 
 #ifndef TARGET_SYSTEM_ROOT
 # define TARGET_SYSTEM_ROOT NULL
@@ -78,9 +79,15 @@ static bool std_cxx_inc = true;
 /* If the quote chain has been split by -I-.  */
 static bool quote_chain_split;
 
+/* If -Wunused-macros.  */
+static bool warn_unused_macros;
+
 /* Number of deferred options, deferred options array size.  */
 static size_t deferred_count, deferred_size;
 
+/* Number of deferred options scanned for -include.  */
+static size_t include_cursor;
+
 static void missing_arg PARAMS ((size_t));
 static size_t find_opt PARAMS ((const char *, int));
 static void set_Wimplicit PARAMS ((int));
@@ -95,6 +102,8 @@ static void check_deps_environment_vars 
 static void handle_deferred_opts PARAMS ((void));
 static void sanitize_cpp_opts PARAMS ((void));
 static void add_prefixed_path PARAMS ((const char *, size_t));
+static void push_command_line_include PARAMS ((void));
+static void cb_file_change PARAMS ((cpp_reader *, const struct line_map *));
 
 #ifndef STDC_0_IN_SYSTEM_HEADERS
 #define STDC_0_IN_SYSTEM_HEADERS 0
@@ -288,6 +297,7 @@ static void add_prefixed_path PARAMS ((c
   OPT("fxref",			CL_CXX,   OPT_fxref)			     \
   OPT("gen-decls",		CL_OBJC,  OPT_gen_decls)		     \
   OPT("idirafter",              CL_ALL | CL_ARG, OPT_idirafter)              \
+  OPT("include",                CL_ALL | CL_ARG, OPT_include)		     \
   OPT("iprefix",		CL_ALL | CL_ARG, OPT_iprefix)		     \
   OPT("isysroot",               CL_ALL | CL_ARG, OPT_isysroot)               \
   OPT("isystem",                CL_ALL | CL_ARG, OPT_isystem)                \
@@ -1040,7 +1050,7 @@ c_common_decode_option (argc, argv)
       break;
 
     case OPT_Wunused_macros:
-      cpp_opts->warn_unused_macros = on;
+      warn_unused_macros = on;
       break;
 
     case OPT_Wwrite_strings:
@@ -1323,6 +1333,10 @@ c_common_decode_option (argc, argv)
       add_path (xstrdup (arg), AFTER, 0);
       break;
 
+    case OPT_include:
+      defer_opt (code, arg);
+      break;
+
     case OPT_iprefix:
       iprefix = arg;
       break;
@@ -1521,6 +1535,8 @@ c_common_post_options (pfilename)
       lineno = 0;
     }
 
+  cpp_get_callbacks (parse_in)->file_change = cb_file_change;
+
   /* NOTE: we use in_fname here, not the one supplied.  */
   *pfilename = cpp_read_main_file (parse_in, in_fname, ident_hash);
 
@@ -1550,8 +1566,9 @@ c_common_init ()
 
   if (flag_preprocess_only)
     {
-      if (main_input_filename)
-	preprocess_file (parse_in);
+      cpp_finish_options (parse_in);
+      push_command_line_include ();
+      preprocess_file (parse_in);
       return false;
     }
 
@@ -1561,6 +1578,28 @@ c_common_init ()
   return true;
 }
 
+/* A thin wrapper around the real parser that initializes the 
+   integrated preprocessor after debug output has been initialized.
+   Also, make sure the start_source_file debug hook gets called for
+   the primary source file.  */
+void
+c_common_parse_file (set_yydebug)
+     int set_yydebug ATTRIBUTE_UNUSED;
+{
+#if YYDEBUG != 0
+  yydebug = set_yydebug;
+#else
+  warning ("YYDEBUG not defined");
+#endif
+
+  (*debug_hooks->start_source_file) (lineno, input_filename);
+  cpp_finish_options (parse_in);
+  push_command_line_include ();
+  pch_init();
+  yyparse ();
+  free_parser_stacks ();
+}
+
 /* Common finish hook for the C, ObjC and C++ front ends.  */
 void
 c_common_finish ()
@@ -1654,12 +1693,13 @@ handle_deferred_opts ()
 	  cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
 	  break;
 
+	case OPT_include:
+	  break;
+
 	default:
 	  abort ();
 	}
     }
-
-  free (deferred_opts);
 }
 
 /* These settings are appropriate for GCC, but not necessarily so for
@@ -1715,6 +1755,46 @@ add_prefixed_path (suffix, chain)
   path[prefix_len + suffix_len] = '\0';
 
   add_path (path, chain, 0);
+}
+
+/* Give CPP the next file given by -include, if any.  */
+static void
+push_command_line_include ()
+{
+  if (cpp_opts->preprocessed)
+    return;
+    
+  while (include_cursor < deferred_count)
+    {
+      struct deferred_opt *opt = &deferred_opts[include_cursor++];
+      
+      if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
+	return;
+    }
+
+  if (include_cursor == deferred_count)
+    {
+      /* Restore the line map from <command line>.  */
+      cpp_rename_file (parse_in, main_input_filename);
+      /* -Wunused-macros should only warn about macros defined hereafter.  */
+      cpp_opts->warn_unused_macros = warn_unused_macros;
+      include_cursor++;
+    }
+}
+
+/* File change callback.  Has to handle -include files.  */
+static void
+cb_file_change (pfile, new_map)
+     cpp_reader *pfile ATTRIBUTE_UNUSED;
+     const struct line_map *new_map;
+{
+  if (flag_preprocess_only)
+    pp_file_change (new_map);
+  else
+    fe_file_change (new_map);
+
+  if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
+    push_command_line_include ();
 }
 
 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
============================================================
Index: gcc/c-ppoutput.c
--- gcc/c-ppoutput.c	6 Mar 2003 23:12:30 -0000	1.2
+++ gcc/c-ppoutput.c	14 Mar 2003 06:59:51 -0000
@@ -58,7 +58,6 @@ static void cb_include	PARAMS ((cpp_read
 				 const unsigned char *, const cpp_token *));
 static void cb_ident	  PARAMS ((cpp_reader *, unsigned int,
 				   const cpp_string *));
-static void cb_file_change PARAMS ((cpp_reader *, const struct line_map *));
 static void cb_def_pragma PARAMS ((cpp_reader *, unsigned int));
 
 /* Preprocess and output.  */
@@ -66,8 +65,6 @@ void
 preprocess_file (pfile)
      cpp_reader *pfile;
 {
-  cpp_finish_options (pfile);
-
   /* A successful cpp_read_main_file guarantees that we can call
      cpp_scan_nooutput or cpp_get_token next.  */
   if (flag_no_output)
@@ -110,8 +107,6 @@ init_pp_output (out_stream)
 	  cb->ident      = cb_ident;
 	  cb->def_pragma = cb_def_pragma;
 	}
-      if (!flag_no_line_commands)
-	cb->file_change = cb_file_change;
     }
 
   if (flag_dump_includes)
@@ -368,18 +363,20 @@ cb_include (pfile, line, dir, header)
    described in MAP.  From this point on, the old print.map might be
    pointing to freed memory, and so must not be dereferenced.  */
 
-static void
-cb_file_change (pfile, map)
-     cpp_reader *pfile;
+void
+pp_file_change (map)
      const struct line_map *map;
 {
   const char *flags = "";
 
+  if (flag_no_line_commands || flag_no_output)
+    return;
+
   /* First time?  */
   if (print.map == NULL)
     {
       /* Avoid printing foo.i when the main file is foo.c.  */
-      if (!CPP_OPTION (pfile, preprocessed))
+      if (!cpp_get_options (parse_in)->preprocessed)
 	print_line (map, map->from_line, flags);
     }
   else
============================================================
Index: gcc/cpphash.h
--- gcc/cpphash.h	6 Mar 2003 23:12:30 -0000	1.179
+++ gcc/cpphash.h	14 Mar 2003 06:59:51 -0000
@@ -332,11 +332,6 @@ struct cpp_reader
   /* If in_directive, the directive if known.  */
   const struct directive *directive;
 
-  /* The next -include-d file; NULL if they all are done.  If it
-     points to NULL, the last one is in progress, and
-     _cpp_maybe_push_include_file has yet to restore the line map.  */
-  struct pending_option **next_include_file;
-
   /* Search paths for include files.  */
   struct cpp_path *quote_include;	/* "" */
   struct cpp_path *bracket_include;	/* <> */
@@ -367,9 +362,6 @@ struct cpp_reader
   /* Current maximum length of directory names in the search path
      for include files.  (Altered as we get more of them.)  */
   unsigned int max_include_len;
-
-  /* Macros on or after this line are warned about if unused.  */
-  unsigned int first_unused_line;
 
   /* Date and time text.  Calculated together if either is requested.  */
   const uchar *date;
============================================================
Index: gcc/cppinit.c
--- gcc/cppinit.c	12 Mar 2003 21:31:48 -0000	1.271
+++ gcc/cppinit.c	14 Mar 2003 06:59:51 -0000
@@ -48,7 +48,6 @@ struct cpp_pending
 {
   struct pending_option *directive_head, *directive_tail;
   struct pending_option *imacros_head, *imacros_tail;
-  struct pending_option *include_head, *include_tail;
 };
 
 #ifdef __STDC__
@@ -278,7 +277,6 @@ cpp_destroy (pfile)
   cpp_context *context, *contextn;
   tokenrun *run, *runn;
 
-  free_chain (CPP_OPTION (pfile, pending)->include_head);
   free (CPP_OPTION (pfile, pending));
   free (pfile->op_stack);
 
@@ -603,8 +601,6 @@ cpp_finish_options (pfile)
     {
       struct pending_option *p;
 
-      /* Prevent -Wunused-macros with command-line redefinitions.  */
-      pfile->first_unused_line = (unsigned int) -1;
       _cpp_do_file_change (pfile, LC_RENAME, _("<built-in>"), 1, 0);
       init_builtins (pfile);
       _cpp_do_file_change (pfile, LC_RENAME, _("<command line>"), 1, 0);
@@ -617,42 +613,12 @@ cpp_finish_options (pfile)
       for (p = CPP_OPTION (pfile, pending)->imacros_head; p; p = p->next)
 	if (cpp_push_include (pfile, p->arg))
 	  cpp_scan_nooutput (pfile);
-
-      pfile->next_include_file = &CPP_OPTION (pfile, pending)->include_head;
-      _cpp_maybe_push_include_file (pfile);
     }
 
-  pfile->first_unused_line = pfile->line;
-
   free_chain (CPP_OPTION (pfile, pending)->imacros_head);
   free_chain (CPP_OPTION (pfile, pending)->directive_head);
 }
 
-/* Push the next buffer on the stack given by -include, if any.  */
-void
-_cpp_maybe_push_include_file (pfile)
-     cpp_reader *pfile;
-{
-  if (pfile->next_include_file)
-    {
-      struct pending_option *head = *pfile->next_include_file;
-
-      while (head && !cpp_push_include (pfile, head->arg))
-	head = head->next;
-
-      if (head)
-	pfile->next_include_file = &head->next;
-      else
-	{
-	  /* All done; restore the line map from <command line>.  */
-	  _cpp_do_file_change (pfile, LC_RENAME,
-			       pfile->line_maps.maps[0].to_file, 1, 0);
-	  /* Don't come back here again.  */
-	  pfile->next_include_file = NULL;
-	}
-    }
-}
-
 /* This is called at the end of preprocessing.  It pops the last
    buffer and writes dependency output, and returns the number of
    errors.
@@ -723,7 +689,7 @@ new_pending_directive (pend, text, handl
   DEF_OPT("D",                        no_mac, OPT_D)                          \
   DEF_OPT("U",                        no_mac, OPT_U)                          \
   DEF_OPT("imacros",                  no_fil, OPT_imacros)                    \
-  DEF_OPT("include",                  no_fil, OPT_include)
+
 
 #define DEF_OPT(text, msg, code) code,
 enum opt_code
@@ -887,7 +853,6 @@ cpp_handle_option (pfile, argc, argv)
 	case OPT_U:
 	  new_pending_directive (pend, arg, cpp_undef);
 	  break;
-	case OPT_include:
 	case OPT_imacros:
 	  {
 	    struct pending_option *o = (struct pending_option *)
@@ -895,10 +860,7 @@ cpp_handle_option (pfile, argc, argv)
 	    o->arg = arg;
 	    o->next = NULL;
 
-	    if (opt_code == OPT_include)
-	      APPEND (pend, include, o);
-	    else
-	      APPEND (pend, imacros, o);
+	    APPEND (pend, imacros, o);
 	  }
 	  break;
 	}
============================================================
Index: gcc/cpplib.c
--- gcc/cpplib.c	21 Feb 2003 18:06:26 -0000	1.331
+++ gcc/cpplib.c	14 Mar 2003 06:59:52 -0000
@@ -1,6 +1,6 @@
 /* CPP Library. (Directive handling.)
    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    Contributed by Per Bothner, 1994-95.
    Based on CCCP program by Paul Rubin, June 1986
    Adapted to ANSI C, Richard Stallman, Jan 1987
@@ -2072,14 +2072,7 @@ _cpp_pop_buffer (pfile)
 
       /* Don't generate a callback for popping the main file.  */
       if (pfile->buffer)
-	{
-	  _cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0);
-
-	  /* If this is the main file, there may be some -include
-	     files left to push.  */
-	  if (!pfile->buffer->prev)
-	    _cpp_maybe_push_include_file (pfile);
-	}
+	_cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0);
     }
 }
 
============================================================
Index: gcc/cppmacro.c
--- gcc/cppmacro.c	21 Feb 2003 18:06:29 -0000	1.128
+++ gcc/cppmacro.c	14 Mar 2003 06:59:52 -0000
@@ -1,6 +1,6 @@
 /* Part of CPP library.  (Macro and #define handling.)
    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998,
-   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    Written by Per Bothner, 1994.
    Based on CCCP program by Paul Rubin, June 1986
    Adapted to ANSI C, Richard Stallman, Jan 1987
@@ -89,8 +89,6 @@ _cpp_warn_if_unused_macro (pfile, node, 
       cpp_macro *macro = node->value.macro;
 
       if (!macro->used
-	  /* Skip front-end built-ins and command line macros.  */
-	  && macro->line >= pfile->first_unused_line
 	  && MAIN_FILE_P (lookup_line (&pfile->line_maps, macro->line)))
 	cpp_error_with_line (pfile, DL_WARNING, macro->line, 0,
 			     "macro \"%s\" is not used", NODE_NAME (node));
@@ -1568,7 +1566,7 @@ _cpp_create_definition (pfile, node)
   macro->params = 0;
   macro->paramc = 0;
   macro->variadic = 0;
-  macro->used = 0;
+  macro->used = !CPP_OPTION (pfile, warn_unused_macros);
   macro->count = 0;
   macro->fun_like = 0;
   /* To suppress some diagnostics.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]