invoke.texi: Document the -fprofile-abs-path option.
authorBernd Edlinger <edlinger@gcc.gnu.org>
Mon, 5 Jun 2017 19:27:30 +0000 (19:27 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Mon, 5 Jun 2017 19:27:30 +0000 (19:27 +0000)
2017-06-05  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * doc/invoke.texi: Document the -fprofile-abs-path option.
        * common.opt (fprofile-abs-path): New option.
        * gcov-io.h (gcov_write_filename): Declare.
        * gcov-io.c (gcov_write_filename): New function.
        * coverage.c (coverage_begin_function): Use gcov_write_filename.
        * profile.c (output_location): Likewise.

gcc/testsuite:
2017-06-05  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * gcc.misc-tests/gcov-1a.c: New test.

From-SVN: r248894

gcc/common.opt
gcc/coverage.c
gcc/doc/invoke.texi
gcc/gcov-io.c
gcc/gcov-io.h
gcc/profile.c
gcc/testsuite/gcc.misc-tests/gcov-1a.c [new file with mode: 0644]

index 13305558d2d99a317f7b493ed7fe79e8367c8864..0a10511d468500bd3e3544ffa2407021f5eab066 100644 (file)
@@ -1969,6 +1969,10 @@ fprofile
 Common Report Var(profile_flag)
 Enable basic program profiling code.
 
+fprofile-abs-path
+Common Report Var(profile_abs_path_flag)
+Generate absolute source path names for gcov.
+
 fprofile-arcs
 Common Report Var(profile_arc_flag)
 Insert arc-based program profiling code.
index 53e379b32957748b702e37ecc1591a45e5d3f728..ed469107e3e6750da53a0a39dd3e002efde5e792 100644 (file)
@@ -663,7 +663,7 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum)
   gcov_write_unsigned (cfg_checksum);
   gcov_write_string (IDENTIFIER_POINTER
                     (DECL_ASSEMBLER_NAME (current_function_decl)));
-  gcov_write_string (xloc.file);
+  gcov_write_filename (xloc.file);
   gcov_write_unsigned (xloc.line);
   gcov_write_length (offset);
 
index e691f48cf56aa2b27f169f6fa72e029ef3fa68a5..4a83a3e39eb5d1afb12b1de48aeaf1d1beeb3498 100644 (file)
@@ -444,6 +444,7 @@ Objective-C and Objective-C++ Dialects}.
 @item Program Instrumentation Options
 @xref{Instrumentation Options,,Program Instrumentation Options}.
 @gccoptlist{-p  -pg  -fprofile-arcs  --coverage  -ftest-coverage @gol
+-fprofile-abs-path @gol
 -fprofile-dir=@var{path}  -fprofile-generate  -fprofile-generate=@var{path} @gol
 -fsanitize=@var{style}  -fsanitize-recover  -fsanitize-recover=@var{style} @gol
 -fasan-shadow-offset=@var{number}  -fsanitize-sections=@var{s1},@var{s2},... @gol
@@ -10694,6 +10695,12 @@ and code generation options.  For test coverage analysis, use the
 additional @option{-ftest-coverage} option.  You do not need to profile
 every source file in a program.
 
+@item
+Compile the source files additionally with @option{-fprofile-abs-path}
+to create absolute path names in the @file{.gcno} files.  This allows
+@command{gcov} to find the correct sources in projects where compilations
+occur with different working directories.
+
 @item
 Link your object files with @option{-lgcov} or @option{-fprofile-arcs}
 (the latter implies the former).
@@ -10738,6 +10745,13 @@ above for a description of @var{auxname} and instructions on how to
 generate test coverage data.  Coverage data matches the source files
 more closely if you do not optimize.
 
+@item -fprofile-abs-path
+@opindex fprofile-abs-path
+Automatically convert relative source file names to absolute path names
+in the @file{.gcno} files.  This allows @command{gcov} to find the correct
+sources in projects where compilations occur with different working
+directories.
+
 @item -fprofile-dir=@var{path}
 @opindex fprofile-dir
 
index 64dedd5528edd7399974890a35a6b1ce80fb1182..2ce26f4a8ff816ccb5206cd739cbdd22ffd65dee 100644 (file)
@@ -356,6 +356,38 @@ gcov_write_string (const char *string)
 }
 #endif
 
+#if !IN_LIBGCOV
+/* Write FILENAME to coverage file.  Sets error flag on file
+   error, overflow flag on overflow */
+
+GCOV_LINKAGE void
+gcov_write_filename (const char *filename)
+{
+  if (profile_abs_path_flag && filename && filename[0]
+      && !(IS_DIR_SEPARATOR (filename[0])
+#if HAVE_DOS_BASED_FILE_SYSTEM
+          || filename[1] == ':'
+#endif
+         ))
+    {
+      char *buf = getcwd (NULL, 0);
+      if (buf != NULL && buf[0])
+       {
+         size_t len = strlen (buf);
+         buf = (char*)xrealloc (buf, len + strlen (filename) + 2);
+         if (!IS_DIR_SEPARATOR (buf[len - 1]))
+           strcat (buf, "/");
+         strcat (buf, filename);
+         gcov_write_string (buf);
+         free (buf);
+         return;
+       }
+    }
+
+  gcov_write_string (filename);
+}
+#endif
+
 #if !IN_LIBGCOV
 /* Write a tag TAG and reserve space for the record length. Return a
    value to be used for gcov_write_length.  */
index 1c8ee8f9a2aff55afa1d63f238039540b6f1125e..584c3a2eaca851b084380ab2aa0c357ef9d58c90 100644 (file)
@@ -387,6 +387,7 @@ GCOV_LINKAGE void gcov_write_unsigned (gcov_unsigned_t) ATTRIBUTE_HIDDEN;
 /* Available only in compiler */
 GCOV_LINKAGE unsigned gcov_histo_index (gcov_type value);
 GCOV_LINKAGE void gcov_write_string (const char *);
+GCOV_LINKAGE void gcov_write_filename (const char *);
 GCOV_LINKAGE gcov_position_t gcov_write_tag (gcov_unsigned_t);
 GCOV_LINKAGE void gcov_write_length (gcov_position_t /*position*/);
 #endif
index aca5c67465a16150dc4ba9429b3bddff4c3c4fd2..219fa8a1b839b0cfe6905d1288020a855da33b4c 100644 (file)
@@ -976,7 +976,7 @@ output_location (char const *file_name, int line,
     {
       prev_file_name = file_name;
       gcov_write_unsigned (0);
-      gcov_write_string (prev_file_name);
+      gcov_write_filename (prev_file_name);
     }
   if (line_differs)
     {
diff --git a/gcc/testsuite/gcc.misc-tests/gcov-1a.c b/gcc/testsuite/gcc.misc-tests/gcov-1a.c
new file mode 100644 (file)
index 0000000..2b9fabc
--- /dev/null
@@ -0,0 +1,20 @@
+/* Test Gcov basics.  */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage -fprofile-abs-path" } */
+/* { dg-do run { target native } } */
+
+void noop ()
+{
+}
+
+int main ()
+{
+  int i;
+
+  for (i = 0; i < 10; i++)     /* count(11) */
+    noop ();                   /* count(10) */
+
+  return 0;                    /* count(1) */
+}
+
+/* { dg-final { run-gcov gcov-1a.c } } */