xref: /llvm-project/compiler-rt/test/profile/Inputs/instrprof-value-prof-visibility.c (revision bbb8129b2cdd456d54a4d8cd26550706bc5105d4)
1*bbb8129bSAna Pazos #include <stdio.h>
2*bbb8129bSAna Pazos #include <stdlib.h>
3*bbb8129bSAna Pazos #include <string.h>
4*bbb8129bSAna Pazos #ifdef DLOPEN_FUNC_DIR
5*bbb8129bSAna Pazos #include <dlfcn.h>
6*bbb8129bSAna Pazos #endif
7*bbb8129bSAna Pazos 
8*bbb8129bSAna Pazos int __llvm_profile_runtime = 0;
9*bbb8129bSAna Pazos int __llvm_profile_write_file();
10*bbb8129bSAna Pazos void __llvm_profile_reset_counters(void);
11*bbb8129bSAna Pazos void __llvm_profile_initialize_file(void);
12*bbb8129bSAna Pazos struct __llvm_profile_data;
13*bbb8129bSAna Pazos struct ValueProfData;
14*bbb8129bSAna Pazos void lprofMergeValueProfData(struct ValueProfData *, struct __llvm_profile_data *);
15*bbb8129bSAna Pazos /* Force the vp merger module to be linked in.  */
16*bbb8129bSAna Pazos void *Dummy = &lprofMergeValueProfData;
17*bbb8129bSAna Pazos 
callee1()18*bbb8129bSAna Pazos void callee1() {}
callee2()19*bbb8129bSAna Pazos void callee2() {}
20*bbb8129bSAna Pazos 
21*bbb8129bSAna Pazos typedef void (*FP)(void);
22*bbb8129bSAna Pazos FP Fps[2] = {callee1, callee2};
23*bbb8129bSAna Pazos 
main(int argc,char * argv[])24*bbb8129bSAna Pazos int main(int argc, char *argv[]) {
25*bbb8129bSAna Pazos   __llvm_profile_initialize_file();
26*bbb8129bSAna Pazos   __llvm_profile_write_file();
27*bbb8129bSAna Pazos   __llvm_profile_reset_counters();
28*bbb8129bSAna Pazos 
29*bbb8129bSAna Pazos #ifdef DLOPEN_FUNC_DIR
30*bbb8129bSAna Pazos   void *Handle = dlopen(DLOPEN_FUNC_DIR "/func.shared", RTLD_NOW);
31*bbb8129bSAna Pazos   if (!Handle) {
32*bbb8129bSAna Pazos     fprintf(stderr, "unable to open '" DLOPEN_FUNC_DIR "/func.shared': %s\n",
33*bbb8129bSAna Pazos             dlerror());
34*bbb8129bSAna Pazos     return EXIT_FAILURE;
35*bbb8129bSAna Pazos   }
36*bbb8129bSAna Pazos 
37*bbb8129bSAna Pazos   // This tests that lprofMergeValueProfData is not accessed
38*bbb8129bSAna Pazos   // from outside a module
39*bbb8129bSAna Pazos   void (*SymHandle)(struct ValueProfData *, struct __llvm_profile_data *) =
40*bbb8129bSAna Pazos       (void (*)(struct ValueProfData *, struct __llvm_profile_data *))dlsym(
41*bbb8129bSAna Pazos           Handle, "lprofMergeValueProfData");
42*bbb8129bSAna Pazos   if (SymHandle) {
43*bbb8129bSAna Pazos     fprintf(stderr,
44*bbb8129bSAna Pazos             "should not be able to lookup symbol 'lprofMergeValueProfData': %s\n",
45*bbb8129bSAna Pazos             dlerror());
46*bbb8129bSAna Pazos     return EXIT_FAILURE;
47*bbb8129bSAna Pazos   }
48*bbb8129bSAna Pazos 
49*bbb8129bSAna Pazos   dlclose(Handle);
50*bbb8129bSAna Pazos 
51*bbb8129bSAna Pazos #endif
52*bbb8129bSAna Pazos 
53*bbb8129bSAna Pazos   Fps[0]();
54*bbb8129bSAna Pazos   Fps[1]();
55*bbb8129bSAna Pazos 
56*bbb8129bSAna Pazos   __llvm_profile_write_file();
57*bbb8129bSAna Pazos   __llvm_profile_reset_counters();
58*bbb8129bSAna Pazos 
59*bbb8129bSAna Pazos   return EXIT_SUCCESS;
60*bbb8129bSAna Pazos }
61