1c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <stdint.h>
2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <stdlib.h>
3c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <string.h>
4c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
5c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint __llvm_profile_runtime = 0;
6c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainaruint64_t __llvm_profile_get_size_for_buffer(void);
7c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint __llvm_profile_write_buffer(char *);
8c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid __llvm_profile_reset_counters(void);
9c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint  __llvm_profile_check_compatibility(const char *, uint64_t);
10c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
11c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint g = 0;
12c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid foo(char c) {
13c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (c == '1')
14c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    g++;
15c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  else
16c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    g--;
17c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
18c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
19c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarextern uint64_t libEntry(char *Buffer, uint64_t MaxSize);
20c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
21c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint main(int argc, const char *argv[]) {
22c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  const uint64_t MaxSize = 10000;
23c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  static char Buffer[MaxSize];
24c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
25c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  uint64_t Size = __llvm_profile_get_size_for_buffer();
26c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (Size > MaxSize)
27c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
28c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
29c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  __llvm_profile_reset_counters();
30c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  foo('0');
31c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
32c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (__llvm_profile_write_buffer(Buffer))
33c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
34c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
35c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Now check compatibility. Should return 0.  */
36c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (__llvm_profile_check_compatibility(Buffer, Size))
37c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
38c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
39c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Clear the buffer. */
40c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  memset(Buffer, 0, MaxSize);
41c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
42c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Collect profile from shared library.  */
43c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  Size = libEntry(Buffer, MaxSize);
44c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
45c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (!Size)
46c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
47c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
48c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Shared library's profile should not match main executable's. */
49c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (!__llvm_profile_check_compatibility(Buffer, Size))
50c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
51c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
52c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  return 0;
53c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
54c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
55