summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorManman Ren <mren@apple.com>2012-11-02 01:10:15 +0000
committerManman Ren <mren@apple.com>2012-11-02 01:10:15 +0000
commit9b25ff66dd1aff9f745fa0fa08e7130c942aec86 (patch)
tree7101bb0f187b35cc9b93e5c69a261c46c6e51b25 /runtime
parent0a1544d2fd63d8101dc7d50974e65c95a0f6f98d (diff)
downloadllvm-9b25ff66dd1aff9f745fa0fa08e7130c942aec86.tar.gz
llvm-9b25ff66dd1aff9f745fa0fa08e7130c942aec86.tar.bz2
llvm-9b25ff66dd1aff9f745fa0fa08e7130c942aec86.tar.xz
PGO: allows the profile data file name to be specified by the LLVMPROF_OUTPUT
environment variable. This allows parallel make for profiling code, without it there are file collisions as each parallel run uses the default file name. There is already code in the runtime library to specify the output file name via the command line, but this only works for programs which already process argc/argv. This patch builds on that support. Patch by Alastair Murray. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167269 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'runtime')
-rw-r--r--runtime/libprofile/CommonProfiling.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/runtime/libprofile/CommonProfiling.c b/runtime/libprofile/CommonProfiling.c
index acc17ce11e..058270b2fd 100644
--- a/runtime/libprofile/CommonProfiling.c
+++ b/runtime/libprofile/CommonProfiling.c
@@ -28,14 +28,35 @@
static char *SavedArgs = 0;
static unsigned SavedArgsLength = 0;
+static const char *SavedEnvVar = 0;
static const char *OutputFilename = "llvmprof.out";
+/* check_environment_variable - Check to see if the LLVMPROF_OUTPUT environment
+ * variable is set. If it is then save it and set OutputFilename.
+ */
+static void check_environment_variable(void) {
+ if (SavedEnvVar) return; /* Guarantee that we can't leak memory. */
+
+ const char *EnvVar = getenv("LLVMPROF_OUTPUT");
+ if (EnvVar) {
+ /* The string that getenv returns is allowed to be statically allocated,
+ * which means it may be changed by future calls to getenv, so copy it.
+ */
+ SavedEnvVar = strdup(EnvVar);
+ OutputFilename = SavedEnvVar;
+ }
+}
+
/* save_arguments - Save argc and argv as passed into the program for the file
* we output.
+ * If either the LLVMPROF_OUTPUT environment variable or the -llvmprof-output
+ * command line argument are set then change OutputFilename to the provided
+ * value. The command line argument value overrides the environment variable.
*/
int save_arguments(int argc, const char **argv) {
unsigned Length, i;
+ if (!SavedEnvVar && !SavedArgs) check_environment_variable();
if (SavedArgs || !argv) return argc; /* This can be called multiple times */
/* Check to see if there are any arguments passed into the program for the
@@ -54,6 +75,7 @@ int save_arguments(int argc, const char **argv) {
puts("-llvmprof-output requires a filename argument!");
else {
OutputFilename = strdup(argv[1]);
+ if (SavedEnvVar) { free((void *)SavedEnvVar); SavedEnvVar = 0; }
memmove((char**)&argv[1], &argv[2], (argc-1)*sizeof(char*));
--argc;
}