int main(int argc, const char *argv[]) { int i; if (argc < 2) return 1; const char *FileN = argv[1]; __llvm_profile_set_filename(FileN); /* Start profiling. */ __llvm_profile_reset_counters(); foo(1); /* End profiling by freezing counters and * dump them to the file. */ if (__llvm_profile_write_file()) return 1; /* Read profile data into buffer. */ FILE *File = fopen(FileN, "r"); if (!File) return 1; fseek(File, 0, SEEK_END); uint64_t Size = ftell(File); fseek(File, 0, SEEK_SET); char *Buffer = (char *)malloc(Size); if (Size != fread(Buffer, 1, Size, File)) return 1; fclose(File); /* Its profile will be discarded. */ for (i = 0; i < 10; i++) bar(); /* Start profiling again and merge in previously saved counters in buffer. */ __llvm_profile_reset_counters(); __llvm_profile_merge_from_buffer(Buffer, Size); foo(2); /* End profiling. */ truncate(FileN, 0); if (__llvm_profile_write_file()) return 1; /* Its profile will be discarded. */ bar(); return 0; }
/* Returns 0 (size) when an error occurs. */ uint64_t libEntry(char *Buffer, uint64_t MaxSize) { uint64_t Size = __llvm_profile_get_size_for_buffer(); if (Size > MaxSize) return 0; __llvm_profile_reset_counters(); bar('1'); if (__llvm_profile_write_buffer(Buffer)) return 0; /* Now check compatibility. Should return 0. */ if (__llvm_profile_check_compatibility(Buffer, Size)) return 0; return Size; }
int main(void) { foo(0); __llvm_profile_reset_counters(); foo(1); return 0; }