Index: lib/profile/InstrProfilingFile.c =================================================================== --- lib/profile/InstrProfilingFile.c +++ lib/profile/InstrProfilingFile.c @@ -278,7 +278,16 @@ fclose(File); } -static const char *DefaultProfileName = "default.profraw"; +const char *getFilenamePatDefault(void) { + const char* procname = getprogname(); + const pid_t pid = getpid(); + char* name; + asprintf(&name, "%s.%d.profraw", procname, pid); + return name; +} + + +static const char *DefaultProfileName; // = getFilenamePatDefault(); //"default.profraw"; static void resetFilenameToDefault(void) { if (lprofCurFilename.FilenamePat && lprofCurFilename.OwnsFilenamePat) { free((void *)lprofCurFilename.FilenamePat); @@ -515,6 +524,8 @@ const char *EnvFilenamePat; const char *SelectedPat = NULL; ProfileNameSpecifier PNS = PNS_unknown; + if (!DefaultProfileName) + DefaultProfileName = getFilenamePatDefault(); int hasCommandLineOverrider = (INSTR_PROF_PROFILE_NAME_VAR[0] != 0); EnvFilenamePat = getFilenamePatFromEnv(); Index: test/profile/Inputs/instrprof-multi-process-child.c =================================================================== --- /dev/null +++ test/profile/Inputs/instrprof-multi-process-child.c @@ -0,0 +1,3 @@ +int main() { + return 0; +} Index: test/profile/Inputs/instrprof-multi-process-parent.c =================================================================== --- /dev/null +++ test/profile/Inputs/instrprof-multi-process-parent.c @@ -0,0 +1,14 @@ +#include +#include +#include +#include + +int main(int argc, char* argv[]) { + char *cmd; + asprintf(&cmd, "%s/child", dirname(argv[0])); + if (fork() == 0) { + system(cmd); + } + + return 0; +} Index: test/profile/instrprof-multi-process.test =================================================================== --- /dev/null +++ test/profile/instrprof-multi-process.test @@ -0,0 +1,8 @@ +# Test that profiler works with applications running multiple processes. +RUN: rm -rf %t.d +RUN: mkdir -p %t.d +RUN: %clang_profgen -O0 %S/Inputs/instrprof-multi-process-parent.c -o %t.d/parent +RUN: %clang_profgen -O0 %S/Inputs/instrprof-multi-process-child.c -o %t.d/child +RUN: %t.d/parent + +RUN: llvm-profdata merge -o %t.profdata parent.*.profraw child.*.profraw