From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25419 invoked by alias); 10 Dec 2010 11:14:37 -0000 Received: (qmail 24731 invoked by uid 22791); 10 Dec 2010 11:13:40 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from seketeli.net (HELO ms.seketeli.net) (91.121.166.71) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 10 Dec 2010 11:12:12 +0000 Received: from adjoa.torimasen.com (torimasen.com [82.237.12.13]) by ms.seketeli.net (Postfix) with ESMTP id EA9841608049; Fri, 10 Dec 2010 12:11:40 +0100 (CET) Received: by adjoa.torimasen.com (Postfix, from userid 500) id B6BD48E606F; Fri, 10 Dec 2010 12:11:38 +0100 (CET) From: Dodji Seketeli To: gcc-patches@gcc.gnu.org Cc: tromey@redhat.com, joseph@codesourcery.com, gdr@integrable-solutions.net, lopezibanez@gmail.com Subject: [PATCH 4/6] Support -fdebug-cpp option Date: Fri, 10 Dec 2010 11:16:00 -0000 Message-Id: <1291979498-1604-6-git-send-email-dodji@redhat.com> In-Reply-To: <1291979498-1604-1-git-send-email-dodji@redhat.com> References: <1291979498-1604-1-git-send-email-dodji@redhat.com> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2010-12/txt/msg00858.txt.bz2 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. Tested on x86_64-unknown-linux-gnu against trunk. libcpp/ * 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. gcc/ * doc/cppopts.texi: Document -fdebug-cpp. * doc/invoke.texi: Add -fdebug-cpp to the list of preprocessor options. gcc/c-family/ * 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. --- gcc/c-family/c-opts.c | 4 +++ gcc/c-family/c-ppoutput.c | 57 ++++++++++++++++++++++++++++++++++++-------- gcc/c-family/c.opt | 4 +++ gcc/doc/cppopts.texi | 12 +++++++++ gcc/doc/invoke.texi | 2 +- libcpp/include/cpplib.h | 4 +++ libcpp/include/line-map.h | 1 + libcpp/line-map.c | 38 ++++++++++++++++++++++++++++++ 8 files changed, 110 insertions(+), 12 deletions(-) diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 4c2e37e..2a00077 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -621,6 +621,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; diff --git a/gcc/c-family/c-ppoutput.c b/gcc/c-family/c-ppoutput.c index 0def8fa..446a261 100644 --- a/gcc/c-family/c-ppoutput.c +++ b/gcc/c-family/c-ppoutput.c @@ -58,7 +58,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); @@ -241,7 +243,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); @@ -295,14 +302,15 @@ 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); /* End the previous line of text. */ if (print.printed) { - putc ('\n', print.outf); + putc ('\n', stream); print.src_line++; print.printed = 0; } @@ -311,22 +319,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) @@ -346,20 +369,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 25d0cb6..c502c89 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -719,6 +719,10 @@ fconstant-string-class= ObjC ObjC++ Joined MissingArgError(no class name specified with %qs) -fconst-string-class= Use class for constant strings +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 a4f8b32..4dff6d5 100644 --- a/gcc/doc/cppopts.texi +++ b/gcc/doc/cppopts.texi @@ -583,6 +583,18 @@ 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 +When used with @option{-E}, dump 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 07f2b20..0fe924b 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -415,7 +415,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/include/cpplib.h b/libcpp/include/cpplib.h index 783576b..909409e 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -388,6 +388,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 0011f38..3f58e03 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -640,4 +640,5 @@ expanded_location linemap_expand_location_full (struct line_maps *, source_location, enum location_resolution_kind, const struct line_map**); +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 aeccdee..a924912 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -981,3 +981,41 @@ linemap_expand_location_full (struct line_maps *set, 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_macro_loc_to_def_point (set, loc, &map, true); + 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); +} -- Dodji