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 <dodji@redhat.com>

From-SVN: r180084
This commit is contained in:
Tom Tromey 2011-10-17 09:59:40 +00:00 committed by Dodji Seketeli
parent 07a0b324eb
commit 847e697a24
11 changed files with 144 additions and 12 deletions

View file

@ -1,3 +1,10 @@
2011-10-15 Tom Tromey <tromey@redhat.com>
Dodji Seketeli <dodji@redhat.com>
* doc/cppopts.texi: Document -fdebug-cpp.
* doc/invoke.texi: Add -fdebug-cpp to the list of preprocessor
options.
2011-10-15 Tom Tromey <tromey@redhat.com>
Dodji Seketeli <dodji@redhat.com>

View file

@ -1,3 +1,19 @@
2011-10-15 Tom Tromey <tromey@redhat.com>
Dodji Seketeli <dodji@redhat.com>
* 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 <tromey@redhat.com>
Dodji Seketeli <dodji@redhat.com>

View file

@ -628,6 +628,10 @@ c_common_handle_option (size_t scode, const char *arg, int value,
cpp_opts->preprocessed = value;
break;
case OPT_fdebug_cpp:
cpp_opts->debug = 1;
break;
case OPT_ftrack_macro_expansion:
if (value)
value = 2;

View file

@ -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,

View file

@ -743,6 +743,10 @@ fconstexpr-depth=
C++ ObjC++ Joined RejectNegative UInteger Var(max_constexpr_depth) Init(512)
-fconstexpr-depth=<number> 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

View file

@ -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

View file

@ -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}}

View file

@ -1,3 +1,10 @@
2011-10-15 Tom Tromey <tromey@redhat.com>
Dodji Seketeli <dodji@redhat.com>
* include/cpplib.h (struct cpp_options)<debug>: New struct member.
* include/line-map.h (linemap_dump_location): Declare ...
* line-map.c (linemap_dump_location): ... new function.
2011-10-15 Tom Tromey <tromey@redhat.com>
Dodji Seketeli <dodji@redhat.com>

View file

@ -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

View file

@ -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 */

View file

@ -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))
: "<NULL>";
/* 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);
}