From patchwork Fri Sep 16 08:10:23 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dodji Seketeli X-Patchwork-Id: 114899 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 2733CB70B9 for ; Fri, 16 Sep 2011 18:11:25 +1000 (EST) Received: (qmail 12135 invoked by alias); 16 Sep 2011 08:11:18 -0000 Received: (qmail 12119 invoked by uid 22791); 16 Sep 2011 08:11:13 -0000 X-SWARE-Spam-Status: No, hits=-6.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 16 Sep 2011 08:10:52 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p8G8AQ5A015110 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 16 Sep 2011 04:10:26 -0400 Received: from localhost (ovpn-113-40.phx2.redhat.com [10.3.113.40]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p8G8AOZE017440 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 16 Sep 2011 04:10:25 -0400 Received: by localhost (Postfix, from userid 500) id 6E14C29C0CB; Fri, 16 Sep 2011 10:10:23 +0200 (CEST) From: Dodji Seketeli To: Jason Merrill Cc: gcc-patches@gcc.gnu.org, tromey@redhat.com, gdr@integrable-solutions.net, joseph@codesourcery.com, burnus@net-b.de, charlet@act-europe.fr, bonzini@gnu.org Subject: Re: [PATCH 4/7] Support -fdebug-cpp option References: <1291979498-1604-1-git-send-email-dodji@redhat.com> <1902ac92ebf0b213bfafdeb31edaac8812b5399b.1310824121.git.dodji@redhat.com> <4E6E7639.2050700@redhat.com> X-URL: http://www.redhat.com Date: Fri, 16 Sep 2011 10:10:23 +0200 In-Reply-To: <4E6E7639.2050700@redhat.com> (Jason Merrill's message of "Mon, 12 Sep 2011 17:14:33 -0400") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Jason Merrill writes: > On 08/24/2011 10:06 AM, Tom Tromey wrote: >> Dodji> Would it be acceptable to just change the output of -fdirective to fit? >> Dodji> Or are we bound to not breaking existing consumers? >> >> I think changing it would be fine. > > I agree. I have added that to my TODO list. > > On 07/16/2011 10:37 AM, Dodji Seketeli wrote: >> } >> + >> +void >> +linemap_dump_location (struct line_maps *set, > > Comment. Oops, added. >> +@item -fdebug-cpp >> +@opindex fdebug-cpp > > Please add something to clarify that this is only useful for debugging > GCC. Done. Below is the updated patch, thanks. 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 | 13 ++++++++++ gcc/doc/invoke.texi | 2 +- libcpp/include/cpplib.h | 4 +++ libcpp/include/line-map.h | 4 +++ libcpp/line-map.c | 38 ++++++++++++++++++++++++++++++ 8 files changed, 114 insertions(+), 12 deletions(-) diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 3184539..6869d5c 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -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; diff --git a/gcc/c-family/c-ppoutput.c b/gcc/c-family/c-ppoutput.c index b4bc9ce..cb010c5 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 07a6b87..f9db8f1 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -739,6 +739,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 b225236..ef3a0b2 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 7e1b7c2..fedcf84 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -428,7 +428,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 3e01c11..825bf2f 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 5b7ee9d..81fe6c9 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -800,4 +800,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 959566c..fbd88da 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -955,3 +955,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_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); +}