From 847e697a240e6d30335335c62084743978fa2084 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 17 Oct 2011 09:59:40 +0000 Subject: [PATCH] Support -fdebug-cpp option This patch adds -fdebug-cpp option. When used with -E this dumps the relevant macro map before every single token. This clutters the output a lot but has proved to be invaluable in tracking some bugs during the development of the virtual location support. Co-Authored-By: Dodji Seketeli From-SVN: r180084 --- gcc/ChangeLog | 7 ++++++ gcc/c-family/ChangeLog | 16 +++++++++++++ gcc/c-family/c-opts.c | 4 ++++ gcc/c-family/c-ppoutput.c | 57 ++++++++++++++++++++++++++++++++++++++--------- gcc/c-family/c.opt | 4 ++++ gcc/doc/cppopts.texi | 13 +++++++++++ gcc/doc/invoke.texi | 2 +- libcpp/ChangeLog | 7 ++++++ libcpp/include/cpplib.h | 4 ++++ libcpp/include/line-map.h | 4 ++++ libcpp/line-map.c | 38 +++++++++++++++++++++++++++++++ 11 files changed, 144 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed680173a1f..9021c977b37 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2011-10-15 Tom Tromey Dodji Seketeli + * doc/cppopts.texi: Document -fdebug-cpp. + * doc/invoke.texi: Add -fdebug-cpp to the list of preprocessor + options. + +2011-10-15 Tom Tromey + Dodji Seketeli + * gcc/diagnostic.h (diagnostic_report_current_module): Add a location parameter. * diagnostic.c (diagnostic_report_current_module): Add a location diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 789e4485622..117e7ddae7f 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,6 +1,22 @@ 2011-10-15 Tom Tromey Dodji Seketeli + * c.opt (fdebug-cpp): New option. + * c-opts.c (c_common_handle_option): Handle the option. + * c-ppoutput.c (maybe_print_line_1): New static function. Takes an + output stream in parameter. Factorized from ... + (maybe_print_line): ... this. Dump location debug information when + -fdebug-cpp is in effect. + (print_line_1): New static function. Takes an output stream in + parameter. Factorized from ... + (print_line): ... here. Dump location information when -fdebug-cpp + is in effect. + (scan_translation_unit): Dump location information when + -fdebug-cpp is in effect. + +2011-10-15 Tom Tromey + Dodji Seketeli + * c.opt (ftrack-macro-expansion): New option. Handle it with and without argument. * c-opts.c (c_common_handle_option)preprocessed = value; break; + case OPT_fdebug_cpp: + cpp_opts->debug = 1; + break; + case OPT_ftrack_macro_expansion: if (value) value = 2; diff --git a/gcc/c-family/c-ppoutput.c b/gcc/c-family/c-ppoutput.c index 892f1eaa346..df46ce4c1f5 100644 --- a/gcc/c-family/c-ppoutput.c +++ b/gcc/c-family/c-ppoutput.c @@ -59,7 +59,9 @@ static void account_for_newlines (const unsigned char *, size_t); static int dump_macro (cpp_reader *, cpp_hashnode *, void *); static void dump_queued_macros (cpp_reader *); +static void print_line_1 (source_location, const char*, FILE *); static void print_line (source_location, const char *); +static void maybe_print_line_1 (source_location, FILE *); static void maybe_print_line (source_location); static void do_line_change (cpp_reader *, const cpp_token *, source_location, int); @@ -243,7 +245,12 @@ scan_translation_unit (cpp_reader *pfile) in_pragma = false; } else - cpp_output_token (token, print.outf); + { + if (cpp_get_options (parse_in)->debug) + linemap_dump_location (line_table, token->src_loc, + print.outf); + cpp_output_token (token, print.outf); + } if (token->type == CPP_COMMENT) account_for_newlines (token->val.str.text, token->val.str.len); @@ -297,8 +304,9 @@ scan_translation_unit_trad (cpp_reader *pfile) /* If the token read on logical line LINE needs to be output on a different line to the current one, output the required newlines or a line marker, and return 1. Otherwise return 0. */ + static void -maybe_print_line (source_location src_loc) +maybe_print_line_1 (source_location src_loc, FILE *stream) { int src_line = LOCATION_LINE (src_loc); const char *src_file = LOCATION_FILE (src_loc); @@ -306,7 +314,7 @@ maybe_print_line (source_location src_loc) /* End the previous line of text. */ if (print.printed) { - putc ('\n', print.outf); + putc ('\n', stream); print.src_line++; print.printed = 0; } @@ -318,22 +326,37 @@ maybe_print_line (source_location src_loc) { while (src_line > print.src_line) { - putc ('\n', print.outf); + putc ('\n', stream); print.src_line++; } } else - print_line (src_loc, ""); + print_line_1 (src_loc, "", stream); + +} + +/* If the token read on logical line LINE needs to be output on a + different line to the current one, output the required newlines or + a line marker, and return 1. Otherwise return 0. */ + +static void +maybe_print_line (source_location src_loc) +{ + if (cpp_get_options (parse_in)->debug) + linemap_dump_location (line_table, src_loc, + print.outf); + maybe_print_line_1 (src_loc, print.outf); } /* Output a line marker for logical line LINE. Special flags are "1" or "2" indicating entering or leaving a file. */ + static void -print_line (source_location src_loc, const char *special_flags) +print_line_1 (source_location src_loc, const char *special_flags, FILE *stream) { /* End any previous line of text. */ if (print.printed) - putc ('\n', print.outf); + putc ('\n', stream); print.printed = 0; if (!flag_no_line_commands) @@ -354,20 +377,32 @@ print_line (source_location src_loc, const char *special_flags) (const unsigned char *) file_path, to_file_len); *p = '\0'; - fprintf (print.outf, "# %u \"%s\"%s", + fprintf (stream, "# %u \"%s\"%s", print.src_line == 0 ? 1 : print.src_line, to_file_quoted, special_flags); sysp = in_system_header_at (src_loc); if (sysp == 2) - fputs (" 3 4", print.outf); + fputs (" 3 4", stream); else if (sysp == 1) - fputs (" 3", print.outf); + fputs (" 3", stream); - putc ('\n', print.outf); + putc ('\n', stream); } } +/* Output a line marker for logical line LINE. Special flags are "1" + or "2" indicating entering or leaving a file. */ + +static void +print_line (source_location src_loc, const char *special_flags) +{ + if (cpp_get_options (parse_in)->debug) + linemap_dump_location (line_table, src_loc, + print.outf); + print_line_1 (src_loc, special_flags, print.outf); +} + /* Helper function for cb_line_change and scan_translation_unit. */ static void do_line_change (cpp_reader *pfile, const cpp_token *token, diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index d977115b7af..8e06c51c0eb 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -743,6 +743,10 @@ fconstexpr-depth= C++ ObjC++ Joined RejectNegative UInteger Var(max_constexpr_depth) Init(512) -fconstexpr-depth= Specify maximum constexpr recursion depth +fdebug-cpp +C ObjC C++ ObjC++ +Emit debug annotations during preprocessing + fdeduce-init-list C++ ObjC++ Var(flag_deduce_init_list) Init(1) -fno-deduce-init-list disable deduction of std::initializer_list for a template type parameter from a brace-enclosed initializer-list diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi index b2252367ef5..ef3a0b2f196 100644 --- a/gcc/doc/cppopts.texi +++ b/gcc/doc/cppopts.texi @@ -583,6 +583,19 @@ correct column numbers in warnings or errors, even if tabs appear on the line. If the value is less than 1 or greater than 100, the option is ignored. The default is 8. +@item -fdebug-cpp +@opindex fdebug-cpp +This option is only useful for debugging GCC. When used with +@option{-E}, dumps debugging information about location maps. Every +token in the output is preceded by the dump of the map its location +belongs to. The dump of the map holding the location of a token would +be: +@quotation +@{@samp{P}:@file{/file/path};@samp{F}:@file{/includer/path};@samp{L}:@var{line_num};@samp{C}:@var{col_num};@samp{S}:@var{system_header_p};@samp{M}:@var{map_address};@samp{E}:@var{macro_expansion_p},@samp{loc}:@var{location}@} +@end quotation + +When used without @option{-E}, this option has no effect. + @item -ftrack-macro-expansion@r{[}=@var{level}@r{]} @opindex ftrack-macro-expansion Track locations of tokens across macro expansions. This allows the diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index b2c26edeade..3b71cb18592 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -429,7 +429,7 @@ Objective-C and Objective-C++ Dialects}. -iwithprefixbefore @var{dir} -isystem @var{dir} @gol -imultilib @var{dir} -isysroot @var{dir} @gol -M -MM -MF -MG -MP -MQ -MT -nostdinc @gol --P -ftrack-macro-expansion -fworking-directory @gol +-P -fdebug-cpp -ftrack-macro-expansion -fworking-directory @gol -remap -trigraphs -undef -U@var{macro} @gol -Wp,@var{option} -Xpreprocessor @var{option}} diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 5eab7b027bb..bd86466f256 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,6 +1,13 @@ 2011-10-15 Tom Tromey Dodji Seketeli + * include/cpplib.h (struct cpp_options): New struct member. + * include/line-map.h (linemap_dump_location): Declare ... + * line-map.c (linemap_dump_location): ... new function. + +2011-10-15 Tom Tromey + Dodji Seketeli + * include/cpplib.h (struct cpp_options): New option. * internal.h (struct macro_context): New struct. diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 3e01c112140..825bf2fc6ff 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -392,6 +392,10 @@ struct cpp_options /* Nonzero means we're looking at already preprocessed code, so don't bother trying to do macro expansion and whatnot. */ unsigned char preprocessed; + + /* Nonzero means we are going to emit debugging logs during + preprocessing. */ + unsigned char debug; /* Nonzero means we are tracking locations of tokens involved in macro expansion. 1 Means we track the location in degraded mode diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h index 724f3f0f8b0..04a523c2bfc 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -675,4 +675,8 @@ expanded_location linemap_expand_location_full (struct line_maps *, source_location loc, enum location_resolution_kind lrk); +/* Dump debugging information about source location LOC into the file + stream STREAM. SET is the line map set LOC comes from. */ +void linemap_dump_location (struct line_maps *, source_location, FILE *); + #endif /* !LIBCPP_LINE_MAP_H */ diff --git a/libcpp/line-map.c b/libcpp/line-map.c index fe07c16c37d..3dbaeaba7c9 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -1105,3 +1105,41 @@ linemap_expand_location_full (struct line_maps *set, xloc = linemap_expand_location (map, loc); return xloc; } + +/* Dump debugging information about source location LOC into the file + stream STREAM. SET is the line map set LOC comes from. */ + +void +linemap_dump_location (struct line_maps *set, + source_location loc, + FILE *stream) +{ + const struct line_map *map; + source_location location; + const char *path, *from; + int l,c,s,e; + + if (loc == 0) + return; + + location = + linemap_resolve_location (set, loc, LRK_MACRO_DEFINITION_LOCATION, &map); + path = LINEMAP_FILE (map); + + l = SOURCE_LINE (map, location); + c = SOURCE_COLUMN (map, location); + s = LINEMAP_SYSP (map) != 0; + e = location != loc; + + if (e) + from = "N/A"; + else + from = (INCLUDED_FROM (set, map)) + ? LINEMAP_FILE (INCLUDED_FROM (set, map)) + : ""; + + /* P: path, L: line, C: column, S: in-system-header, M: map address, + E: macro expansion?. */ + fprintf (stream, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%d}", + path, from, l, c, s, (void*)map, e, loc); +} -- 2.11.4.GIT