public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Force use of absolute path names for gcov
@ 2017-04-21 18:51 Bernd Edlinger
  2017-04-21 20:27 ` Joseph Myers
  0 siblings, 1 reply; 13+ messages in thread
From: Bernd Edlinger @ 2017-04-21 18:51 UTC (permalink / raw)
  To: gcc-patches, Nathan Sidwell, Jan Hubicka

[-- Attachment #1: Type: text/plain, Size: 583 bytes --]

Hi!


If gcov is used in projects where gcc is invoked in different
directories, it may happen that the same source is compiled
with different relative names, and the gcov tool is thus unable
to find out, if it is the same source file or not, or to dump the
source at all, which is a limitation of the gcov tool.

So I would like to add a -fprofile-abs-path option that
forces absolute path names in gcno files, which allows gcov
to get the true canonicalized source name.


Bootstrapped and reg-tested on x86_64-pc-linux-gnu.
Is it OK for trunk?


Thanks
Bernd.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: changelog-gcov-abs-path.diff --]
[-- Type: text/x-patch; name="changelog-gcov-abs-path.diff", Size: 498 bytes --]

gcc:
2017-04-21  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-04-21  Bernd Edlinger  <bernd.edlinger@hotmail.de>

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

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: patch-gcov-abs-path.diff --]
[-- Type: text/x-patch; name="patch-gcov-abs-path.diff", Size: 4925 bytes --]

Index: gcc/common.opt
===================================================================
--- gcc/common.opt	(revision 246571)
+++ gcc/common.opt	(working copy)
@@ -1965,6 +1965,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: gcc/coverage.c
===================================================================
--- gcc/coverage.c	(revision 246571)
+++ gcc/coverage.c	(working copy)
@@ -663,7 +663,7 @@ coverage_begin_function (unsigned lineno_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: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 246571)
+++ gcc/doc/invoke.texi	(working copy)
@@ -441,6 +441,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
@@ -10639,6 +10640,12 @@ additional @option{-ftest-coverage} option.  You d
 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 with multiple
+directories.
+
+@item
 Link your object files with @option{-lgcov} or @option{-fprofile-arcs}
 (the latter implies the former).
 
Index: gcc/gcov-io.c
===================================================================
--- gcc/gcov-io.c	(revision 246571)
+++ gcc/gcov-io.c	(working copy)
@@ -353,6 +353,37 @@ 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)
+{
+  char buf[1024];
+  size_t len;
+
+  if (profile_abs_path_flag && filename && filename[0]
+      && !(IS_DIR_SEPARATOR (filename[0])
+#if HAVE_DOS_BASED_FILE_SYSTEM
+	   || filename[1] == ':'
+#endif
+	  )
+      && (len = strlen (filename)) < sizeof (buf) - 1)
+    {
+      if (getcwd (buf, sizeof (buf) - len - 1) != NULL)
+	{
+	  if (buf[0] && !IS_DIR_SEPARATOR (buf[strlen (buf) - 1]))
+	    strcat (buf, "/");
+	  strcat (buf, filename);
+	  filename = 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: gcc/gcov-io.h
===================================================================
--- gcc/gcov-io.h	(revision 246571)
+++ gcc/gcov-io.h	(working copy)
@@ -388,6 +388,7 @@ GCOV_LINKAGE void gcov_write_unsigned (gcov_unsign
 /* 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: gcc/profile.c
===================================================================
--- gcc/profile.c	(revision 246571)
+++ gcc/profile.c	(working copy)
@@ -956,7 +956,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)
 	{
Index: gcc/testsuite/gcc.misc-tests/gcov-1a.c
===================================================================
--- gcc/testsuite/gcc.misc-tests/gcov-1a.c	(revision 0)
+++ gcc/testsuite/gcc.misc-tests/gcov-1a.c	(working copy)
@@ -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 } } */

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-06-05 19:00 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-21 18:51 [PATCH] Force use of absolute path names for gcov Bernd Edlinger
2017-04-21 20:27 ` Joseph Myers
2017-04-21 20:57   ` Bernd Edlinger
2017-04-28 18:14     ` [PING] " Bernd Edlinger
2017-05-12 16:48       ` [PING**2] " Bernd Edlinger
2017-06-01 15:59         ` [PING**3] " Bernd Edlinger
2017-06-01 17:52           ` Nathan Sidwell
2017-06-01 19:24             ` Bernd Edlinger
2017-06-02 11:35               ` Nathan Sidwell
2017-06-02 14:43                 ` Bernd Edlinger
2017-06-05 11:11                   ` Nathan Sidwell
2017-06-05 16:31                     ` Bernd Edlinger
2017-06-05 19:00                       ` Nathan Sidwell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).