Thanks for the reviews. I have incorporated all but one (See below; its the
change in the warning's
brief summary in common.opt) in the patch.
In this patch,
1. -Wmissing-profile is a warning by default and is ON by default with
-fprofile-use
2. Attached pr86957-missing-profile-diagnostic-2 shows the warning messages
3. Added a testcase for warning in the case of missing profile feedback data
file for a compilation unit
Thanks
gcc/ChangeLog:
2018-09-14 "Indu Bhagat"<indu.bha...@oracle.com>
* common.opt: New warning option -Wmissing-profile.
* coverage.c (get_coverage_counts): Add warning for missing .gcda file.
* doc/invoke.texi: Document -Wmissing-profile.
gcc/testsuite/ChangeLog:
2018-09-14 "Indu Bhagat"<indu.bha...@oracle.com>
* gcc.dg/Wmissing-profile.c: New test.
On 09/11/2018 02:21 AM, Martin Liška wrote:
diff --git a/gcc/common.opt b/gcc/common.opt
index ebc3ef4..d93ddca 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -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.
Maybe 'Want about missing profile for a function in -fprofile-use build.' ?
Since, Wmissing-profile also warns when feedback data file is missing for a
compilation unit, the
suggested text above will be more restrictive. So I did not change.
[Testcase 1] Missing profile data file with -fprofile-use. The sort.c file
contains two functions main() and stop()
gcc -c sort.c -fprofile-use -O1
-fprofile-dir=/scratch/user/gcc-temp/fdo/profdata/
sort.c: In function ‘main’:
sort.c:29:1: warning:
‘/scratch/user/gcc-temp/fdo/profdata//#scratch#user#gcc-temp#fdo#sort.gcda’
profile count data file not found [-Wmissing-profile]
29 | }
| ^
[Testcase 2] bubble_sort.c has a non-empty function bubble_sort() for which
profile data exists.
Now at profile-use phase, a user adds empty function before1() before an
existing lone function bubble_sort() and empty function after1() after the lone
existing function bubble_sort()
gcc -c bubble_sort.c -fprofile-use -O1
-fprofile-dir=/scratch/user/gcc-temp/fdo/profdata/
bubble_sort.c:20:6: warning: profile for function ‘after1’ not found in profile
data [-Wmissing-profile]
20 | void after1() { }
| ^~~~~~
bubble_sort.c: In function ‘bubble_sort’:
bubble_sort.c:20:1: error: source locations for function ‘bubble_sort’ have
changed, the profile data may be out of date [-Werror=coverage-mismatch]
20 | void after1() { }
| ^~~~
bubble_sort.c: In function ‘before1’:
bubble_sort.c:3:6: warning: profile for function ‘before1’ not found in profile
data [-Wmissing-profile]
3 | void before1() { }
| ^~~~~~~
cc1: some warnings being treated as errors
make: *** [bubble_sort.o] Error 1
[Testcase 3] Use -Wno-missing-profile to disable warnings (A coverage-mismatch
error remains here because of source file changes as mentioned in Testcase 2
above; but no warnings are issued for before1() and after1())
gcc -c bubble_sort.c -fprofile-use -O1 -Wno-missing-profile
-fprofile-dir=/scratch/user/gcc-temp/fdo/profdata/
bubble_sort.c: In function ‘bubble_sort’:
bubble_sort.c:20:1: error: source locations for function ‘bubble_sort’ have
changed, the profile data may be out of date [-Werror=coverage-mismatch]
20 | void after1() { }
| ^~~~
cc1: some warnings being treated as errors
diff --git a/gcc/common.opt b/gcc/common.opt
index ef6a630..53aac19 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -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.
diff --git a/gcc/coverage.c b/gcc/coverage.c
index bae6f5c..f9b54d8 100644
--- a/gcc/coverage.c
+++ b/gcc/coverage.c
@@ -341,16 +341,23 @@ get_coverage_counts (unsigned counter, unsigned expected,
{
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;
}
@@ -364,10 +371,17 @@ get_coverage_counts (unsigned counter, unsigned expected,
elt.ctr = counter;
entry = counts_hash->find (&elt);
if (!entry || !entry->summary.num)
- /* 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 (summary)
+ 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
|| entry->summary.num != expected)
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index ec12711..072327a 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -314,7 +314,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
@@ -4211,8 +4211,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
@@ -4816,6 +4816,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 wiped out, 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
@@ -9905,8 +9922,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}.
diff --git a/gcc/testsuite/gcc.dg/Wmissing-profile.c b/gcc/testsuite/gcc.dg/Wmissing-profile.c
new file mode 100644
index 0000000..6ef1ac1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wmissing-profile.c
@@ -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" } */