[compiler-rt] r363134 - Revert r362676 "[Profile]: Add runtime interface to specify file handle for profile data."

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 12 01:44:32 PDT 2019


Author: hans
Date: Wed Jun 12 01:44:32 2019
New Revision: 363134

URL: http://llvm.org/viewvc/llvm-project?rev=363134&view=rev
Log:
Revert r362676 "[Profile]: Add runtime interface to specify file handle for profile data."

This caused instrumented Clang to become crashy. See llvm-commits thread
for repro steps.

This also reverts follow-up r362716 which added test cases.

> Author: Sajjad Mirza
>
> Differential Revision: http://reviews.llvm.org/D62541

Removed:
    compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c
    compiler-rt/trunk/test/profile/instrprof-set-file-object.c
Modified:
    compiler-rt/trunk/lib/profile/InstrProfiling.h
    compiler-rt/trunk/lib/profile/InstrProfilingFile.c
    compiler-rt/trunk/lib/profile/InstrProfilingUtil.c
    compiler-rt/trunk/lib/profile/InstrProfilingUtil.h

Modified: compiler-rt/trunk/lib/profile/InstrProfiling.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfiling.h?rev=363134&r1=363133&r2=363134&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfiling.h (original)
+++ compiler-rt/trunk/lib/profile/InstrProfiling.h Wed Jun 12 01:44:32 2019
@@ -10,7 +10,6 @@
 #define PROFILE_INSTRPROFILING_H_
 
 #include "InstrProfilingPort.h"
-#include <stdio.h>
 
 #define INSTR_PROF_VISIBILITY COMPILER_RT_VISIBILITY
 #include "InstrProfData.inc"
@@ -126,7 +125,7 @@ int __llvm_orderfile_write_file(void);
 /*!
  * \brief this is a wrapper interface to \c __llvm_profile_write_file.
  * After this interface is invoked, a arleady dumped flag will be set
- * so that profile won't be dumped again during program exit.
+ * so that profile won't be dumped again during program exit. 
  * Invocation of interface __llvm_profile_reset_counters will clear
  * the flag. This interface is designed to be used to collect profile
  * data from user selected hot regions. The use model is
@@ -158,24 +157,6 @@ int __llvm_orderfile_dump(void);
  */
 void __llvm_profile_set_filename(const char *Name);
 
-/*!
- * \brief Set the FILE object for writing instrumentation data.
- *
- * Sets the FILE object to be used for subsequent calls to
- * \a __llvm_profile_write_file(). The profile file name set by environment
- * variable, command-line option, or calls to \a  __llvm_profile_set_filename
- * will be ignored.
- *
- * \c File will not be closed after a call to \a __llvm_profile_write_file() but
- * it may be flushed. Passing NULL restores default behavior.
- *
- * If \c EnableMerge is nonzero, the runtime will always merge profiling data
- * with the contents of the profiling file. If EnableMerge is zero, the runtime
- * may still merge the data if it would have merged for another reason (for
- * example, because of a %m specifier in the file name).
- */
-void __llvm_profile_set_file_object(FILE *File, int EnableMerge);
-
 /*! \brief Register to write instrumentation data to file at exit. */
 int __llvm_profile_register_write_file_atexit(void);
 

