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