[PATCH] D34797: [profile] Move __llvm_profile_filename into a separate object
Vedant Kumar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 28 18:26:37 PDT 2017
vsk created this revision.
Herald added a subscriber: mgorny.
Users can specify the path a raw profile is written to by passing
-fprofile-instr-generate=<path>, but this functionality broke on Darwin
after __llvm_profile_filename was made weak [1], resulting in profiles
being written to "default.profraw" even when <path> is specified.
The situation is that instrumented programs provide a weak definition of
__llvm_profile_filename, which conflicts with a weak redefinition
provided by the profiling runtime.
The linker appears to pick the 'winning' definition arbitrarily: on
Darwin, it usually prefers the larger definition, which is probably why
the instrprof-override-filename.c test has been passing.
The fix is to move the runtime's definition into a separate object file
within the archive. This means that the linker won't "see" the runtime's
definition unless the user program has not provided one. I couldn't
think of a great way to test this other than to mimic the Darwin
failure: use -fprofile-instr-generate=<some-small-path>.
Testing: check-{clang,profile}, modified instrprof-override-filename.c.
[1] [Profile] deprecate __llvm_profile_override_default_filename
https://reviews.llvm.org/D22613
https://reviews.llvm.org/D22614
https://reviews.llvm.org/D34797
Files:
lib/profile/CMakeLists.txt
lib/profile/InstrProfiling.c
lib/profile/InstrProfilingNameVar.c
test/profile/instrprof-override-filename.c
Index: test/profile/instrprof-override-filename.c
===================================================================
--- test/profile/instrprof-override-filename.c
+++ test/profile/instrprof-override-filename.c
@@ -1,6 +1,8 @@
-// RUN: %clang_profgen=%t.profraw -o %t -O3 %s
-// RUN: %run %t %t.profraw
-// RUN: llvm-profdata merge -o %t.profdata %t.profraw
+// RUN: rm -rf %t.dir && mkdir -p %t.dir
+// RUN: cd %t.dir
+// RUN: %clang_profgen=P_RAW -o %t -O3 %s
+// RUN: %run %t P_RAW
+// RUN: llvm-profdata merge -o %t.profdata P_RAW
// RUN: %clang_profuse=%t.profdata -o - -S -emit-llvm %s | FileCheck %s
void bar() {}
Index: lib/profile/InstrProfilingNameVar.c
===================================================================
--- /dev/null
+++ lib/profile/InstrProfilingNameVar.c
@@ -0,0 +1,18 @@
+//===- InstrProfilingNameVar.c - profile name variable setup --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "InstrProfiling.h"
+
+/* char __llvm_profile_filename[1]
+ *
+ * The runtime should only provide its own definition of this symbol when the
+ * user has not specified one. Set this up by moving the runtime's copy of this
+ * symbol to an object file within the archive.
+ */
+COMPILER_RT_WEAK char INSTR_PROF_PROFILE_NAME_VAR[1] = {0};
Index: lib/profile/InstrProfiling.c
===================================================================
--- lib/profile/InstrProfiling.c
+++ lib/profile/InstrProfiling.c
@@ -19,8 +19,6 @@
COMPILER_RT_WEAK uint64_t INSTR_PROF_RAW_VERSION_VAR = INSTR_PROF_RAW_VERSION;
-COMPILER_RT_WEAK char INSTR_PROF_PROFILE_NAME_VAR[1] = {0};
-
COMPILER_RT_VISIBILITY uint64_t __llvm_profile_get_magic(void) {
return sizeof(void *) == sizeof(uint64_t) ? (INSTR_PROF_RAW_MAGIC_64)
: (INSTR_PROF_RAW_MAGIC_32);
Index: lib/profile/CMakeLists.txt
===================================================================
--- lib/profile/CMakeLists.txt
+++ lib/profile/CMakeLists.txt
@@ -48,6 +48,7 @@
InstrProfilingFile.c
InstrProfilingMerge.c
InstrProfilingMergeFile.c
+ InstrProfilingNameVar.c
InstrProfilingWriter.c
InstrProfilingPlatformDarwin.c
InstrProfilingPlatformLinux.c
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34797.104575.patch
Type: text/x-patch
Size: 2433 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170629/5122ca7b/attachment.bin>
More information about the llvm-commits
mailing list