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:
parent
07a0b324eb
commit
847e697a24
11 changed files with 144 additions and 12 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue