forked from OSchip/llvm-project
Code refactoring: extract path prefix handling code
.. into reusable interfaces. No functional change is expected. llvm-svn: 275807
This commit is contained in:
parent
2be7eadba3
commit
fe9ecc9d9a
|
@ -20,8 +20,9 @@
|
|||
|*
|
||||
\*===----------------------------------------------------------------------===*/
|
||||
|
||||
#include "InstrProfilingUtil.h"
|
||||
#include "InstrProfilingInternal.h"
|
||||
#include "InstrProfilingPort.h"
|
||||
#include "InstrProfilingUtil.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
@ -171,45 +172,16 @@ static uint64_t read_64bit_value() {
|
|||
|
||||
static char *mangle_filename(const char *orig_filename) {
|
||||
char *new_filename;
|
||||
size_t filename_len, prefix_len;
|
||||
size_t prefix_len;
|
||||
int prefix_strip;
|
||||
int level = 0;
|
||||
const char *fname, *ptr;
|
||||
const char *prefix = getenv("GCOV_PREFIX");
|
||||
const char *prefix_strip_str = getenv("GCOV_PREFIX_STRIP");
|
||||
const char *prefix = lprofGetPathPrefix(&prefix_strip, &prefix_len);
|
||||
|
||||
if (prefix == NULL || prefix[0] == '\0')
|
||||
if (prefix == NULL)
|
||||
return strdup(orig_filename);
|
||||
|
||||
if (prefix_strip_str) {
|
||||
prefix_strip = atoi(prefix_strip_str);
|
||||
|
||||
/* Negative GCOV_PREFIX_STRIP values are ignored */
|
||||
if (prefix_strip < 0)
|
||||
prefix_strip = 0;
|
||||
} else {
|
||||
prefix_strip = 0;
|
||||
}
|
||||
|
||||
fname = orig_filename;
|
||||
for (level = 0, ptr = fname + 1; level < prefix_strip; ++ptr) {
|
||||
if (*ptr == '\0')
|
||||
break;
|
||||
|
||||
if (!IS_DIR_SEPARATOR(*ptr))
|
||||
continue;
|
||||
fname = ptr;
|
||||
++level;
|
||||
}
|
||||
|
||||
filename_len = strlen(fname);
|
||||
prefix_len = strlen(prefix);
|
||||
new_filename = malloc(prefix_len + 1 + filename_len + 1);
|
||||
memcpy(new_filename, prefix, prefix_len);
|
||||
|
||||
if (!IS_DIR_SEPARATOR(prefix[prefix_len - 1]))
|
||||
new_filename[prefix_len++] = DIR_SEPARATOR;
|
||||
memcpy(new_filename + prefix_len, fname, filename_len + 1);
|
||||
new_filename = malloc(prefix_len + 1 + strlen(orig_filename) + 1);
|
||||
lprofApplyPathPrefix(new_filename, orig_filename, prefix, prefix_len,
|
||||
prefix_strip);
|
||||
|
||||
return new_filename;
|
||||
}
|
||||
|
|
|
@ -163,6 +163,20 @@ void lprofSetupValueProfiler();
|
|||
* to dump merged profile data into its own profile file. */
|
||||
uint64_t lprofGetLoadModuleSignature();
|
||||
|
||||
/* GCOV_PREFIX and GCOV_PREFIX_STRIP support */
|
||||
/* Return the path prefix specified by GCOV_PREFIX environment variable.
|
||||
* If GCOV_PREFIX_STRIP is also specified, the strip level (integer value)
|
||||
* is returned via \c *PrefixStrip. The prefix length is stored in *PrefixLen.
|
||||
*/
|
||||
const char *lprofGetPathPrefix(int *PrefixStrip, size_t *PrefixLen);
|
||||
/* Apply the path prefix specified in \c Prefix to path string in \c PathStr,
|
||||
* and store the result to buffer pointed to by \c Buffer. If \c PrefixStrip
|
||||
* is not zero, path prefixes are stripped from \c PathStr (the level of
|
||||
* stripping is specified by \c PrefixStrip) before \c Prefix is added.
|
||||
*/
|
||||
void lprofApplyPathPrefix(char *Dest, const char *PathStr, const char *Prefix,
|
||||
size_t PrefixLen, int PrefixStrip);
|
||||
|
||||
COMPILER_RT_VISIBILITY extern char *(*GetEnvHook)(const char *);
|
||||
COMPILER_RT_VISIBILITY extern void (*FreeHook)(void *);
|
||||
COMPILER_RT_VISIBILITY extern uint8_t *DynamicBufferIOBuffer;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <sys/utsname.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
COMPILER_RT_VISIBILITY
|
||||
|
@ -132,3 +133,54 @@ COMPILER_RT_VISIBILITY FILE *lprofOpenFileEx(const char *ProfileName) {
|
|||
|
||||
return f;
|
||||
}
|
||||
|
||||
COMPILER_RT_VISIBILITY const char *lprofGetPathPrefix(int *PrefixStrip,
|
||||
size_t *PrefixLen) {
|
||||
const char *Prefix = getenv("GCOV_PREFIX");
|
||||
const char *PrefixStripStr = getenv("GCOV_PREFIX_STRIP");
|
||||
|
||||
*PrefixLen = 0;
|
||||
*PrefixStrip = 0;
|
||||
if (Prefix == NULL || Prefix[0] == '\0')
|
||||
return NULL;
|
||||
|
||||
if (PrefixStripStr) {
|
||||
*PrefixStrip = atoi(PrefixStripStr);
|
||||
|
||||
/* Negative GCOV_PREFIX_STRIP values are ignored */
|
||||
if (*PrefixStrip < 0)
|
||||
*PrefixStrip = 0;
|
||||
} else {
|
||||
*PrefixStrip = 0;
|
||||
}
|
||||
*PrefixLen = strlen(Prefix);
|
||||
|
||||
return Prefix;
|
||||
}
|
||||
|
||||
COMPILER_RT_VISIBILITY void
|
||||
lprofApplyPathPrefix(char *Dest, const char *PathStr, const char *Prefix,
|
||||
size_t PrefixLen, int PrefixStrip) {
|
||||
|
||||
const char *Ptr;
|
||||
int Level;
|
||||
const char *StrippedPathStr = PathStr;
|
||||
|
||||
for (Level = 0, Ptr = PathStr + 1; Level < PrefixStrip; ++Ptr) {
|
||||
if (*Ptr == '\0')
|
||||
break;
|
||||
|
||||
if (!IS_DIR_SEPARATOR(*Ptr))
|
||||
continue;
|
||||
|
||||
StrippedPathStr = Ptr;
|
||||
++Level;
|
||||
}
|
||||
|
||||
memcpy(Dest, Prefix, PrefixLen);
|
||||
|
||||
if (!IS_DIR_SEPARATOR(Prefix[PrefixLen - 1]))
|
||||
Dest[PrefixLen++] = DIR_SEPARATOR;
|
||||
|
||||
memcpy(Dest + PrefixLen, StrippedPathStr, strlen(StrippedPathStr) + 1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue