+2003-03-14 Neil Booth <neil@daikokuya.co.uk>
+
+ * 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.
+
Thu Mar 13 18:39:42 CET 2003 Jan Hubicka <jh@suse.cz>
* cselib.c (clear_table): Do not take argument; always clear just
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 \
/* 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.
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 */
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 *));
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;
}
}
-/* 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;
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);
#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
/* 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));
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
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) \
break;
case OPT_Wunused_macros:
- cpp_opts->warn_unused_macros = on;
+ warn_unused_macros = on;
break;
case OPT_Wwrite_strings:
add_path (xstrdup (arg), AFTER, 0);
break;
+ case OPT_include:
+ defer_opt (code, arg);
+ break;
+
case OPT_iprefix:
iprefix = arg;
break;
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);
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;
}
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 ()
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
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
extensions if ISO). There is no concept of gnu94. */
static void
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. */
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)
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)
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
/* 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; /* <> */
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;
const uchar *time;
{
struct pending_option *directive_head, *directive_tail;
struct pending_option *imacros_head, *imacros_tail;
- struct pending_option *include_head, *include_tail;
};
#ifdef __STDC__
cpp_context *context, *contextn;
tokenrun *run, *runn;
- free_chain (CPP_OPTION (pfile, pending)->include_head);
free (CPP_OPTION (pfile, pending));
free (pfile->op_stack);
{
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);
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.
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
case OPT_U:
new_pending_directive (pend, arg, cpp_undef);
break;
- case OPT_include:
case OPT_imacros:
{
struct pending_option *o = (struct pending_option *)
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;
}
/* 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
/* 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);
}
}
/* 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
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));
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. */