aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/profile/InstrProfiling.h15
-rw-r--r--lib/profile/InstrProfilingFile.c11
-rw-r--r--test/profile/Inputs/instrprof-get-filename-dso.c5
-rw-r--r--test/profile/Posix/instrprof-set-filename-shared.test8
-rw-r--r--test/profile/instrprof-get-filename-merge-mode.c18
5 files changed, 39 insertions, 18 deletions
diff --git a/lib/profile/InstrProfiling.h b/lib/profile/InstrProfiling.h
index d9f0b0bfc..ffc439616 100644
--- a/lib/profile/InstrProfiling.h
+++ b/lib/profile/InstrProfiling.h
@@ -155,6 +155,10 @@ int __llvm_orderfile_dump(void);
*
* \c Name is not copied, so it must remain valid. Passing NULL resets the
* filename logic to the default behaviour.
+ *
+ * Note: There may be multiple copies of the profile runtime (one for each
+ * instrumented image/DSO). This API only modifies the filename within the
+ * copy of the runtime available to the calling image.
*/
void __llvm_profile_set_filename(const char *Name);
@@ -173,6 +177,10 @@ void __llvm_profile_set_filename(const char *Name);
* 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).
+ *
+ * Note: There may be multiple copies of the profile runtime (one for each
+ * instrumented image/DSO). This API only modifies the file object within the
+ * copy of the runtime available to the calling image.
*/
void __llvm_profile_set_file_object(FILE *File, int EnableMerge);
@@ -196,7 +204,12 @@ const char *__llvm_profile_get_path_prefix();
* \brief Return filename (including path) of the profile data. Note that if the
* user calls __llvm_profile_set_filename later after invoking this interface,
* the actual file name may differ from what is returned here.
- * Side-effect: this API call will invoke malloc with dynamic memory allocation.
+ * Side-effect: this API call will invoke malloc with dynamic memory allocation
+ * (the returned pointer must be passed to `free` to avoid a leak).
+ *
+ * Note: There may be multiple copies of the profile runtime (one for each
+ * instrumented image/DSO). This API only retrieves the filename from the copy
+ * of the runtime available to the calling image.
*/
const char *__llvm_profile_get_filename();
diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c
index e7996e282..1b253c3e8 100644
--- a/lib/profile/InstrProfilingFile.c
+++ b/lib/profile/InstrProfilingFile.c
@@ -70,7 +70,6 @@ typedef struct lprofFilename {
* by runtime. */
unsigned OwnsFilenamePat;
const char *ProfilePathPrefix;
- const char *Filename;
char PidChars[MAX_PID_SIZE];
char Hostname[COMPILER_RT_MAX_HOSTLEN];
unsigned NumPids;
@@ -86,8 +85,8 @@ typedef struct lprofFilename {
ProfileNameSpecifier PNS;
} lprofFilename;
-COMPILER_RT_WEAK lprofFilename lprofCurFilename = {0, 0, 0, 0, {0},
- {0}, 0, 0, 0, PNS_unknown};
+static lprofFilename lprofCurFilename = {0, 0, 0, {0}, {0},
+ 0, 0, 0, PNS_unknown};
static int ProfileMergeRequested = 0;
static int isProfileMergeRequested() { return ProfileMergeRequested; }
@@ -387,8 +386,6 @@ static int parseFilenamePattern(const char *FilenamePat,
/* Clean up cached prefix and filename. */
if (lprofCurFilename.ProfilePathPrefix)
free((void *)lprofCurFilename.ProfilePathPrefix);
- if (lprofCurFilename.Filename)
- free((void *)lprofCurFilename.Filename);
if (lprofCurFilename.FilenamePat && lprofCurFilename.OwnsFilenamePat) {
free((void *)lprofCurFilename.FilenamePat);
@@ -602,9 +599,6 @@ const char *__llvm_profile_get_filename(void) {
char *FilenameBuf;
const char *Filename;
- if (lprofCurFilename.Filename)
- return lprofCurFilename.Filename;
-
Length = getCurFilenameLength();
FilenameBuf = (char *)malloc(Length + 1);
if (!FilenameBuf) {
@@ -615,7 +609,6 @@ const char *__llvm_profile_get_filename(void) {
if (!Filename)
return "\0";
- lprofCurFilename.Filename = FilenameBuf;
return FilenameBuf;
}
diff --git a/test/profile/Inputs/instrprof-get-filename-dso.c b/test/profile/Inputs/instrprof-get-filename-dso.c
new file mode 100644
index 000000000..270943400
--- /dev/null
+++ b/test/profile/Inputs/instrprof-get-filename-dso.c
@@ -0,0 +1,5 @@
+const char *__llvm_profile_get_filename(void);
+
+const char *get_filename_from_DSO(void) {
+ return __llvm_profile_get_filename();
+}
diff --git a/test/profile/Posix/instrprof-set-filename-shared.test b/test/profile/Posix/instrprof-set-filename-shared.test
deleted file mode 100644
index 439c6c0dd..000000000
--- a/test/profile/Posix/instrprof-set-filename-shared.test
+++ /dev/null
@@ -1,8 +0,0 @@
-# Test that __llvm_profile_set_filename is honored by shared libary too.
-RUN: mkdir -p %t.d
-RUN: %clang_profgen=%t.shared.profraw -fPIC -shared -o %t.d/t.shared %S/../Inputs/instrprof-dlopen-func.c
-RUN: %clang_profgen -DCALL_SHARED -o %t.m -O3 -rpath %t.d %t.d/t.shared %S/../instrprof-set-filename.c
-RUN: %run %t.m %t.main.profraw
-RUN: llvm-profdata show %t.main.profraw | FileCheck --check-prefix=SHARED %s
-
-# SHARED: Total functions: 2
diff --git a/test/profile/instrprof-get-filename-merge-mode.c b/test/profile/instrprof-get-filename-merge-mode.c
new file mode 100644
index 000000000..c6e2fca22
--- /dev/null
+++ b/test/profile/instrprof-get-filename-merge-mode.c
@@ -0,0 +1,18 @@
+// Test __llvm_profile_get_filename when the on-line merging mode is enabled.
+//
+// RUN: %clang_pgogen -dynamiclib -o %t.dso %p/Inputs/instrprof-get-filename-dso.c
+// RUN: %clang_pgogen -o %t %s %t.dso
+// RUN: env LLVM_PROFILE_FILE="%t-%m.profraw" %run %t
+
+#include <string.h>
+
+const char *__llvm_profile_get_filename(void);
+extern const char *get_filename_from_DSO(void);
+
+int main(int argc, const char *argv[]) {
+ const char *filename1 = __llvm_profile_get_filename();
+ const char *filename2 = get_filename_from_DSO();
+
+ // Exit with code 1 if the two filenames are the same.
+ return strcmp(filename1, filename2) == 0;
+}