forked from OSchip/llvm-project
[PGO] Delay profile dir creation until write
Differential Revision: http://reviews.llvm.org/D29960 llvm-svn: 295108
This commit is contained in:
parent
fb9f647e5f
commit
f2d9481028
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue