[compiler-rt] 0f6220d - [profile] Move __llvm_profile_raw_version into a separate file

Min-Yih Hsu via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 16 16:02:36 PDT 2020


Author: Min-Yih Hsu
Date: 2020-07-16T16:02:04-07:00
New Revision: 0f6220ddd6c751ff83fa1afe464ff0737ab0bf07

URL: https://github.com/llvm/llvm-project/commit/0f6220ddd6c751ff83fa1afe464ff0737ab0bf07
DIFF: https://github.com/llvm/llvm-project/commit/0f6220ddd6c751ff83fa1afe464ff0737ab0bf07.diff

LOG: [profile] Move __llvm_profile_raw_version into a separate file

Similar to the reason behind moving __llvm_profile_filename into a
separate file[1]. When users try to use Full LTO with BFD linker to
generate IR level PGO profile, the __llvm_profile_raw_version variable,
which is used for marking instrumentation level, generated by frontend
would somehow conflict with the weak symbol provided by profiling
runtime.

In most of the cases, BFD linkers will pick profiling runtime's weak symbol
as the real definition and thus generate the incorrect instrumentation
level metadata in the final executables.

Moving __llvm_profile_raw_version into a separate file would make
linkers not seeing the weak symbol in the archive unless the frontend
doesn't generate one.

[1] https://reviews.llvm.org/D34797

Differential Revision: https://reviews.llvm.org/D83967

Added: 
    compiler-rt/lib/profile/InstrProfilingVersionVar.c
    compiler-rt/test/profile/instrprof-lto-pgogen.c

Modified: 
    compiler-rt/lib/profile/CMakeLists.txt
    compiler-rt/lib/profile/InstrProfiling.c

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/profile/CMakeLists.txt b/compiler-rt/lib/profile/CMakeLists.txt
index ece674b2daa1..63532b72ff82 100644
--- a/compiler-rt/lib/profile/CMakeLists.txt
+++ b/compiler-rt/lib/profile/CMakeLists.txt
@@ -59,6 +59,7 @@ set(PROFILE_SOURCES
   InstrProfilingMerge.c
   InstrProfilingMergeFile.c
   InstrProfilingNameVar.c
+  InstrProfilingVersionVar.c
   InstrProfilingWriter.c
   InstrProfilingPlatformDarwin.c
   InstrProfilingPlatformFuchsia.c

diff  --git a/compiler-rt/lib/profile/InstrProfiling.c b/compiler-rt/lib/profile/InstrProfiling.c
index 31a9fe996293..92ad25f62cd1 100644
--- a/compiler-rt/lib/profile/InstrProfiling.c
+++ b/compiler-rt/lib/profile/InstrProfiling.c
@@ -18,8 +18,6 @@
 #include "profile/InstrProfData.inc"
 
 
-COMPILER_RT_WEAK uint64_t INSTR_PROF_RAW_VERSION_VAR = INSTR_PROF_RAW_VERSION;
-
 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);

diff  --git a/compiler-rt/lib/profile/InstrProfilingVersionVar.c b/compiler-rt/lib/profile/InstrProfilingVersionVar.c
new file mode 100644
index 000000000000..a6f222150794
--- /dev/null
+++ b/compiler-rt/lib/profile/InstrProfilingVersionVar.c
@@ -0,0 +1,17 @@
+/*===- InstrProfilingVersionVar.c - profile version variable setup  -------===*\
+|*
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+|* See https://llvm.org/LICENSE.txt for license information.
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+|*
+\*===----------------------------------------------------------------------===*/
+
+#include "InstrProfiling.h"
+
+/* uint64 __llvm_profile_raw_version
+ *
+ * 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 uint64_t INSTR_PROF_RAW_VERSION_VAR = INSTR_PROF_RAW_VERSION;

diff  --git a/compiler-rt/test/profile/instrprof-lto-pgogen.c b/compiler-rt/test/profile/instrprof-lto-pgogen.c
new file mode 100644
index 000000000000..0abae0d7b4c2
--- /dev/null
+++ b/compiler-rt/test/profile/instrprof-lto-pgogen.c
@@ -0,0 +1,12 @@
+// REQUIRES: lto
+
+// RUN: %clang_pgogen=%t.profraw -flto %s -o %t
+// RUN: %run %t
+// RUN: llvm-profdata merge %t.profraw -o %t.profdata
+// RUN: llvm-profdata show %t.profdata | FileCheck %s
+
+// Testing a bug that happens when trying to generate IR
+// profile with BFD linker + LTO plugin
+
+// CHECK: Instrumentation level: IR
+int main() { return 0; }


        


More information about the llvm-commits mailing list