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