libgcov.c (create_file_directory): Enable it for win32 case.
2010-10-17 Kai Tietz <kai.tietz@onevision.com> * libgcov.c (create_file_directory): Enable it for win32 case. (gcov_exit): De-couple GCOV_PREFIX and GCOV_PREFIX_STRIP. * doc/gcov.texi (GCOV_PREFIX): Adjusted. (GCOV_PREFIX_SKIP): Likewise. From-SVN: r165596
This commit is contained in:
parent
5b8b526e69
commit
78e7dd6a36
3 changed files with 67 additions and 30 deletions
|
@ -1,3 +1,10 @@
|
|||
2010-10-17 Kai Tietz <kai.tietz@onevision.com>
|
||||
|
||||
* libgcov.c (create_file_directory): Enable it for win32 case.
|
||||
(gcov_exit): De-couple GCOV_PREFIX and GCOV_PREFIX_STRIP.
|
||||
* doc/gcov.texi (GCOV_PREFIX): Adjusted.
|
||||
(GCOV_PREFIX_SKIP): Likewise.
|
||||
|
||||
2010-10-17 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||
|
||||
* doc/objc.texi (GNU Objective-C runtime API): New section.
|
||||
|
|
|
@ -554,15 +554,15 @@ can relocate the data files based on two environment variables:
|
|||
@itemize @bullet
|
||||
@item
|
||||
GCOV_PREFIX contains the prefix to add to the absolute paths
|
||||
in the object file. Prefix must be absolute as well, otherwise its
|
||||
value is ignored. The default is no prefix.
|
||||
in the object file. Prefix can be absolute, or relative. The
|
||||
default is no prefix.
|
||||
|
||||
@item
|
||||
GCOV_PREFIX_STRIP indicates the how many initial directory names to strip off
|
||||
the hardwired absolute paths. Default value is 0.
|
||||
|
||||
@emph{Note:} GCOV_PREFIX_STRIP has no effect if GCOV_PREFIX is undefined, empty
|
||||
or non-absolute.
|
||||
@emph{Note:} If GCOV_PREFIX_STRIP is set without GCOV_PREFIX is undefined,
|
||||
then a relative path is made out of the hardwired absolute paths.
|
||||
@end itemize
|
||||
|
||||
For example, if the object file @file{/user/build/foo.o} was built with
|
||||
|
|
|
@ -87,7 +87,6 @@ static gcov_unsigned_t gcov_crc32;
|
|||
/* Size of the longest file name. */
|
||||
static size_t gcov_max_filename = 0;
|
||||
|
||||
#ifdef TARGET_POSIX_IO
|
||||
/* Make sure path component of the given FILENAME exists, create
|
||||
missing directories. FILENAME must be writable.
|
||||
Returns zero on success, or -1 if an error occurred. */
|
||||
|
@ -95,9 +94,19 @@ static size_t gcov_max_filename = 0;
|
|||
static int
|
||||
create_file_directory (char *filename)
|
||||
{
|
||||
#if !defined(TARGET_POSIX_IO) && !defined(_WIN32)
|
||||
(void) filename;
|
||||
return -1;
|
||||
#else
|
||||
char *s;
|
||||
|
||||
for (s = filename + 1; *s != '\0'; s++)
|
||||
s = filename;
|
||||
|
||||
if (HAS_DRIVE_SPEC(s))
|
||||
s += 2;
|
||||
if (IS_DIR_SEPARATOR(*s))
|
||||
++s;
|
||||
for (; *s != '\0'; s++)
|
||||
if (IS_DIR_SEPARATOR(*s))
|
||||
{
|
||||
char sep = *s;
|
||||
|
@ -105,7 +114,11 @@ create_file_directory (char *filename)
|
|||
|
||||
/* Try to make directory if it doesn't already exist. */
|
||||
if (access (filename, F_OK) == -1
|
||||
#ifdef TARGET_POSIX_IO
|
||||
&& mkdir (filename, 0755) == -1
|
||||
#else
|
||||
&& mkdir (filename) == -1
|
||||
#endif
|
||||
/* The directory might have been made by another process. */
|
||||
&& errno != EEXIST)
|
||||
{
|
||||
|
@ -118,8 +131,8 @@ create_file_directory (char *filename)
|
|||
*s = sep;
|
||||
};
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Check if VERSION of the info block PTR matches libgcov one.
|
||||
Return 1 on success, or zero in case of versions mismatch.
|
||||
|
@ -190,9 +203,6 @@ gcov_exit (void)
|
|||
}
|
||||
}
|
||||
|
||||
/* Get file name relocation prefix. Non-absolute values are ignored. */
|
||||
gcov_prefix = getenv("GCOV_PREFIX");
|
||||
if (gcov_prefix && IS_ABSOLUTE_PATH (gcov_prefix))
|
||||
{
|
||||
/* Check if the level of dirs to strip off specified. */
|
||||
char *tmp = getenv("GCOV_PREFIX_STRIP");
|
||||
|
@ -203,7 +213,11 @@ gcov_exit (void)
|
|||
if (gcov_prefix_strip < 0)
|
||||
gcov_prefix_strip = 0;
|
||||
}
|
||||
|
||||
}
|
||||
/* Get file name relocation prefix. Non-absolute values are ignored. */
|
||||
gcov_prefix = getenv("GCOV_PREFIX");
|
||||
if (gcov_prefix)
|
||||
{
|
||||
prefix_length = strlen(gcov_prefix);
|
||||
|
||||
/* Remove an unnecessary trailing '/' */
|
||||
|
@ -213,8 +227,15 @@ gcov_exit (void)
|
|||
else
|
||||
prefix_length = 0;
|
||||
|
||||
/* Allocate and initialize the filename scratch space. */
|
||||
gi_filename = (char *) alloca (prefix_length + gcov_max_filename + 1);
|
||||
/* If no prefix was specified and a prefix stip, then we assume
|
||||
relative. */
|
||||
if (gcov_prefix_strip != 0 && prefix_length == 0)
|
||||
{
|
||||
gcov_prefix = ".";
|
||||
prefix_length = 1;
|
||||
}
|
||||
/* Allocate and initialize the filename scratch space plus one. */
|
||||
gi_filename = (char *) alloca (prefix_length + gcov_max_filename + 2);
|
||||
if (prefix_length)
|
||||
memcpy (gi_filename, gcov_prefix, prefix_length);
|
||||
gi_filename_up = gi_filename + prefix_length;
|
||||
|
@ -233,31 +254,42 @@ gcov_exit (void)
|
|||
gcov_unsigned_t tag, length;
|
||||
gcov_position_t summary_pos = 0;
|
||||
gcov_position_t eof_pos = 0;
|
||||
const char *fname, *s;
|
||||
|
||||
fname = gi_ptr->filename;
|
||||
|
||||
memset (&this_object, 0, sizeof (this_object));
|
||||
memset (&object, 0, sizeof (object));
|
||||
|
||||
/* Avoid to add multiple drive letters into combined path. */
|
||||
if (prefix_length != 0 && HAS_DRIVE_SPEC(fname))
|
||||
fname += 2;
|
||||
|
||||
/* Build relocated filename, stripping off leading
|
||||
directories from the initial filename if requested. */
|
||||
if (gcov_prefix_strip > 0)
|
||||
{
|
||||
int level = 0;
|
||||
const char *fname = gi_ptr->filename;
|
||||
const char *s;
|
||||
s = fname;
|
||||
if (IS_DIR_SEPARATOR(*s))
|
||||
++s;
|
||||
|
||||
/* Skip selected directory levels. */
|
||||
for (s = fname + 1; (*s != '\0') && (level < gcov_prefix_strip); s++)
|
||||
for (; (*s != '\0') && (level < gcov_prefix_strip); s++)
|
||||
if (IS_DIR_SEPARATOR(*s))
|
||||
{
|
||||
fname = s;
|
||||
level++;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
/* Update complete filename with stripped original. */
|
||||
strcpy (gi_filename_up, fname);
|
||||
if (!IS_DIR_SEPARATOR (*fname))
|
||||
{
|
||||
strcpy (gi_filename_up, "/");
|
||||
strcpy (gi_filename_up + 1, fname);
|
||||
}
|
||||
else
|
||||
strcpy (gi_filename_up, gi_ptr->filename);
|
||||
strcpy (gi_filename_up, fname);
|
||||
|
||||
/* Totals for this object file. */
|
||||
ci_ptr = gi_ptr->counts;
|
||||
|
@ -297,7 +329,6 @@ gcov_exit (void)
|
|||
|
||||
if (!gcov_open (gi_filename))
|
||||
{
|
||||
#ifdef TARGET_POSIX_IO
|
||||
/* Open failed likely due to missed directory.
|
||||
Create directory and retry to open file. */
|
||||
if (create_file_directory (gi_filename))
|
||||
|
@ -305,7 +336,6 @@ gcov_exit (void)
|
|||
fprintf (stderr, "profiling:%s:Skip\n", gi_filename);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
if (!gcov_open (gi_filename))
|
||||
{
|
||||
fprintf (stderr, "profiling:%s:Cannot open\n", gi_filename);
|
||||
|
|
Loading…
Add table
Reference in a new issue