Modified: compiler-rt/trunk/lib/profile/InstrProfilingFile.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingFile.c?rev=363134&r1=363133&r2=363134&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfilingFile.c (original)
+++ compiler-rt/trunk/lib/profile/InstrProfilingFile.c Wed Jun 12 01:44:32 2019
@@ -37,7 +37,7 @@
 /* From where is profile name specified.
  * The order the enumerators define their
  * precedence. Re-order them may lead to
- * runtime behavior change. */
+ * runtime behavior change. */ 
 typedef enum ProfileNameSpecifier {
   PNS_unknown = 0,
   PNS_default,
@@ -89,27 +89,9 @@ typedef struct lprofFilename {
 COMPILER_RT_WEAK lprofFilename lprofCurFilename = {0,   0, 0, 0, {0},
                                                    {0}, 0, 0, 0, PNS_unknown};
 
-static int ProfileMergeRequested = 0;
-static int isProfileMergeRequested() { return ProfileMergeRequested; }
-static void setProfileMergeRequested(int EnableMerge) {
-  ProfileMergeRequested = EnableMerge;
-}
-
-static FILE *ProfileFile = NULL;
-static FILE *getProfileFile() { return ProfileFile; }
-static void setProfileFile(FILE *File) { ProfileFile = File; }
-
-COMPILER_RT_VISIBILITY void __llvm_profile_set_file_object(FILE *File,
-  int EnableMerge) {
-  setProfileFile(File);
-  setProfileMergeRequested(EnableMerge);
-}
-
 static int getCurFilenameLength();
 static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf);
-static unsigned doMerging() {
-  return lprofCurFilename.MergePoolSize || isProfileMergeRequested();
-}
+static unsigned doMerging() { return lprofCurFilename.MergePoolSize; }
 
 /* Return 1 if there is an error, otherwise return  0.  */
 static uint32_t fileWriter(ProfDataWriter *This, ProfDataIOVec *IOVecs,
@@ -243,16 +225,11 @@ static void createProfileDir(const char
  * its instrumented shared libraries dump profile data into their own data file.
 */
 static FILE *openFileForMerging(const char *ProfileFileName, int *MergeDone) {
-  FILE *ProfileFile = NULL;
+  FILE *ProfileFile;
   int rc;
 
-  ProfileFile = getProfileFile();
-  if (ProfileFile) {
-    lprofLockFileHandle(ProfileFile);
-  } else {
-    createProfileDir(ProfileFileName);
-    ProfileFile = lprofOpenFileEx(ProfileFileName);
-  }
+  createProfileDir(ProfileFileName);
+  ProfileFile = lprofOpenFileEx(ProfileFileName);
   if (!ProfileFile)
     return NULL;
 
@@ -267,16 +244,6 @@ static FILE *openFileForMerging(const ch
   return ProfileFile;
 }
 
-static FILE *GetFileObject(const char *OutputName) {
-  FILE *File;
-  File = getProfileFile();
-  if (File != NULL) {
-    return File;
-  }
-
-  return fopen(OutputName, "ab");
-}
-
 /* Write profile data to file \c OutputName.  */
 static int writeFile(const char *OutputName) {
   int RetVal;
@@ -284,10 +251,10 @@ static int writeFile(const char *OutputN
 
   int MergeDone = 0;
   VPMergeHook = &lprofMergeValueProfData;
-  if (doMerging())
-    OutputFile = openFileForMerging(OutputName, &MergeDone);
+  if (!doMerging())
+    OutputFile = fopen(OutputName, "ab");
   else
-    OutputFile = GetFileObject(OutputName);
+    OutputFile = openFileForMerging(OutputName, &MergeDone);
 
   if (!OutputFile)
     return -1;
@@ -298,15 +265,7 @@ static int writeFile(const char *OutputN
   initFileWriter(&fileWriter, OutputFile);
   RetVal = lprofWriteData(&fileWriter, lprofGetVPDataReader(), MergeDone);
 
-  if (doMerging()) {
-    lprofUnlockFileHandle(OutputFile);
-  }
-
-  if (OutputFile == getProfileFile())
-    fflush(OutputFile);
-  else
-    fclose(OutputFile);
-
+  fclose(OutputFile);
   return RetVal;
 }
 
@@ -632,7 +591,7 @@ void __llvm_profile_initialize_file(void
 
   EnvFilenamePat = getFilenamePatFromEnv();
   if (EnvFilenamePat) {
-    /* Pass CopyFilenamePat = 1, to ensure that the filename would be valid
+    /* Pass CopyFilenamePat = 1, to ensure that the filename would be valid 
        at the  moment when __llvm_profile_write_file() gets executed. */
     parseAndSetFilename(EnvFilenamePat, PNS_environment, 1);
     return;
@@ -668,7 +627,8 @@ int __llvm_profile_write_file(void) {
   int PDeathSig = 0;
 
   if (lprofProfileDumped()) {
-    PROF_NOTE("Profile data not written to file: %s.\n", "already written");
+    PROF_NOTE("Profile data not written to file: %s.\n", 
+              "already written");
     return 0;
   }
 

Modified: compiler-rt/trunk/lib/profile/InstrProfilingUtil.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingUtil.c?rev=363134&r1=363133&r2=363134&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfilingUtil.c (original)
+++ compiler-rt/trunk/lib/profile/InstrProfilingUtil.c Wed Jun 12 01:44:32 2019
@@ -154,26 +154,6 @@ COMPILER_RT_VISIBILITY int lprofUnlockFd
 #endif
 }
 
-COMPILER_RT_VISIBILITY int lprofLockFileHandle(FILE *F) {
-  int fd;
-#if defined(_WIN32)
-  fd = _fileno(F);
-#else
-  fd = fileno(F);
-#endif
-  return lprofLockFd(fd);
-}
-
-COMPILER_RT_VISIBILITY int lprofUnlockFileHandle(FILE *F) {
-  int fd;
-#if defined(_WIN32)
-  fd = _fileno(F);
-#else
-  fd = fileno(F);
-#endif
-  return lprofUnlockFd(fd);
-}
-
 COMPILER_RT_VISIBILITY FILE *lprofOpenFileEx(const char *ProfileName) {
   FILE *f;
   int fd;

Modified: compiler-rt/trunk/lib/profile/InstrProfilingUtil.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingUtil.h?rev=363134&r1=363133&r2=363134&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfilingUtil.h (original)
+++ compiler-rt/trunk/lib/profile/InstrProfilingUtil.h Wed Jun 12 01:44:32 2019
@@ -23,8 +23,6 @@ unsigned __llvm_profile_get_dir_mode(voi
 
 int lprofLockFd(int fd);
 int lprofUnlockFd(int fd);
-int lprofLockFileHandle(FILE *F);
-int lprofUnlockFileHandle(FILE *F);
 
 /*! Open file \c Filename for read+write with write
  * lock for exclusive access. The caller will block

Removed: compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c?rev=363133&view=auto
==============================================================================
--- compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c (original)
+++ compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c (removed)
@@ -1,43 +0,0 @@
-// Test that the specified output merges the profiling data.
-// Run the program twice so that the counters accumulate.
-// RUN: %clang -fprofile-instr-generate -fcoverage-mapping -o %t %s
-// RUN: %run %t %t.merging.profraw
-// RUN: %run %t %t.merging.profraw
-// RUN: test -f %t.merging.profraw
-// RUN: llvm-profdata merge -o %t.merging.profdata %t.merging.profraw
-// RUN: llvm-cov show -instr-profile %t.merging.profdata %t | FileCheck %s --match-full-lines
-// RUN: rm %t.merging.profdata %t.merging.profraw
-#include <stdio.h>
-
-extern void __llvm_profile_set_file_object(FILE *, int);
-
-int main(int argc, const char *argv[]) {
-  if (argc < 2)
-    return 1;
-
-  FILE *F = fopen(argv[1], "r+b");
-  if (!F) {
-    // File might not exist, try opening with truncation
-    F = fopen(argv[1], "w+b");
-  }
-  __llvm_profile_set_file_object(F, 1);
-
-  return 0;
-}
-// CHECK:   10|       |#include <stdio.h>
-// CHECK:   11|       |
-// CHECK:   12|       |extern void __llvm_profile_set_file_object(FILE *, int);
-// CHECK:   13|       |
-// CHECK:   14|      2|int main(int argc, const char *argv[]) {
-// CHECK:   15|      2|  if (argc < 2)
-// CHECK:   16|      0|    return 1;
-// CHECK:   17|      2|
-// CHECK:   18|      2|  FILE *F = fopen(argv[1], "r+b");
-// CHECK:   19|      2|  if (!F) {
-// CHECK:   20|      1|    // File might not exist, try opening with truncation
-// CHECK:   21|      1|    F = fopen(argv[1], "w+b");
-// CHECK:   22|      1|  }
-// CHECK:   23|      2|  __llvm_profile_set_file_object(F, 1);
-// CHECK:   24|      2|
-// CHECK:   25|      2|  return 0;
-// CHECK:   26|      2|}

Removed: compiler-rt/trunk/test/profile/instrprof-set-file-object.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-set-file-object.c?rev=363133&view=auto
==============================================================================
--- compiler-rt/trunk/test/profile/instrprof-set-file-object.c (original)
+++ compiler-rt/trunk/test/profile/instrprof-set-file-object.c (removed)
@@ -1,31 +0,0 @@
-// Test that the specified output has profiling data.
-// RUN: %clang -fprofile-instr-generate -fcoverage-mapping -o %t %s
-// RUN: %run %t %t.file.profraw
-// RUN: test -f %t.file.profraw
-// RUN: llvm-profdata merge -o %t.file.profdata %t.file.profraw
-// RUN: llvm-cov show -instr-profile %t.file.profdata %t | FileCheck %s --match-full-lines
-// RUN: rm %t.file.profraw %t.file.profdata
-#include <stdio.h>
-
-extern void __llvm_profile_set_file_object(FILE *, int);
-
-int main(int argc, const char *argv[]) {
-  if (argc < 2)
-    return 1;
-
-  FILE *F = fopen(argv[1], "w+b");
-  __llvm_profile_set_file_object(F, 0);
-  return 0;
-}
-// CHECK:    8|       |#include <stdio.h>
-// CHECK:    9|       |
-// CHECK:   10|       |extern void __llvm_profile_set_file_object(FILE *, int);
-// CHECK:   11|       |
-// CHECK:   12|      1|int main(int argc, const char *argv[]) {
-// CHECK:   13|      1|  if (argc < 2)
-// CHECK:   14|      0|    return 1;
-// CHECK:   15|      1|
-// CHECK:   16|      1|  FILE *F = fopen(argv[1], "w+b");
-// CHECK:   17|      1|  __llvm_profile_set_file_object(F, 0);
-// CHECK:   18|      1|  return 0;
-// CHECK:   19|      1|}




More information about the llvm-commits mailing list