[compiler-rt] r354064 - Set hidden attribute on lprofMergeValueProfData

Ana Pazos via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 14 13:38:40 PST 2019


Author: apazos
Date: Thu Feb 14 13:38:40 2019
New Revision: 354064

URL: http://llvm.org/viewvc/llvm-project?rev=354064&view=rev
Log:
Set hidden attribute on lprofMergeValueProfData

Summary:
The changes in https://reviews.llvm.org/D44847 cause load time failure
due to lprofMergeValueProfData in Android libs enabled with profile generation:

"dlopen failed: cannot locate symbol "lprofMergeValueProfData" referenced by..."

Marking lprofMergeValueProfData as hidden so the correct in-module definition
 is picked by the linker.

Reviewers: davidxl

Reviewed By: davidxl

Subscribers: efriedma, xur, davidxl, llvm-commits

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

Added:
    compiler-rt/trunk/test/profile/Inputs/instrprof-value-prof-visibility.c
    compiler-rt/trunk/test/profile/Linux/instrprof-value-prof-visibility.test
Modified:
    compiler-rt/trunk/lib/profile/InstrProfilingMergeFile.c

Modified: compiler-rt/trunk/lib/profile/InstrProfilingMergeFile.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingMergeFile.c?rev=354064&r1=354063&r2=354064&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfilingMergeFile.c (original)
+++ compiler-rt/trunk/lib/profile/InstrProfilingMergeFile.c Thu Feb 14 13:38:40 2019
@@ -20,6 +20,7 @@
 
 /* Merge value profile data pointed to by SrcValueProfData into
  * in-memory profile counters pointed by to DstData.  */
+COMPILER_RT_VISIBILITY
 void lprofMergeValueProfData(ValueProfData *SrcValueProfData,
                              __llvm_profile_data *DstData) {
   unsigned I, S, V, DstIndex = 0;

Added: compiler-rt/trunk/test/profile/Inputs/instrprof-value-prof-visibility.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/Inputs/instrprof-value-prof-visibility.c?rev=354064&view=auto
==============================================================================
--- compiler-rt/trunk/test/profile/Inputs/instrprof-value-prof-visibility.c (added)
+++ compiler-rt/trunk/test/profile/Inputs/instrprof-value-prof-visibility.c Thu Feb 14 13:38:40 2019
@@ -0,0 +1,60 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef DLOPEN_FUNC_DIR
+#include <dlfcn.h>
+#endif
+
+int __llvm_profile_runtime = 0;
+int __llvm_profile_write_file();
+void __llvm_profile_reset_counters(void);
+void __llvm_profile_initialize_file(void);
+struct __llvm_profile_data;
+struct ValueProfData;
+void lprofMergeValueProfData(struct ValueProfData *, struct __llvm_profile_data *);
+/* Force the vp merger module to be linked in.  */
+void *Dummy = &lprofMergeValueProfData;
+
+void callee1() {}
+void callee2() {}
+
+typedef void (*FP)(void);
+FP Fps[2] = {callee1, callee2};
+
+int main(int argc, char *argv[]) {
+  __llvm_profile_initialize_file();
+  __llvm_profile_write_file();
+  __llvm_profile_reset_counters();
+
+#ifdef DLOPEN_FUNC_DIR
+  void *Handle = dlopen(DLOPEN_FUNC_DIR "/func.shared", RTLD_NOW);
+  if (!Handle) {
+    fprintf(stderr, "unable to open '" DLOPEN_FUNC_DIR "/func.shared': %s\n",
+            dlerror());
+    return EXIT_FAILURE;
+  }
+
+  // This tests that lprofMergeValueProfData is not accessed
+  // from outside a module
+  void (*SymHandle)(struct ValueProfData *, struct __llvm_profile_data *) =
+      (void (*)(struct ValueProfData *, struct __llvm_profile_data *))dlsym(
+          Handle, "lprofMergeValueProfData");
+  if (SymHandle) {
+    fprintf(stderr,
+            "should not be able to lookup symbol 'lprofMergeValueProfData': %s\n",
+            dlerror());
+    return EXIT_FAILURE;
+  }
+
+  dlclose(Handle);
+
+#endif
+
+  Fps[0]();
+  Fps[1]();
+
+  __llvm_profile_write_file();
+  __llvm_profile_reset_counters();
+
+  return EXIT_SUCCESS;
+}

Added: compiler-rt/trunk/test/profile/Linux/instrprof-value-prof-visibility.test
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/Linux/instrprof-value-prof-visibility.test?rev=354064&view=auto
==============================================================================
--- compiler-rt/trunk/test/profile/Linux/instrprof-value-prof-visibility.test (added)
+++ compiler-rt/trunk/test/profile/Linux/instrprof-value-prof-visibility.test Thu Feb 14 13:38:40 2019
@@ -0,0 +1,6 @@
+# This tests that lprofMergeValueProfData is not accessed from outside a module
+RUN: mkdir -p %t.d
+RUN: %clang_profgen -o %t.d/func.shared -fPIC -shared -fuse-ld=gold -mllvm --enable-value-profiling=true %S/../Inputs/instrprof-value-prof-visibility.c -fdata-sections -ffunction-sections -fuse-ld=gold -Wl,--gc-sections
+RUN: %clang_profgen -o %t.d/main -fuse-ld=gold -mllvm --enable-value-profiling=true  -DDLOPEN_FUNC_DIR=\"%t.d\" %S/../Inputs/instrprof-value-prof-visibility.c -fdata-sections -ffunction-sections -fuse-ld=gold -Wl,--gc-sections
+RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t.d/main
+




More information about the llvm-commits mailing list