#include #include #include #ifdef DLOPEN_FUNC_DIR #include #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; }