Index: compiler-rt/trunk/lib/profile/InstrProfilingFile.c =================================================================== --- compiler-rt/trunk/lib/profile/InstrProfilingFile.c +++ compiler-rt/trunk/lib/profile/InstrProfilingFile.c @@ -172,6 +172,16 @@ 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 @@ FILE *ProfileFile; int rc; + createProfileDir(ProfileFileName); ProfileFile = lprofOpenFileEx(ProfileFileName); if (!ProfileFile) return NULL; @@ -233,18 +244,13 @@ 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) Index: compiler-rt/trunk/test/profile/Linux/instrprof-dir.c =================================================================== --- compiler-rt/trunk/test/profile/Linux/instrprof-dir.c +++ compiler-rt/trunk/test/profile/Linux/instrprof-dir.c @@ -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 +#include + +int main(int argc, char **argv) { + if (access(argv[1], F_OK) == 0) + return 1; // %t.d should not exist yet. + return !(errno == ENOENT); +}