All tests passed. Committed as r199390 in google/gcc-4_8. Thanks, Sharad
On Tue, May 28, 2013 at 11:45 AM, Sharad Singhai <sing...@google.com> wrote: > On Fri, May 24, 2013 at 7:42 PM, Xinliang David Li <davi...@google.com> wrote: >> On Fri, May 24, 2013 at 2:32 PM, Sharad Singhai <sing...@google.com> wrote: >>> if (flag_gcov_file) >>> { >>> - char *gcov_file_name >>> - = make_gcov_file_name (file_name, src->coverage.name); >>> + if (flag_intermediate_format) >>> + /* Output the intermediate format without requiring source >>> + files. This outputs a section to a *single* file. */ >>> + output_intermediate_file (gcov_file_intermediate, src); >> >> Is there an indentation issue here? > > Yes, fixed. > >> >> >> >>> + else >>> + { >>> + char *gcov_file_name >>> + = make_gcov_file_name (file_name, src->coverage.name); >>> >> >> >> Try to avoid the following format only changes by reorganization -- >> for instance refactor the following part into a helper function. > > Fixed by adding helper function 'output_gcov_file'. > >> >> Ok for google branch with those change. Please submit the change to trunk >> asap. > > Proposed for trunk in > http://gcc.gnu.org/ml/gcc-patches/2013-05/msg01657.html. I will commit > this patch to google 4.8 branch after one more round of testing. > > Thanks, > Sharad > >> >> thanks, >> >> David >> >>> - if (src->coverage.lines) >>> - { >>> - FILE *gcov_file = fopen (gcov_file_name, "w"); >>> + if (src->coverage.lines) >>> + { >>> + FILE *gcov_file = fopen (gcov_file_name, "w"); >>> >>> - if (gcov_file) >>> - { >>> - fnotice (stdout, "Creating '%s'\n", gcov_file_name); >>> - output_lines (gcov_file, src); >>> - if (ferror (gcov_file)) >>> - fnotice (stderr, "Error writing output file '%s'\n", >>> - gcov_file_name); >>> - fclose (gcov_file); >>> - } >>> - else >>> - fnotice (stderr, "Could not open output file '%s'\n", >>> - gcov_file_name); >>> - } >>> - else >>> - { >>> - unlink (gcov_file_name); >>> - fnotice (stdout, "Removing '%s'\n", gcov_file_name); >>> - } >>> - free (gcov_file_name); >>> - } >>> - fnotice (stdout, "\n"); >>> + if (gcov_file) >>> + { >>> + fnotice (stdout, "Creating '%s'\n", gcov_file_name); >>> + output_lines (gcov_file, src); >>> + if (ferror (gcov_file)) >>> + fnotice (stderr, "Error writing output file >>> '%s'\n", >>> + gcov_file_name); >>> + fclose (gcov_file); >>> + } >>> + else >>> + fnotice (stderr, "Could not open output file '%s'\n", >>> + gcov_file_name); >>> + } >>> + else >>> + { >>> + unlink (gcov_file_name); >>> + fnotice (stdout, "Removing '%s'\n", gcov_file_name); >>> + } >>> + free (gcov_file_name); >>> + } >>> + fnotice (stdout, "\n"); >>> + } >>> } >>> >>> + if (flag_gcov_file && flag_intermediate_format) >>> + { >>> + /* Now we've finished writing the intermediate file. */ >>> + fclose (gcov_file_intermediate); >>> + XDELETEVEC (gcov_file_intermediate_name); >>> + } >>> + >>> if (!file_name) >>> executed_summary (total_lines, total_executed); >>> } >>> @@ -766,6 +914,9 @@ release_function (function_t *fn) >>> } >>> free (fn->blocks); >>> free (fn->counts); >>> + if (flag_demangled_names && fn->demangled_name != fn->name) >>> + free (fn->demangled_name); >>> + free (fn->name); >>> } >>> >>> /* Release all memory used. */ >>> @@ -1051,6 +1202,12 @@ read_graph_file (void) >>> >>> fn = XCNEW (function_t); >>> fn->name = function_name; >>> + if (flag_demangled_names) >>> + { >>> + fn->demangled_name = cplus_demangle (fn->name, DMGL_PARAMS); >>> + if (!fn->demangled_name) >>> + fn->demangled_name = fn->name; >>> + } >>> fn->ident = ident; >>> fn->lineno_checksum = lineno_checksum; >>> fn->cfg_checksum = cfg_checksum; >>> @@ -2280,7 +2437,8 @@ output_lines (FILE *gcov_file, const source_t *src >>> if (arc->fake) >>> return_count -= arc->count; >>> >>> - fprintf (gcov_file, "function %s", fn->name); >>> + fprintf (gcov_file, "function %s", flag_demangled_names ? >>> + fn->demangled_name : fn->name); >>> fprintf (gcov_file, " called %s", >>> format_gcov (called_count, 0, -1)); >>> fprintf (gcov_file, " returned %s", >>> Index: doc/gcov.texi >>> =================================================================== >>> --- doc/gcov.texi (revision 199269) >>> +++ doc/gcov.texi (working copy) >>> @@ -131,6 +131,8 @@ gcov [@option{-v}|@option{--version}] [@option{-h} >>> [@option{-o}|@option{--object-directory} @var{directory|file}] >>> [@option{-s}|@option{--source-prefix} @var{directory}] >>> [@option{-d}|@option{--display-progress}] >>> + [@option{-i}|@option{--intermediate-format}] >>> + [@option{-m}|@option{--demangled-names}] >>> @var{files} >>> @c man end >>> @c man begin SEEALSO >>> @@ -232,6 +234,50 @@ Unconditional branches are normally not interestin >>> @itemx --display-progress >>> Display the progress on the standard output. >>> >>> +@item -i >>> +@itemx --intermediate-format >>> +Output gcov file in an easy-to-parse intermediate text format that can >>> +be used by @command{lcov} or other tools. The output is a single >>> +@file{.gcov} file per @file{.gcda} file. No source code is required. >>> + >>> +The format of the intermediate @file{.gcov} file is plain text with >>> +one entry per line >>> + >>> +@smallexample >>> +file:@var{source_file_name} >>> +function:@var{line_number},@var{execution_count},@var{function_name} >>> +lcount:@var{line number},@var{execution_count} >>> +branch:@var{line_number},@var{branch_coverage_type} >>> + >>> +Where the @var{branch_coverage_type} is >>> + notexec (Branch not executed) >>> + taken (Branch executed and taken) >>> + nottaken (Branch executed, but not taken) >>> + >>> +There can be multiple @var{file} entries in an intermediate gcov >>> +file. All entries following a @var{file} pertain to that source file >>> +until the next @var{file} entry. >>> +@end smallexample >>> + >>> +Here is a sample when @option{-i} is used in conjuction with >>> @option{-b} option: >>> + >>> +@smallexample >>> +file:array.cc >>> +function:11,1,_Z3sumRKSt6vectorIPiSaIS0_EE >>> +function:22,1,main >>> +lcount:11,1 >>> +lcount:12,1 >>> +lcount:14,1 >>> +branch:14,taken >>> +lcount:26,1 >>> +branch:28,nottaken >>> +@end smallexample >>> + >>> +@item -m >>> +@itemx --demangled-names >>> +Display demangled function names in output. The default is to show >>> +mangled function names. >>> + >>> @end table >>> >>> @command{gcov} should be run with the current directory the same as that