[compiler-rt] r272428 - [profile] cleanup file setting code

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 10 13:35:01 PDT 2016


Author: davidxl
Date: Fri Jun 10 15:35:01 2016
New Revision: 272428

URL: http://llvm.org/viewvc/llvm-project?rev=272428&view=rev
Log:
[profile] cleanup file setting code

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


Modified:
    compiler-rt/trunk/lib/profile/InstrProfilingFile.c
    compiler-rt/trunk/lib/profile/InstrProfilingPort.h

Modified: compiler-rt/trunk/lib/profile/InstrProfilingFile.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingFile.c?rev=272428&r1=272427&r2=272428&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfilingFile.c (original)
+++ compiler-rt/trunk/lib/profile/InstrProfilingFile.c Fri Jun 10 15:35:01 2016
@@ -31,6 +31,33 @@
 #endif
 #endif
 
+/* From where is profile name specified.
+ * The order the enumerators define their
+ * precedence. Re-order them may lead to
+ * runtime behavior change. */ 
+typedef enum ProfileNameSpecifier {
+  PNS_unknown = 0,
+  PNS_default,
+  PNS_command_line,
+  PNS_environment,
+  PNS_runtime_api
+} ProfileNameSpecifier;
+
+static const char *getPNSStr(ProfileNameSpecifier PNS) {
+  switch (PNS) {
+  case PNS_default:
+    return "default setting";
+  case PNS_command_line:
+    return "command line";
+  case PNS_environment:
+    return "environment variable";
+  case PNS_runtime_api:
+    return "runtime API";
+  default:
+    return "Unknown";
+  }
+}
+
 #define MAX_PID_SIZE 16
 /* Data structure holding the result of parsed filename pattern.  */
 typedef struct lprofFilename {
@@ -48,9 +75,10 @@ typedef struct lprofFilename {
    * 2 profile data files. %1m is equivalent to %m. Also %m specifier
    * can only appear once at the end of the name pattern. */
   unsigned MergePoolSize;
+  ProfileNameSpecifier PNS;
 } lprofFilename;
 
-lprofFilename lprofCurFilename = {0, {0}, {0}, 0, 0, 0};
+lprofFilename lprofCurFilename = {0, {0}, {0}, 0, 0, 0, PNS_unknown};
 
 int getpid(void);
 static int getCurFilenameLength();
@@ -214,9 +242,11 @@ static void truncateCurrentFile(void) {
   fclose(File);
 }
 
+static const char *DefaultProfileName = "default.profraw";
 static void resetFilenameToDefault(void) {
   memset(&lprofCurFilename, 0, sizeof(lprofCurFilename));
-  lprofCurFilename.FilenamePat = "default.profraw";
+  lprofCurFilename.FilenamePat = DefaultProfileName;
+  lprofCurFilename.PNS = PNS_default;
 }
 
 static int containsMergeSpecifier(const char *FilenamePat, int I) {
@@ -278,17 +308,44 @@ static int parseFilenamePattern(const ch
   return 0;
 }
 
-static void parseAndSetFilename(const char *FilenamePat) {
-  int NewFile;
+static void parseAndSetFilename(const char *FilenamePat,
+                                ProfileNameSpecifier PNS) {
+
   const char *OldFilenamePat = lprofCurFilename.FilenamePat;
+  ProfileNameSpecifier OldPNS = lprofCurFilename.PNS;
+
+  if (PNS < OldPNS)
+    return;
+
+  if (!FilenamePat)
+    FilenamePat = DefaultProfileName;
 
+  /* When -fprofile-instr-generate=<path> is specified on the
+   * command line, each module will be instrumented with runtime
+   * init call to __llvm_profile_init function which calls
+   * __llvm_profile_override_default_filename. In most of the cases,
+   * the path will be identical, so bypass the parsing completely.
+   */
+  if (OldFilenamePat && !strcmp(OldFilenamePat, FilenamePat)) {
+    lprofCurFilename.PNS = PNS;
+    return;
+  }
+
+  /* When PNS >= OldPNS, the last one wins. */
   if (!FilenamePat || parseFilenamePattern(FilenamePat))
     resetFilenameToDefault();
+  lprofCurFilename.PNS = PNS;
 
-  NewFile =
-      !OldFilenamePat || (strcmp(OldFilenamePat, lprofCurFilename.FilenamePat));
+  if (!OldFilenamePat) {
+    PROF_NOTE("Set profile file path to \"%s\" via %s.\n",
+              lprofCurFilename.FilenamePat, getPNSStr(PNS));
+  } else {
+    PROF_NOTE("Override old profile path \"%s\" via %s to \"%s\" via %s.\n",
+              OldFilenamePat, getPNSStr(OldPNS), lprofCurFilename.FilenamePat,
+              getPNSStr(PNS));
+  }
 
-  if (NewFile && !lprofCurFilename.MergePoolSize)
+  if (!lprofCurFilename.MergePoolSize)
     truncateCurrentFile();
 }
 
@@ -376,13 +433,9 @@ static const char *getFilenamePatFromEnv
 COMPILER_RT_VISIBILITY
 void __llvm_profile_initialize_file(void) {
   const char *FilenamePat;
-  /* Check if the filename has been initialized. */
-  if (lprofCurFilename.FilenamePat)
-    return;
 
-  /* Detect the filename and truncate. */
   FilenamePat = getFilenamePatFromEnv();
-  parseAndSetFilename(FilenamePat);
+  parseAndSetFilename(FilenamePat, FilenamePat ? PNS_environment : PNS_default);
 }
 
 /* This API is directly called by the user application code. It has the
@@ -391,7 +444,7 @@ void __llvm_profile_initialize_file(void
  */
 COMPILER_RT_VISIBILITY
 void __llvm_profile_set_filename(const char *FilenamePat) {
-  parseAndSetFilename(FilenamePat);
+  parseAndSetFilename(FilenamePat, PNS_runtime_api);
 }
 
 /*
@@ -402,12 +455,7 @@ void __llvm_profile_set_filename(const c
  */
 COMPILER_RT_VISIBILITY
 void __llvm_profile_override_default_filename(const char *FilenamePat) {
-  /* If the env var is set, skip setting filename from argument. */
-  const char *Env_Filename = getFilenamePatFromEnv();
-  if (Env_Filename)
-    return;
-
-  parseAndSetFilename(FilenamePat);
+  parseAndSetFilename(FilenamePat, PNS_command_line);
 }
 
 /* The public API for writing profile data into the file with name

Modified: compiler-rt/trunk/lib/profile/InstrProfilingPort.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingPort.h?rev=272428&r1=272427&r2=272428&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfilingPort.h (original)
+++ compiler-rt/trunk/lib/profile/InstrProfilingPort.h Fri Jun 10 15:35:01 2016
@@ -89,6 +89,9 @@
 #define PROF_WARN(Format, ...)                                                 \
   fprintf(stderr, "LLVM Profile Warning: " Format, __VA_ARGS__);
 
+#define PROF_NOTE(Format, ...)                                                 \
+  fprintf(stderr, "LLVM Profile Note: " Format, __VA_ARGS__);
+
 #if defined(__FreeBSD__)
 
 #include <inttypes.h>




More information about the llvm-commits mailing list