diff options
Diffstat (limited to 'test/profile/Inputs/instrprof-value-prof-visibility.c')
-rw-r--r-- | test/profile/Inputs/instrprof-value-prof-visibility.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/test/profile/Inputs/instrprof-value-prof-visibility.c b/test/profile/Inputs/instrprof-value-prof-visibility.c new file mode 100644 index 000000000..e691a2d95 --- /dev/null +++ b/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; +} |