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