[PGO] Delay profile dir creation until write

Differential Revision: http://reviews.llvm.org/D29960

llvm-svn: 295108
This commit is contained in:
Xinliang David Li 2017-02-14 21:39:55 +00:00
parent fb9f647e5f
commit f2d9481028
2 changed files with 26 additions and 7 deletions

View File

@ -172,6 +172,16 @@ static int doProfileMerging(FILE *ProfileFile) {
return 0;
}
/* Create the directory holding the file, if needed. */
static void createProfileDir(const char *Filename) {
size_t Length = strlen(Filename);
if (lprofFindFirstDirSeparator(Filename)) {
char *Copy = (char *)COMPILER_RT_ALLOCA(Length + 1);
strncpy(Copy, Filename, Length + 1);
__llvm_profile_recursive_mkdir(Copy);
}
}
/* Open the profile data for merging. It opens the file in r+b mode with
* file locking. If the file has content which is compatible with the
* current process, it also reads in the profile data in the file and merge
@ -184,6 +194,7 @@ static FILE *openFileForMerging(const char *ProfileFileName) {
FILE *ProfileFile;
int rc;
createProfileDir(ProfileFileName);
ProfileFile = lprofOpenFileEx(ProfileFileName);
if (!ProfileFile)
return NULL;
@ -233,18 +244,13 @@ static void truncateCurrentFile(void) {
if (!Filename)
return;
/* Create the directory holding the file, if needed. */
if (lprofFindFirstDirSeparator(Filename)) {
char *Copy = (char *)COMPILER_RT_ALLOCA(Length + 1);
strncpy(Copy, Filename, Length + 1);
__llvm_profile_recursive_mkdir(Copy);
}
/* By pass file truncation to allow online raw profile
* merging. */
if (lprofCurFilename.MergePoolSize)
return;
createProfileDir(Filename);
/* Truncate the file. Later we'll reopen and append. */
File = fopen(Filename, "w");
if (!File)

View File

@ -0,0 +1,13 @@
// RUN: %clang_pgogen -o %t %s
// RUN: env LLVM_PROFILE_FILE="%t.d/%m.profraw"
// RUN: rm -fr %t.d
// RUN: %run %t %t.d
#include <errno.h>
#include <unistd.h>
int main(int argc, char **argv) {
if (access(argv[1], F_OK) == 0)
return 1; // %t.d should not exist yet.
return !(errno == ENOENT);
}