re PR gcov-profile/86957 (gcc should warn about missing profiles for a compilation...
authorIndu Bhagat <indu.bhagat@oracle.com>
Wed, 26 Sep 2018 22:29:54 +0000 (22:29 +0000)
committerQing Zhao <qinzhao@gcc.gnu.org>
Wed, 26 Sep 2018 22:29:54 +0000 (22:29 +0000)
2018-09-26  Indu Bhagat  <indu.bhagat@oracle.com>

PR gcov-profile/86957
* common.opt: New warning option -Wmissing-profile.
* coverage.c (get_coverage_counts): Add warning for missing .gcda file.
* doc/invoke.texi: Document -Wmissing-profile.

From-SVN: r264657

gcc/ChangeLog
gcc/common.opt
gcc/coverage.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wmissing-profile.c [new file with mode: 0644]

index b13aaa8de6f791c60dfb20e7b1f8b26dc7081383..54eb0b8d15a957e50c682b8a23823654914e7c91 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-26  Indu Bhagat  <indu.bhagat@oracle.com>
+
+       PR gcov-profile/86957
+       * common.opt: New warning option -Wmissing-profile.
+       * coverage.c (get_coverage_counts): Add warning for missing .gcda file.
+       * doc/invoke.texi: Document -Wmissing-profile.
+
 2018-09-26  Jim Wilson  <jimw@sifive.com>
 
        * config/riscv/riscv.md (subsi3_extended2): Add J constraint.
index ef6a63087af0c53889b1e1e85c4c095060402e21..53aac194899bcaf856e915e67e8af48089c42d02 100644 (file)
@@ -811,6 +811,10 @@ Wcoverage-mismatch
 Common Var(warn_coverage_mismatch) Init(1) Warning
 Warn in case profiles in -fprofile-use do not match.
 
+Wmissing-profile
+Common Var(warn_missing_profile) Init(1) Warning
+Warn in case profiles in -fprofile-use do not exist.
+
 Wvector-operation-performance
 Common Var(warn_vector_operation_performance) Warning
 Warn when a vector operation is compiled outside the SIMD.
index 8f12778656a4a614d3f44c2981588c841c43baa8..19c696c34930ee3f6f59f69f8a72c3910939b773 100644 (file)
@@ -304,16 +304,23 @@ get_coverage_counts (unsigned counter, unsigned cfg_checksum,
     {
       static int warned = 0;
 
-      if (!warned++ && dump_enabled_p ())
+      if (!warned++)
        {
-         dump_user_location_t loc
-           = dump_user_location_t::from_location_t (input_location);
-         dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
+         warning (OPT_Wmissing_profile,
+                  "%qs profile count data file not found",
+                  da_file_name);
+         if (dump_enabled_p ())
+           {
+             dump_user_location_t loc
+               = dump_user_location_t::from_location_t (input_location);
+             dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
+                              "file %s not found\n",
+                              da_file_name);
+             dump_printf (MSG_OPTIMIZED_LOCATIONS,
                           (flag_guess_branch_prob
-                           ? "file %s not found, execution counts estimated\n"
-                           : "file %s not found, execution counts assumed to "
-                           "be zero\n"),
-                          da_file_name);
+                           ? "execution counts estimated\n"
+                           : "execution counts assumed to be zero\n"));
+           }
        }
       return NULL;
     }
@@ -327,10 +334,17 @@ get_coverage_counts (unsigned counter, unsigned cfg_checksum,
   elt.ctr = counter;
   entry = counts_hash->find (&elt);
   if (!entry)
-    /* The function was not emitted, or is weak and not chosen in the
-       final executable.  Silently fail, because there's nothing we
-       can do about it.  */
-    return NULL;
+    {
+      if (counter == GCOV_COUNTER_ARCS)
+       warning_at (DECL_SOURCE_LOCATION (current_function_decl),
+                   OPT_Wmissing_profile,
+                   "profile for function %qD not found in profile data",
+                   current_function_decl);
+      /* The function was not emitted, or is weak and not chosen in the
+        final executable.  Silently fail, because there's nothing we
+        can do about it.  */
+      return NULL;
+    }
   
   if (entry->cfg_checksum != cfg_checksum)
     {
index 7ef4e7a449b84f0a912b1a7223b187cf421f571d..5c95f674e0c4ea7c5a064d0474ce684d65dc4e02 100644 (file)
@@ -315,7 +315,7 @@ Objective-C and Objective-C++ Dialects}.
 -Wlogical-op  -Wlogical-not-parentheses  -Wlong-long @gol
 -Wmain  -Wmaybe-uninitialized  -Wmemset-elt-size  -Wmemset-transposed-args @gol
 -Wmisleading-indentation  -Wmissing-attributes -Wmissing-braces @gol
--Wmissing-field-initializers  -Wmissing-include-dirs @gol
+-Wmissing-field-initializers  -Wmissing-include-dirs  -Wmissing-profile @gol
 -Wno-multichar  -Wmultistatement-macros  -Wnonnull  -Wnonnull-compare @gol
 -Wnormalized=@r{[}none@r{|}id@r{|}nfc@r{|}nfkc@r{]} @gol
 -Wnull-dereference  -Wodr  -Wno-overflow  -Wopenmp-simd  @gol
@@ -4215,8 +4215,8 @@ Warn about an invalid memory access that is found by Pointer Bounds Checker
 @opindex Wcoverage-mismatch
 Warn if feedback profiles do not match when using the
 @option{-fprofile-use} option.
-If a source file is changed between compiling with @option{-fprofile-gen} and
-with @option{-fprofile-use}, the files with the profile feedback can fail
+If a source file is changed between compiling with @option{-fprofile-generate}
+and with @option{-fprofile-use}, the files with the profile feedback can fail
 to match the source file and GCC cannot use the profile feedback
 information.  By default, this warning is enabled and is treated as an
 error.  @option{-Wno-coverage-mismatch} can be used to disable the
@@ -4820,6 +4820,23 @@ This warning is enabled by @option{-Wall}.
 @opindex Wno-missing-include-dirs
 Warn if a user-supplied include directory does not exist.
 
+@item -Wmissing-profile
+@opindex Wmissing-profile
+@opindex Wno-missing-profile
+Warn if feedback profiles are missing when using the
+@option{-fprofile-use} option.
+This option diagnoses those cases where a new function or a new file is added
+to the user code between compiling with @option{-fprofile-generate} and with
+@option{-fprofile-use}, without regenerating the profiles.  In these cases, the
+profile feedback data files do not contain any profile feedback information for
+the newly added function or file respectively.  Also, in the case when profile
+count data (.gcda) files are removed, GCC cannot use any profile feedback
+information.  In all these cases, warnings are issued to inform the user that a
+profile generation step is due.  @option{-Wno-missing-profile} can be used to
+disable the warning.  Ignoring the warning can result in poorly optimized code.
+Completely disabling the warning is not recommended and should be done only
+when non-existent profile data is justified.
+
 @item -Wmultistatement-macros
 @opindex Wmultistatement-macros
 @opindex Wno-multistatement-macros
@@ -9917,8 +9934,9 @@ Before you can use this option, you must first generate profiling information.
 
 By default, GCC emits an error message if the feedback profiles do not
 match the source code.  This error can be turned into a warning by using
-@option{-Wcoverage-mismatch}.  Note this may result in poorly optimized
-code.
+@option{-Wno-error=coverage-mismatch}.  Note this may result in poorly
+optimized code.  Additionally, by default, GCC also emits a warning message if
+the feedback profiles do not exist (See @option{-Wmissing-profile}).
 
 If @var{path} is specified, GCC looks at the @var{path} to find
 the profile feedback data files. See @option{-fprofile-dir}.
index 16407e5244c7984f725f52b3dfc11a4925d382e9..b7dd6734bca29c54af40244b816a27d1d8fe3455 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-26  Indu Bhagat  <indu.bhagat@oracle.com>
+
+       PR gcov-profile/86957
+       * gcc.dg/Wmissing-profile.c: New test.
+
 2018-09-26  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/87390
diff --git a/gcc/testsuite/gcc.dg/Wmissing-profile.c b/gcc/testsuite/gcc.dg/Wmissing-profile.c
new file mode 100644 (file)
index 0000000..6ef1ac1
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR gcov-profile/86957 */
+/* { dg-do compile } */
+/* { dg-options "-fprofile-use" } */
+
+void foo () { } /* { dg-warning "profile count data file not found" } */