[PATCH] D29960: [PGO] Delay directory creation until write time

David Li via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 14 13:51:33 PST 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL295108: [PGO] Delay profile dir creation until write (authored by davidxl).

Changed prior to commit:
  https://reviews.llvm.org/D29960?vs=88427&id=88431#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D29960

Files:
  compiler-rt/trunk/lib/profile/InstrProfilingFile.c
  compiler-rt/trunk/test/profile/Linux/instrprof-dir.c


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 <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);
+}
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)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29960.88431.patch
Type: text/x-patch
Size: 2185 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170214/27bd77ac/attachment-0001.bin>


More information about the llvm-commits mailing list