summaryrefslogtreecommitdiffstats
path: root/compiler-rt/test
diff options
context:
space:
mode:
authorAna Pazos <apazos@quicinc.com>2019-02-14 21:38:40 +0000
committerAna Pazos <apazos@quicinc.com>2019-02-14 21:38:40 +0000
commitbbb8129b2cdd456d54a4d8cd26550706bc5105d4 (patch)
treea9753b8781c498ab22304e4a06654cb361ab68f3 /compiler-rt/test
parent48d680dd5667ee35b85df7ca4b93933d370578bc (diff)
downloadbcm5719-llvm-bbb8129b2cdd456d54a4d8cd26550706bc5105d4.tar.gz
bcm5719-llvm-bbb8129b2cdd456d54a4d8cd26550706bc5105d4.zip
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 llvm-svn: 354064
Diffstat (limited to 'compiler-rt/test')
-rw-r--r--compiler-rt/test/profile/Inputs/instrprof-value-prof-visibility.c60
-rw-r--r--compiler-rt/test/profile/Linux/instrprof-value-prof-visibility.test6
2 files changed, 66 insertions, 0 deletions
diff --git a/compiler-rt/test/profile/Inputs/instrprof-value-prof-visibility.c b/compiler-rt/test/profile/Inputs/instrprof-value-prof-visibility.c
new file mode 100644
index 00000000000..e691a2d9591
--- /dev/null
+++ b/compiler-rt/test/profile/Inputs/instrprof-value-prof-visibility.c
@@ -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;
+}
diff --git a/compiler-rt/test/profile/Linux/instrprof-value-prof-visibility.test b/compiler-rt/test/profile/Linux/instrprof-value-prof-visibility.test
new file mode 100644
index 00000000000..5b64a94a2f0
--- /dev/null
+++ b/compiler-rt/test/profile/Linux/instrprof-value-prof-visibility.test
@@ -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
+
OpenPOWER on IntegriCloud