Commit 63973df3 by Neil Booth Committed by Neil Booth

Makefile.in: Update.

	* Makefile.in: Update.
	* c-common.c (flag_no_line_commands, flag_no_output,
	flag_dump_macros, flag_dump_includes): New.
	* c-common.h (flag_no_line_commands, flag_no_output,
	flag_dump_macros, flag_dump_includes, preprocess_file): New.
	(init_c_lex): Update prototype.
	* c-lex.c (init_c_lex): Update prototype; move some code to
	c_common_init.
	* c-opts.c (preprocess_file): Subsume into c_common_init.
	(c_common_decode_option): Update flags.
	(c_common_init): Move code from preprocess_file and init_c_lex.
	(sanitize_cpp_opts): Update.
	* c-ppoutput.c: New, cppmain.c almost verbatim.
	* cpphash.h (struct printer): Remove.
	(struct cpp_reader): Remove print.
	* cpplib.h (dump_none, dump_only, dump_names, dump_definitions,
	cpp_preprocess_file): Remove.
	(struct cpp_options): Remove no_output, no_line_commands, dump_macros
	and dump_includes.
	* cppmain.c: Remove.
	* doc/passes.texi: Update.

From-SVN: r63773
parent 95f3f59e
2003-03-04 Neil Booth <neil@daikokuya.co.uk>
* Makefile.in: Update.
* c-common.c (flag_no_line_commands, flag_no_output,
flag_dump_macros, flag_dump_includes): New.
* c-common.h (flag_no_line_commands, flag_no_output,
flag_dump_macros, flag_dump_includes, preprocess_file): New.
(init_c_lex): Update prototype.
* c-lex.c (init_c_lex): Update prototype; move some code to
c_common_init.
* c-opts.c (preprocess_file): Subsume into c_common_init.
(c_common_decode_option): Update flags.
(c_common_init): Move code from preprocess_file and init_c_lex.
(sanitize_cpp_opts): Update.
* c-ppoutput.c: New, cppmain.c almost verbatim.
* cpphash.h (struct printer): Remove.
(struct cpp_reader): Remove print.
* cpplib.h (dump_none, dump_only, dump_names, dump_definitions,
cpp_preprocess_file): Remove.
(struct cpp_options): Remove no_output, no_line_commands, dump_macros
and dump_includes.
* cppmain.c: Remove.
* doc/passes.texi: Update.
2003-03-04 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> 2003-03-04 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* function.c (STACK_ALIGNMENT_NEEDED): New macro. Default to 1. * function.c (STACK_ALIGNMENT_NEEDED): New macro. Default to 1.
......
...@@ -759,7 +759,7 @@ CXX_TARGET_OBJS=@cxx_target_objs@ ...@@ -759,7 +759,7 @@ CXX_TARGET_OBJS=@cxx_target_objs@
# Language-specific object files for C and Objective C. # Language-specific object files for C and Objective C.
C_AND_OBJC_OBJS = attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o \ C_AND_OBJC_OBJS = attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o \
c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o \ c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o \
c-incpath.o cppdefault.o \ c-incpath.o cppdefault.o c-ppoutput.o \
c-objc-common.o c-dump.o c-pch.o libcpp.a $(C_TARGET_OBJS) c-objc-common.o c-dump.o c-pch.o libcpp.a $(C_TARGET_OBJS)
# Language-specific object files for C. # Language-specific object files for C.
...@@ -1234,6 +1234,8 @@ c-lex.o : c-lex.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ ...@@ -1234,6 +1234,8 @@ c-lex.o : c-lex.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
$(RTL_H) debug.h $(C_TREE_H) c-common.h real.h c-incpath.h cppdefault.h \ $(RTL_H) debug.h $(C_TREE_H) c-common.h real.h c-incpath.h cppdefault.h \
c-pragma.h input.h intl.h flags.h toplev.h output.h \ c-pragma.h input.h intl.h flags.h toplev.h output.h \
mbchar.h $(CPPLIB_H) $(EXPR_H) $(TM_P_H) mbchar.h $(CPPLIB_H) $(EXPR_H) $(TM_P_H)
c-ppoutput.o : c-ppoutput.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
c-common.h $(TREE_H) $(CPPLIB_H) cpphash.h $(TM_P_H)
c-objc-common.o : c-objc-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ c-objc-common.o : c-objc-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
$(C_TREE_H) $(RTL_H) insn-config.h integrate.h $(EXPR_H) $(C_TREE_H) \ $(C_TREE_H) $(RTL_H) insn-config.h integrate.h $(EXPR_H) $(C_TREE_H) \
flags.h toplev.h tree-inline.h diagnostic.h integrate.h $(VARRAY_H) \ flags.h toplev.h tree-inline.h diagnostic.h integrate.h $(VARRAY_H) \
...@@ -2275,7 +2277,7 @@ PREPROCESSOR_DEFINES = \ ...@@ -2275,7 +2277,7 @@ PREPROCESSOR_DEFINES = \
@TARGET_SYSTEM_ROOT_DEFINE@ @TARGET_SYSTEM_ROOT_DEFINE@
LIBCPP_OBJS = cpplib.o cpplex.o cppmacro.o cppexp.o cppfiles.o cpptrad.o \ LIBCPP_OBJS = cpplib.o cpplex.o cppmacro.o cppexp.o cppfiles.o cpptrad.o \
cpphash.o cpperror.o cppinit.o cppmain.o \ cpphash.o cpperror.o cppinit.o \
hashtable.o line-map.o mkdeps.o prefix.o mbchar.o cpppch.o hashtable.o line-map.o mkdeps.o prefix.o mbchar.o cpppch.o
LIBCPP_DEPS = $(CPPLIB_H) cpphash.h line-map.h hashtable.h intl.h \ LIBCPP_DEPS = $(CPPLIB_H) cpphash.h line-map.h hashtable.h intl.h \
...@@ -2288,8 +2290,6 @@ libcpp.a: $(LIBCPP_OBJS) ...@@ -2288,8 +2290,6 @@ libcpp.a: $(LIBCPP_OBJS)
$(AR) $(AR_FLAGS) libcpp.a $(LIBCPP_OBJS) $(AR) $(AR_FLAGS) libcpp.a $(LIBCPP_OBJS)
-$(RANLIB) libcpp.a -$(RANLIB) libcpp.a
cppmain.o: cppmain.c $(LIBCPP_DEPS)
cpperror.o: cpperror.c $(LIBCPP_DEPS) cpperror.o: cpperror.c $(LIBCPP_DEPS)
cppexp.o: cppexp.c $(LIBCPP_DEPS) cppexp.o: cppexp.c $(LIBCPP_DEPS)
cpplex.o: cpplex.c $(LIBCPP_DEPS) mbchar.h cpplex.o: cpplex.c $(LIBCPP_DEPS) mbchar.h
......
...@@ -198,8 +198,26 @@ int allow_pch = 1; ...@@ -198,8 +198,26 @@ int allow_pch = 1;
/* Switches common to the C front ends. */ /* Switches common to the C front ends. */
/* Nonzero if prepreprocessing only. */ /* Nonzero if prepreprocessing only. */
int flag_preprocess_only; int flag_preprocess_only;
/* Nonzero means don't output line number information. */
char flag_no_line_commands;
/* Nonzero causes -E output not to be done, but directives such as
#define that have side effects are still obeyed. */
char flag_no_output;
/* Nonzero means dump macros in some fashion. */
char flag_dump_macros;
/* Nonzero means pass #include lines through to the output. */
char flag_dump_includes;
/* The file name to which we should write a precompiled header, or /* The file name to which we should write a precompiled header, or
NULL if no header will be written in this compile. */ NULL if no header will be written in this compile. */
......
...@@ -370,6 +370,24 @@ extern int allow_pch; ...@@ -370,6 +370,24 @@ extern int allow_pch;
extern int flag_preprocess_only; extern int flag_preprocess_only;
/* Nonzero means don't output line number information. */
extern char flag_no_line_commands;
/* Nonzero causes -E output not to be done, but directives such as
#define that have side effects are still obeyed. */
extern char flag_no_output;
/* Nonzero means dump macros in some fashion; contains the 'D', 'M' or
'N' of the command line switch. */
extern char flag_dump_macros;
/* Nonzero means pass #include lines through to the output. */
extern char flag_dump_includes;
/* The file name to which we should write a precompiled header, or /* The file name to which we should write a precompiled header, or
NULL if no header will be written in this compile. */ NULL if no header will be written in this compile. */
...@@ -1243,7 +1261,7 @@ extern int c_staticp PARAMS ((tree)); ...@@ -1243,7 +1261,7 @@ extern int c_staticp PARAMS ((tree));
extern int c_common_unsafe_for_reeval PARAMS ((tree)); extern int c_common_unsafe_for_reeval PARAMS ((tree));
extern const char *init_c_lex PARAMS ((const char *)); extern void init_c_lex PARAMS ((void));
extern void cb_register_builtins PARAMS ((cpp_reader *)); extern void cb_register_builtins PARAMS ((cpp_reader *));
...@@ -1274,5 +1292,8 @@ extern void c_common_read_pch PARAMS ((cpp_reader *pfile, ...@@ -1274,5 +1292,8 @@ extern void c_common_read_pch PARAMS ((cpp_reader *pfile,
int fd, int fd,
const char *orig)); const char *orig));
extern void c_common_write_pch PARAMS ((void)); extern void c_common_write_pch PARAMS ((void));
extern void preprocess_file PARAMS ((cpp_reader *,
const char *,
FILE *));
#endif /* ! GCC_C_COMMON_H */ #endif /* ! GCC_C_COMMON_H */
...@@ -93,9 +93,8 @@ static void cb_define PARAMS ((cpp_reader *, unsigned int, ...@@ -93,9 +93,8 @@ static void cb_define PARAMS ((cpp_reader *, unsigned int,
static void cb_undef PARAMS ((cpp_reader *, unsigned int, static void cb_undef PARAMS ((cpp_reader *, unsigned int,
cpp_hashnode *)); cpp_hashnode *));
const char * void
init_c_lex (filename) init_c_lex ()
const char *filename;
{ {
struct cpp_callbacks *cb; struct cpp_callbacks *cb;
struct c_fileinfo *toplevel; struct c_fileinfo *toplevel;
...@@ -135,11 +134,6 @@ init_c_lex (filename) ...@@ -135,11 +134,6 @@ init_c_lex (filename)
cb->define = cb_define; cb->define = cb_define;
cb->undef = cb_undef; cb->undef = cb_undef;
} }
/* Start it at 0. */
lineno = 0;
return cpp_read_main_file (parse_in, filename, ident_hash);
} }
/* A thin wrapper around the real parser that initializes the /* A thin wrapper around the real parser that initializes the
......
...@@ -90,7 +90,6 @@ static void set_std_cxx98 PARAMS ((int)); ...@@ -90,7 +90,6 @@ static void set_std_cxx98 PARAMS ((int));
static void set_std_c89 PARAMS ((int, int)); static void set_std_c89 PARAMS ((int, int));
static void set_std_c99 PARAMS ((int)); static void set_std_c99 PARAMS ((int));
static void check_deps_environment_vars PARAMS ((void)); static void check_deps_environment_vars PARAMS ((void));
static void preprocess_file PARAMS ((void));
static void handle_deferred_opts PARAMS ((void)); static void handle_deferred_opts PARAMS ((void));
static void sanitize_cpp_opts PARAMS ((void)); static void sanitize_cpp_opts PARAMS ((void));
static void add_prefixed_path PARAMS ((const char *, size_t)); static void add_prefixed_path PARAMS ((const char *, size_t));
...@@ -715,7 +714,7 @@ c_common_decode_option (argc, argv) ...@@ -715,7 +714,7 @@ c_common_decode_option (argc, argv)
depends on this. Preprocessed output does occur if -MD, -MMD depends on this. Preprocessed output does occur if -MD, -MMD
or environment var dependency generation is used. */ or environment var dependency generation is used. */
cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER); cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
cpp_opts->no_output = 1; flag_no_output = 1;
cpp_opts->inhibit_warnings = 1; cpp_opts->inhibit_warnings = 1;
break; break;
...@@ -747,7 +746,7 @@ c_common_decode_option (argc, argv) ...@@ -747,7 +746,7 @@ c_common_decode_option (argc, argv)
break; break;
case OPT_P: case OPT_P:
cpp_opts->no_line_commands = 1; flag_no_line_commands = 1;
break; break;
case OPT_Wabi: case OPT_Wabi:
...@@ -1500,24 +1499,6 @@ c_common_post_options () ...@@ -1500,24 +1499,6 @@ c_common_post_options ()
return flag_preprocess_only; return flag_preprocess_only;
} }
/* Preprocess the input file to out_stream. */
static void
preprocess_file ()
{
/* Open the output now. We must do so even if no_output is on,
because there may be other output than from the actual
preprocessing (e.g. from -dM). */
if (out_fname[0] == '\0')
out_stream = stdout;
else
out_stream = fopen (out_fname, "w");
if (out_stream == NULL)
fatal_io_error ("opening output file %s", out_fname);
else
cpp_preprocess_file (parse_in, in_fname, out_stream);
}
/* Front end initialization common to C, ObjC and C++. */ /* Front end initialization common to C, ObjC and C++. */
const char * const char *
c_common_init (filename) c_common_init (filename)
...@@ -1535,18 +1516,35 @@ c_common_init (filename) ...@@ -1535,18 +1516,35 @@ c_common_init (filename)
cpp_main_file. */ cpp_main_file. */
cpp_get_callbacks (parse_in)->register_builtins = cb_register_builtins; cpp_get_callbacks (parse_in)->register_builtins = cb_register_builtins;
/* NULL is passed up to toplev.c and we exit quickly. */
if (flag_preprocess_only) if (flag_preprocess_only)
{ {
preprocess_file (); /* Open the output now. We must do so even if flag_no_output is
on, because there may be other output than from the actual
preprocessing (e.g. from -dM). */
if (out_fname[0] == '\0')
out_stream = stdout;
else
out_stream = fopen (out_fname, "w");
if (out_stream == NULL)
fatal_io_error ("opening output file %s", out_fname);
else
/* Preprocess the input file to out_stream. */
preprocess_file (parse_in, in_fname, out_stream);
/* Exit quickly in toplev.c. */
return NULL; return NULL;
} }
/* Do this before initializing pragmas, as then cpplib's hash table init_c_lex ();
has been set up. NOTE: we are using our own file name here, not
the one supplied. */ /* Start it at 0. */
filename = init_c_lex (in_fname); lineno = 0;
/* NOTE: we use in_fname here, not the one supplied. */
filename = cpp_read_main_file (parse_in, in_fname, ident_hash);
/* Has to wait until now so that cpplib has its hash table. */
init_pragma (); init_pragma ();
return filename; return filename;
...@@ -1665,16 +1663,16 @@ sanitize_cpp_opts () ...@@ -1665,16 +1663,16 @@ sanitize_cpp_opts ()
/* -dM and dependencies suppress normal output; do it here so that /* -dM and dependencies suppress normal output; do it here so that
the last -d[MDN] switch overrides earlier ones. */ the last -d[MDN] switch overrides earlier ones. */
if (cpp_opts->dump_macros == dump_only) if (flag_dump_macros == 'M')
cpp_opts->no_output = 1; flag_no_output = 1;
/* Disable -dD, -dN and -dI if normal output is suppressed. Allow /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
-dM since at least glibc relies on -M -dM to work. */ -dM since at least glibc relies on -M -dM to work. */
if (cpp_opts->no_output) if (flag_no_output)
{ {
if (cpp_opts->dump_macros != dump_only) if (flag_dump_macros != 'M')
cpp_opts->dump_macros = dump_none; flag_dump_macros = 0;
cpp_opts->dump_includes = 0; flag_dump_includes = 0;
} }
cpp_opts->unsigned_char = !flag_signed_char; cpp_opts->unsigned_char = !flag_signed_char;
...@@ -1769,20 +1767,14 @@ handle_OPT_d (arg) ...@@ -1769,20 +1767,14 @@ handle_OPT_d (arg)
while ((c = *arg++) != '\0') while ((c = *arg++) != '\0')
switch (c) switch (c)
{ {
case 'M': case 'M': /* Dump macros only. */
cpp_opts->dump_macros = dump_only; case 'N': /* Dump names. */
break; case 'D': /* Dump definitions. */
flag_dump_macros = c;
case 'N':
cpp_opts->dump_macros = dump_names;
break;
case 'D':
cpp_opts->dump_macros = dump_definitions;
break; break;
case 'I': case 'I':
cpp_opts->dump_includes = 1; flag_dump_includes = 1;
break; break;
} }
} }
......
/* Preprocess only, using cpplib. /* Preprocess only, using cpplib.
Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002 Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc. Free Software Foundation, Inc.
Written by Per Bothner, 1994-95. Written by Per Bothner, 1994-95.
...@@ -15,11 +15,7 @@ GNU General Public License for more details. ...@@ -15,11 +15,7 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
what you give them. Help stamp out software-hoarding! */
#include "config.h" #include "config.h"
#include "system.h" #include "system.h"
...@@ -27,20 +23,32 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ...@@ -27,20 +23,32 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "tm.h" #include "tm.h"
#include "cpplib.h" #include "cpplib.h"
#include "cpphash.h" #include "cpphash.h"
#include "tree.h"
#include "c-common.h"
/* Encapsulates state used to convert a stream of tokens into a text
file. */
static struct
{
FILE *outf; /* Stream to write to. */
const struct line_map *map; /* Logical to physical line mappings. */
const cpp_token *prev; /* Previous token. */
const cpp_token *source; /* Source token for spacing. */
unsigned int line; /* Line currently being written. */
unsigned char printed; /* Nonzero if something output at line. */
} print;
static void setup_callbacks PARAMS ((cpp_reader *)); static void setup_callbacks PARAMS ((cpp_reader *));
/* General output routines. */ /* General output routines. */
static void scan_translation_unit PARAMS ((cpp_reader *)); static void scan_translation_unit PARAMS ((cpp_reader *));
static void scan_translation_unit_trad PARAMS ((cpp_reader *)); static void scan_translation_unit_trad PARAMS ((cpp_reader *));
static void account_for_newlines PARAMS ((cpp_reader *, const uchar *, static void account_for_newlines PARAMS ((const uchar *, size_t));
size_t));
static int dump_macro PARAMS ((cpp_reader *, cpp_hashnode *, void *)); static int dump_macro PARAMS ((cpp_reader *, cpp_hashnode *, void *));
static void print_line PARAMS ((cpp_reader *, const struct line_map *, static void print_line PARAMS ((const struct line_map *, unsigned int,
unsigned int, const char *)); const char *));
static void maybe_print_line PARAMS ((cpp_reader *, const struct line_map *, static void maybe_print_line PARAMS ((const struct line_map *, unsigned int));
unsigned int));
/* Callback routines for the parser. Most of these are active only /* Callback routines for the parser. Most of these are active only
in specific modes. */ in specific modes. */
...@@ -56,49 +64,48 @@ static void cb_def_pragma PARAMS ((cpp_reader *, unsigned int)); ...@@ -56,49 +64,48 @@ static void cb_def_pragma PARAMS ((cpp_reader *, unsigned int));
/* Preprocess and output. */ /* Preprocess and output. */
void void
cpp_preprocess_file (pfile, in_fname, out_stream) preprocess_file (pfile, in_fname, out_stream)
cpp_reader *pfile; cpp_reader *pfile;
const char *in_fname; const char *in_fname;
FILE *out_stream; FILE *out_stream;
{ {
/* Initialize the printer structure. Setting print.line to -1 here /* Initialize the print structure. Setting print.line to -1 here is
is a trick to guarantee that the first token of the file will a trick to guarantee that the first token of the file will cause
cause a linemarker to be output by maybe_print_line. */ a linemarker to be output by maybe_print_line. */
pfile->print.line = (unsigned int) -1; print.line = (unsigned int) -1;
pfile->print.printed = 0; print.printed = 0;
pfile->print.prev = 0; print.prev = 0;
pfile->print.map = 0; print.map = 0;
pfile->print.outf = out_stream; print.outf = out_stream;
setup_callbacks (pfile); setup_callbacks (pfile);
if (cpp_read_main_file (pfile, in_fname, NULL)) if (cpp_read_main_file (pfile, in_fname, NULL))
{ {
cpp_options *options = &pfile->opts;
cpp_finish_options (pfile); cpp_finish_options (pfile);
/* A successful cpp_read_main_file guarantees that we can call /* A successful cpp_read_main_file guarantees that we can call
cpp_scan_nooutput or cpp_get_token next. */ cpp_scan_nooutput or cpp_get_token next. */
if (options->no_output) if (flag_no_output)
{ {
/* Scan -included buffers, then the main file. */ /* Scan -included buffers, then the main file. */
while (pfile->buffer->prev) while (pfile->buffer->prev)
cpp_scan_nooutput (pfile); cpp_scan_nooutput (pfile);
cpp_scan_nooutput (pfile); cpp_scan_nooutput (pfile);
} }
else if (options->traditional) else if (cpp_get_options (pfile)->traditional)
scan_translation_unit_trad (pfile); scan_translation_unit_trad (pfile);
else else
scan_translation_unit (pfile); scan_translation_unit (pfile);
/* -dM command line option. Should this be in cpp_finish? */ /* -dM command line option. Should this be elsewhere? */
if (options->dump_macros == dump_only) if (flag_dump_macros == 'M')
cpp_forall_identifiers (pfile, dump_macro, NULL); cpp_forall_identifiers (pfile, dump_macro, NULL);
} }
/* Flush any pending output. */ /* Flush any pending output. */
if (pfile->print.printed) if (print.printed)
putc ('\n', pfile->print.outf); putc ('\n', print.outf);
} }
/* Set up the callbacks as appropriate. */ /* Set up the callbacks as appropriate. */
...@@ -109,7 +116,7 @@ setup_callbacks (pfile) ...@@ -109,7 +116,7 @@ setup_callbacks (pfile)
cpp_options *options = &pfile->opts; cpp_options *options = &pfile->opts;
cpp_callbacks *cb = cpp_get_callbacks (pfile); cpp_callbacks *cb = cpp_get_callbacks (pfile);
if (! options->no_output) if (!flag_no_output)
{ {
cb->line_change = cb_line_change; cb->line_change = cb_line_change;
/* Don't emit #pragma or #ident directives if we are processing /* Don't emit #pragma or #ident directives if we are processing
...@@ -119,15 +126,14 @@ setup_callbacks (pfile) ...@@ -119,15 +126,14 @@ setup_callbacks (pfile)
cb->ident = cb_ident; cb->ident = cb_ident;
cb->def_pragma = cb_def_pragma; cb->def_pragma = cb_def_pragma;
} }
if (! options->no_line_commands) if (!flag_no_line_commands)
cb->file_change = cb_file_change; cb->file_change = cb_file_change;
} }
if (options->dump_includes) if (flag_dump_includes)
cb->include = cb_include; cb->include = cb_include;
if (options->dump_macros == dump_names if (flag_dump_macros == 'N' || flag_dump_macros == 'D')
|| options->dump_macros == dump_definitions)
{ {
cb->define = cb_define; cb->define = cb_define;
cb->undef = cb_undef; cb->undef = cb_undef;
...@@ -142,7 +148,7 @@ scan_translation_unit (pfile) ...@@ -142,7 +148,7 @@ scan_translation_unit (pfile)
{ {
bool avoid_paste = false; bool avoid_paste = false;
pfile->print.source = NULL; print.source = NULL;
for (;;) for (;;)
{ {
const cpp_token *token = cpp_get_token (pfile); const cpp_token *token = cpp_get_token (pfile);
...@@ -150,10 +156,10 @@ scan_translation_unit (pfile) ...@@ -150,10 +156,10 @@ scan_translation_unit (pfile)
if (token->type == CPP_PADDING) if (token->type == CPP_PADDING)
{ {
avoid_paste = true; avoid_paste = true;
if (pfile->print.source == NULL if (print.source == NULL
|| (!(pfile->print.source->flags & PREV_WHITE) || (!(print.source->flags & PREV_WHITE)
&& token->val.source == NULL)) && token->val.source == NULL))
pfile->print.source = token->val.source; print.source = token->val.source;
continue; continue;
} }
...@@ -163,37 +169,36 @@ scan_translation_unit (pfile) ...@@ -163,37 +169,36 @@ scan_translation_unit (pfile)
/* Subtle logic to output a space if and only if necessary. */ /* Subtle logic to output a space if and only if necessary. */
if (avoid_paste) if (avoid_paste)
{ {
if (pfile->print.source == NULL) if (print.source == NULL)
pfile->print.source = token; print.source = token;
if (pfile->print.source->flags & PREV_WHITE if (print.source->flags & PREV_WHITE
|| (pfile->print.prev || (print.prev
&& cpp_avoid_paste (pfile, pfile->print.prev, token)) && cpp_avoid_paste (pfile, print.prev, token))
|| (pfile->print.prev == NULL && token->type == CPP_HASH)) || (print.prev == NULL && token->type == CPP_HASH))
putc (' ', pfile->print.outf); putc (' ', print.outf);
} }
else if (token->flags & PREV_WHITE) else if (token->flags & PREV_WHITE)
putc (' ', pfile->print.outf); putc (' ', print.outf);
avoid_paste = false; avoid_paste = false;
pfile->print.source = NULL; print.source = NULL;
pfile->print.prev = token; print.prev = token;
cpp_output_token (token, pfile->print.outf); cpp_output_token (token, print.outf);
if (token->type == CPP_COMMENT) if (token->type == CPP_COMMENT)
account_for_newlines (pfile, token->val.str.text, token->val.str.len); account_for_newlines (token->val.str.text, token->val.str.len);
} }
} }
/* Adjust pfile->print.line for newlines embedded in output. */ /* Adjust print.line for newlines embedded in output. */
static void static void
account_for_newlines (pfile, str, len) account_for_newlines (str, len)
cpp_reader *pfile;
const uchar *str; const uchar *str;
size_t len; size_t len;
{ {
while (len--) while (len--)
if (*str++ == '\n') if (*str++ == '\n')
pfile->print.line++; print.line++;
} }
/* Writes out a traditionally preprocessed file. */ /* Writes out a traditionally preprocessed file. */
...@@ -204,11 +209,11 @@ scan_translation_unit_trad (pfile) ...@@ -204,11 +209,11 @@ scan_translation_unit_trad (pfile)
while (_cpp_read_logical_line_trad (pfile)) while (_cpp_read_logical_line_trad (pfile))
{ {
size_t len = pfile->out.cur - pfile->out.base; size_t len = pfile->out.cur - pfile->out.base;
maybe_print_line (pfile, pfile->print.map, pfile->out.first_line); maybe_print_line (print.map, pfile->out.first_line);
fwrite (pfile->out.base, 1, len, pfile->print.outf); fwrite (pfile->out.base, 1, len, print.outf);
pfile->print.printed = 1; print.printed = 1;
if (!CPP_OPTION (pfile, discard_comments)) if (!CPP_OPTION (pfile, discard_comments))
account_for_newlines (pfile, pfile->out.base, len); account_for_newlines (pfile->out.base, len);
} }
} }
...@@ -216,47 +221,45 @@ scan_translation_unit_trad (pfile) ...@@ -216,47 +221,45 @@ scan_translation_unit_trad (pfile)
different line to the current one, output the required newlines or different line to the current one, output the required newlines or
a line marker, and return 1. Otherwise return 0. */ a line marker, and return 1. Otherwise return 0. */
static void static void
maybe_print_line (pfile, map, line) maybe_print_line (map, line)
cpp_reader *pfile;
const struct line_map *map; const struct line_map *map;
unsigned int line; unsigned int line;
{ {
/* End the previous line of text. */ /* End the previous line of text. */
if (pfile->print.printed) if (print.printed)
{ {
putc ('\n', pfile->print.outf); putc ('\n', print.outf);
pfile->print.line++; print.line++;
pfile->print.printed = 0; print.printed = 0;
} }
if (line >= pfile->print.line && line < pfile->print.line + 8) if (line >= print.line && line < print.line + 8)
{ {
while (line > pfile->print.line) while (line > print.line)
{ {
putc ('\n', pfile->print.outf); putc ('\n', print.outf);
pfile->print.line++; print.line++;
} }
} }
else else
print_line (pfile, map, line, ""); print_line (map, line, "");
} }
/* Output a line marker for logical line LINE. Special flags are "1" /* Output a line marker for logical line LINE. Special flags are "1"
or "2" indicating entering or leaving a file. */ or "2" indicating entering or leaving a file. */
static void static void
print_line (pfile, map, line, special_flags) print_line (map, line, special_flags)
cpp_reader *pfile;
const struct line_map *map; const struct line_map *map;
unsigned int line; unsigned int line;
const char *special_flags; const char *special_flags;
{ {
/* End any previous line of text. */ /* End any previous line of text. */
if (pfile->print.printed) if (print.printed)
putc ('\n', pfile->print.outf); putc ('\n', print.outf);
pfile->print.printed = 0; print.printed = 0;
pfile->print.line = line; print.line = line;
if (! CPP_OPTION (pfile, no_line_commands)) if (!flag_no_line_commands)
{ {
size_t to_file_len = strlen (map->to_file); size_t to_file_len = strlen (map->to_file);
unsigned char *to_file_quoted = alloca (to_file_len * 4 + 1); unsigned char *to_file_quoted = alloca (to_file_len * 4 + 1);
...@@ -267,16 +270,16 @@ print_line (pfile, map, line, special_flags) ...@@ -267,16 +270,16 @@ print_line (pfile, map, line, special_flags)
p = cpp_quote_string (to_file_quoted, p = cpp_quote_string (to_file_quoted,
(unsigned char *)map->to_file, to_file_len); (unsigned char *)map->to_file, to_file_len);
*p = '\0'; *p = '\0';
fprintf (pfile->print.outf, "# %u \"%s\"%s", fprintf (print.outf, "# %u \"%s\"%s",
SOURCE_LINE (map, pfile->print.line), SOURCE_LINE (map, print.line),
to_file_quoted, special_flags); to_file_quoted, special_flags);
if (map->sysp == 2) if (map->sysp == 2)
fputs (" 3 4", pfile->print.outf); fputs (" 3 4", print.outf);
else if (map->sysp == 1) else if (map->sysp == 1)
fputs (" 3", pfile->print.outf); fputs (" 3", print.outf);
putc ('\n', pfile->print.outf); putc ('\n', print.outf);
} }
} }
...@@ -291,9 +294,9 @@ cb_line_change (pfile, token, parsing_args) ...@@ -291,9 +294,9 @@ cb_line_change (pfile, token, parsing_args)
if (token->type == CPP_EOF || parsing_args) if (token->type == CPP_EOF || parsing_args)
return; return;
maybe_print_line (pfile, pfile->print.map, token->line); maybe_print_line (print.map, token->line);
pfile->print.prev = 0; print.prev = 0;
pfile->print.source = 0; print.source = 0;
/* Supply enough spaces to put this token in its original column, /* Supply enough spaces to put this token in its original column,
one space per column greater than 2, since scan_translation_unit one space per column greater than 2, since scan_translation_unit
...@@ -302,26 +305,26 @@ cb_line_change (pfile, token, parsing_args) ...@@ -302,26 +305,26 @@ cb_line_change (pfile, token, parsing_args)
ought to care. Some things do care; the fault lies with them. */ ought to care. Some things do care; the fault lies with them. */
if (!CPP_OPTION (pfile, traditional)) if (!CPP_OPTION (pfile, traditional))
{ {
pfile->print.printed = 1; print.printed = 1;
if (token->col > 2) if (token->col > 2)
{ {
unsigned int spaces = token->col - 2; unsigned int spaces = token->col - 2;
while (spaces--) while (spaces--)
putc (' ', pfile->print.outf); putc (' ', print.outf);
} }
} }
} }
static void static void
cb_ident (pfile, line, str) cb_ident (pfile, line, str)
cpp_reader *pfile; cpp_reader *pfile ATTRIBUTE_UNUSED;
unsigned int line; unsigned int line;
const cpp_string * str; const cpp_string * str;
{ {
maybe_print_line (pfile, pfile->print.map, line); maybe_print_line (print.map, line);
fprintf (pfile->print.outf, "#ident \"%s\"\n", str->text); fprintf (print.outf, "#ident \"%s\"\n", str->text);
pfile->print.line++; print.line++;
} }
static void static void
...@@ -330,29 +333,29 @@ cb_define (pfile, line, node) ...@@ -330,29 +333,29 @@ cb_define (pfile, line, node)
unsigned int line; unsigned int line;
cpp_hashnode *node; cpp_hashnode *node;
{ {
maybe_print_line (pfile, pfile->print.map, line); maybe_print_line (print.map, line);
fputs ("#define ", pfile->print.outf); fputs ("#define ", print.outf);
/* -dD command line option. */ /* 'D' is whole definition; 'N' is name only. */
if (CPP_OPTION (pfile, dump_macros) == dump_definitions) if (flag_dump_macros == 'D')
fputs ((const char *) cpp_macro_definition (pfile, node), fputs ((const char *) cpp_macro_definition (pfile, node),
pfile->print.outf); print.outf);
else else
fputs ((const char *) NODE_NAME (node), pfile->print.outf); fputs ((const char *) NODE_NAME (node), print.outf);
putc ('\n', pfile->print.outf); putc ('\n', print.outf);
pfile->print.line++; print.line++;
} }
static void static void
cb_undef (pfile, line, node) cb_undef (pfile, line, node)
cpp_reader *pfile; cpp_reader *pfile ATTRIBUTE_UNUSED;
unsigned int line; unsigned int line;
cpp_hashnode *node; cpp_hashnode *node;
{ {
maybe_print_line (pfile, pfile->print.map, line); maybe_print_line (print.map, line);
fprintf (pfile->print.outf, "#undef %s\n", NODE_NAME (node)); fprintf (print.outf, "#undef %s\n", NODE_NAME (node));
pfile->print.line++; print.line++;
} }
static void static void
...@@ -362,14 +365,14 @@ cb_include (pfile, line, dir, header) ...@@ -362,14 +365,14 @@ cb_include (pfile, line, dir, header)
const unsigned char *dir; const unsigned char *dir;
const cpp_token *header; const cpp_token *header;
{ {
maybe_print_line (pfile, pfile->print.map, line); maybe_print_line (print.map, line);
fprintf (pfile->print.outf, "#%s %s\n", dir, fprintf (print.outf, "#%s %s\n", dir,
cpp_token_as_text (pfile, header)); cpp_token_as_text (pfile, header));
pfile->print.line++; print.line++;
} }
/* The file name, line number or system header flags have changed, as /* The file name, line number or system header flags have changed, as
described in MAP. From this point on, the old pfile->print.map might be described in MAP. From this point on, the old print.map might be
pointing to freed memory, and so must not be dereferenced. */ pointing to freed memory, and so must not be dereferenced. */
static void static void
...@@ -380,26 +383,26 @@ cb_file_change (pfile, map) ...@@ -380,26 +383,26 @@ cb_file_change (pfile, map)
const char *flags = ""; const char *flags = "";
/* First time? */ /* First time? */
if (pfile->print.map == NULL) if (print.map == NULL)
{ {
/* Avoid printing foo.i when the main file is foo.c. */ /* Avoid printing foo.i when the main file is foo.c. */
if (!CPP_OPTION (pfile, preprocessed)) if (!CPP_OPTION (pfile, preprocessed))
print_line (pfile, map, map->from_line, flags); print_line (map, map->from_line, flags);
} }
else else
{ {
/* Bring current file to correct line when entering a new file. */ /* Bring current file to correct line when entering a new file. */
if (map->reason == LC_ENTER) if (map->reason == LC_ENTER)
maybe_print_line (pfile, map - 1, map->from_line - 1); maybe_print_line (map - 1, map->from_line - 1);
if (map->reason == LC_ENTER) if (map->reason == LC_ENTER)
flags = " 1"; flags = " 1";
else if (map->reason == LC_LEAVE) else if (map->reason == LC_LEAVE)
flags = " 2"; flags = " 2";
print_line (pfile, map, map->from_line, flags); print_line (map, map->from_line, flags);
} }
pfile->print.map = map; print.map = map;
} }
/* Copy a #pragma directive to the preprocessed output. */ /* Copy a #pragma directive to the preprocessed output. */
...@@ -408,10 +411,10 @@ cb_def_pragma (pfile, line) ...@@ -408,10 +411,10 @@ cb_def_pragma (pfile, line)
cpp_reader *pfile; cpp_reader *pfile;
unsigned int line; unsigned int line;
{ {
maybe_print_line (pfile, pfile->print.map, line); maybe_print_line (print.map, line);
fputs ("#pragma ", pfile->print.outf); fputs ("#pragma ", print.outf);
cpp_output_line (pfile, pfile->print.outf); cpp_output_line (pfile, print.outf);
pfile->print.line++; print.line++;
} }
/* Dump out the hash table. */ /* Dump out the hash table. */
...@@ -423,11 +426,11 @@ dump_macro (pfile, node, v) ...@@ -423,11 +426,11 @@ dump_macro (pfile, node, v)
{ {
if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN)) if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN))
{ {
fputs ("#define ", pfile->print.outf); fputs ("#define ", print.outf);
fputs ((const char *) cpp_macro_definition (pfile, node), fputs ((const char *) cpp_macro_definition (pfile, node),
pfile->print.outf); print.outf);
putc ('\n', pfile->print.outf); putc ('\n', print.outf);
pfile->print.line++; print.line++;
} }
return 1; return 1;
......
...@@ -240,18 +240,6 @@ struct spec_nodes ...@@ -240,18 +240,6 @@ struct spec_nodes
cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */ cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */
}; };
/* Encapsulates state used to convert a stream of tokens into a text
file. */
struct printer
{
FILE *outf; /* Stream to write to. */
const struct line_map *map; /* Logical to physical line mappings. */
const cpp_token *prev; /* Previous token. */
const cpp_token *source; /* Source token for spacing. */
unsigned int line; /* Line currently being written. */
unsigned char printed; /* Nonzero if something output at line. */
};
/* Represents the contents of a file cpplib has read in. */ /* Represents the contents of a file cpplib has read in. */
struct cpp_buffer struct cpp_buffer
{ {
...@@ -422,9 +410,6 @@ struct cpp_reader ...@@ -422,9 +410,6 @@ struct cpp_reader
preprocessor. */ preprocessor. */
struct spec_nodes spec_nodes; struct spec_nodes spec_nodes;
/* Used when doing preprocessed output. */
struct printer print;
/* Nonzero means don't look for #include "foo" the source-file /* Nonzero means don't look for #include "foo" the source-file
directory. */ directory. */
unsigned char quote_ignores_source_dir; unsigned char quote_ignores_source_dir;
......
...@@ -206,15 +206,6 @@ struct cpp_token ...@@ -206,15 +206,6 @@ struct cpp_token
typedef unsigned CPPCHAR_SIGNED_T cppchar_t; typedef unsigned CPPCHAR_SIGNED_T cppchar_t;
typedef CPPCHAR_SIGNED_T cppchar_signed_t; typedef CPPCHAR_SIGNED_T cppchar_signed_t;
/* Values for opts.dump_macros.
dump_only means inhibit output of the preprocessed text
and instead output the definitions of all user-defined
macros in a form suitable for use as input to cpp.
dump_names means pass #define and the macro name through to output.
dump_definitions means pass the whole definition (plus #define) through
*/
enum { dump_none = 0, dump_only, dump_names, dump_definitions };
/* This structure is nested inside struct cpp_reader, and /* This structure is nested inside struct cpp_reader, and
carries all the options visible to the command line. */ carries all the options visible to the command line. */
struct cpp_options struct cpp_options
...@@ -306,17 +297,10 @@ struct cpp_options ...@@ -306,17 +297,10 @@ struct cpp_options
/* Nonzero means turn warnings into errors. */ /* Nonzero means turn warnings into errors. */
unsigned char warnings_are_errors; unsigned char warnings_are_errors;
/* Nonzero causes output not to be done, but directives such as
#define that have side effects are still obeyed. */
unsigned char no_output;
/* Nonzero means we should look for header.gcc files that remap file /* Nonzero means we should look for header.gcc files that remap file
names. */ names. */
unsigned char remap; unsigned char remap;
/* Nonzero means don't output line number information. */
unsigned char no_line_commands;
/* Zero means dollar signs are punctuation. */ /* Zero means dollar signs are punctuation. */
unsigned char dollars_in_ident; unsigned char dollars_in_ident;
...@@ -339,12 +323,6 @@ struct cpp_options ...@@ -339,12 +323,6 @@ struct cpp_options
bother trying to do macro expansion and whatnot. */ bother trying to do macro expansion and whatnot. */
unsigned char preprocessed; unsigned char preprocessed;
/* Nonzero means dump macros in some fashion - see above. */
unsigned char dump_macros;
/* Nonzero means pass #include lines through to the output. */
unsigned char dump_includes;
/* Print column number in error messages. */ /* Print column number in error messages. */
unsigned char show_column; unsigned char show_column;
...@@ -753,9 +731,6 @@ extern void cpp_prepare_state PARAMS ((cpp_reader *, ...@@ -753,9 +731,6 @@ extern void cpp_prepare_state PARAMS ((cpp_reader *,
extern int cpp_read_state PARAMS ((cpp_reader *, const char *, FILE *, extern int cpp_read_state PARAMS ((cpp_reader *, const char *, FILE *,
struct save_macro_data *)); struct save_macro_data *));
/* In cppmain.c */
extern void cpp_preprocess_file PARAMS ((cpp_reader *, const char *, FILE *));
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -82,7 +82,8 @@ the other C-like languages: @file{c-common.c}, ...@@ -82,7 +82,8 @@ the other C-like languages: @file{c-common.c},
@file{c-pragma.c}, @file{c-pragma.c},
@file{c-semantics.c}, @file{c-semantics.c},
@file{c-lex.c}, @file{c-lex.c},
@file{c-incpath.c} @file{c-incpath.c},
@file{c-ppoutput.c},
@file{c-common.h}, @file{c-common.h},
@file{c-dump.h}, @file{c-dump.h},
@file{c-incpath.h} @file{c-incpath.h}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment